为什么要避免使用while循环?
我现在学习Python已经有两周了,作为入门语言。在看Zed的《Learn Python the Hard Way》时,他提到:
在Python中,使用while循环的唯一理由是让它无限循环,而这意味着可能永远不会停止。这只适用于Python,其他语言可能不同。
我在网上查了很多资料,参考了各种信息,但就是找不到为什么在Python中会有这样的约定。它有什么特别之处吗?
十年前我放弃编程的时候,正在用VB编程,别人总是让我把For循环换成While循环。我当时水平不高(现在也是,不过那时候我写了很多代码),所以我只是听话,没有去质疑。现在我开始想这个问题了。这是速度问题吗?还是为了避免没有出口的无限循环?
13 个回答
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循环——我觉得那样通常既不会让代码更易读,也不会让代码更快。
这是因为在你想要遍历(也就是一个一个处理)数据的情况下,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: ...
这样就可以了。
我觉得这个建议不太好。当你在处理某种集合(比如列表、字典等)时,通常使用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
但这真的算是改进吗?我觉得不一定。