为什么要避免while循环?

Ran*_*son 26 python

作为一门入门语言,我在Python学习中大约有两周的时间.我在Zed的"艰难学习Python"中提到了一点,他建议:

使用while循环只能永远循环,这意味着可能永远不会.这仅适用于Python,其他语言则不同.

我已经用Google搜索了所有内容,引用了我能做的一切,但我在世界上找不到任何理由为什么这会成为Python中的惯例.是什么让它与众不同?

当我在10年前放弃编程时,我在VB工作,并经常被告知摆脱我的For循环并使用While循环.我是一个黑客(就像我今天,虽然我当时写了很多代码),所以我只是做了我被告知的事情,而不是质疑它.好吧,现在我在质疑它.这是速度问题吗?是否只是为了避免逃避无限?

Gar*_*ees 23

这个建议对我来说似乎很糟糕.当你在迭代某种集合时,通常最好使用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
Run Code Online (Sandbox Code Playgroud)

您可以将其更改为:

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
Run Code Online (Sandbox Code Playgroud)

但这真的是一种改善吗?我想不是.

  • 但如果这就是他想说的话,那么他选择了一种非常误导的表达方式. (20认同)
  • 我没有读过这本书,但看起来好像至少有一位读者没有理解这种夸张,所以也许这不是一个很好的教学策略? (3认同)
  • @Paul:如果你曾经学过任何一门课程,你就会知道教师们提出过于简化的规则会有多么混乱,这些规则有明显的矛盾.它可以很容易地被教导,甚至没有显示while循环,或者稍后将它们留作更高级的主题,而不是引入相互矛盾的规则. (3认同)
  • Zed的建议仍然很合理.他试图得到的是,如果你正在使用while循环,那么确实就是这样的情况,而不是你在迭代迭代的更常见的情况.我们可以为'while`提供正确的用法直到奶牛回家,但事实是,它在惯用的python中远不如`for`. (2认同)

eld*_*his 10

这是因为在你想要迭代的典型情况下,python可以为你处理它.例如:

>>> mylist = [1,2,3,4,5,6,7]
>>> for item in mylist:
...     print item
... 
1
2
3
4
5
6
7
Run Code Online (Sandbox Code Playgroud)

与字典类似的例子:

>>> 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
Run Code Online (Sandbox Code Playgroud)

while在很多常见的使用场景中都不需要使用循环(并且不是"pythonic").


这是一个邮件列表帖子的比较,我也是一个很好的例子:

> 2.我知道Perl是不同的,但是没有相当于while
> ($line = <A_FILE>) { }

Python的'for'循环具有关于"可迭代"对象的内置知识,包括文件.尝试使用:

for line in file:
    ...
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.


Nub*_*bok 9

Python遵循的理念

应该有一个 - 最好只有一个 - 明显的方法来做到这一点.

(有关详细信息,请参阅https://www.python.org/dev/peps/pep-0020/).

在大多数情况下,使用Python进行迭代比使用while循环有更好的方法.

另外,至少CPython优化其他类型的循环和迭代(我认为map和list comprehension作为迭代类型)比while循环更好.

示例:https://www.python.org/doc/essays/list2str

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

我没有解释为什么你被告知使用while循环而不是VB中的for循环 - 我认为它通常既不会导致更好的可读性,也不会导致更快的代码.


Pau*_*McG 5

while 循环的一般问题是它很容易被忽略,或者以某种方式跳过循环变量递增的语句。即使是 C 的 for 循环也会有这个问题——你可以for(int x=0; x<10;),尽管不太可能。但是 Python for 循环没有这样的问题,因为它负责为您推进迭代器。另一方面,while 循环迫使您实现永不失败的增量。

s = "ABCDEF"
i = 0
while (i < len(s)):
    if s[i] in "AEIOU":
        print s[i], 'is a vowel'
        i += 1
Run Code Online (Sandbox Code Playgroud)

一旦你击中第一个非元音,就是一个无限循环。