为什么要避免使用while循环?

28 投票
13 回答
13253 浏览
提问于 2025-04-16 07:33

我现在学习Python已经有两周了,作为入门语言。在看Zed的《Learn Python the Hard Way》时,他提到:

在Python中,使用while循环的唯一理由是让它无限循环,而这意味着可能永远不会停止。这只适用于Python,其他语言可能不同。

我在网上查了很多资料,参考了各种信息,但就是找不到为什么在Python中会有这样的约定。它有什么特别之处吗?

十年前我放弃编程的时候,正在用VB编程,别人总是让我把For循环换成While循环。我当时水平不高(现在也是,不过那时候我写了很多代码),所以我只是听话,没有去质疑。现在我开始想这个问题了。这是速度问题吗?还是为了避免没有出口的无限循环?

13 个回答

9

Python的设计理念是:

应该有一种——最好只有一种——明显的方法来完成某件事。

(详细内容可以查看 https://www.python.org/dev/peps/pep-0020/)。

在大多数情况下,用Python做循环时,有比使用while循环更好的方法。

而且,至少在CPython中,其他类型的循环和迭代(我认为map和列表推导式也算是一种迭代)比while循环的性能更好。

举个例子:https://www.python.org/doc/essays/list2str

使用内置操作。map()中的隐式循环比显式的for循环要快;而带有显式循环计数器的while循环甚至更慢。

我不明白为什么你会被建议在VB中使用while循环而不是for循环——我觉得那样通常既不会让代码更易读,也不会让代码更快。

11

这是因为在你想要遍历(也就是一个一个处理)数据的情况下,Python可以帮你处理这些事情。比如说:

>>> mylist = [1,2,3,4,5,6,7]
>>> for item in mylist:
...     print item
... 
1
2
3
4
5
6
7

这里有一个用字典的类似例子:

>>> mydict = {1:'a', 2:'b', 3:'c', 4:'d'}
>>> for key in mydict:
...     print "%d->%s" % (key, mydict[key])
... 
1->a
2->b
3->c
4->d

在很多常见的使用场景中,使用while循环其实并不是必要的(而且也不算是“Python风格”)。


这里有一个来自邮件列表的帖子的比较,我觉得这个例子也很不错:

> 2. 我知道Perl不一样,但没有和while等价的东西
> ($line = <A_FILE>) { } ?

Python的'for'循环对“可迭代”的对象有内置的理解,这其中也包括文件。试试用:

for line in file:
    ...

这样就可以了。

27

我觉得这个建议不太好。当你在处理某种集合(比如列表、字典等)时,通常使用Python提供的迭代工具会更好,但这并不意味着使用while就一定是错的。有很多情况下,你并不是在遍历任何集合。

比如说:

def gcd(m, n):
    "Return the greatest common divisor of m and n."
    while n != 0:
        m, n = n, m % n
    return m

你可以把它改成:

def gcd(m, n):
    "Return the greatest common divisor of m and n."
    while True:
        if n == 0:
            return m
        m, n = n, m % n

但这真的算是改进吗?我觉得不一定。

撰写回答