作为一门入门语言,我在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)
但这真的是一种改善吗?我想不是.
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'循环具有关于"可迭代"对象的内置知识,包括文件.尝试使用:
Run Code Online (Sandbox Code Playgroud)for line in file: ...应该做的伎俩.
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循环 - 我认为它通常既不会导致更好的可读性,也不会导致更快的代码.
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)
一旦你击中第一个非元音,就是一个无限循环。
| 归档时间: |
|
| 查看次数: |
6908 次 |
| 最近记录: |