在Java中,我们可以像这样使用FOR循环
for (i = 0; i < 10; i += 1) {
}
然而,这在Python中是不可能的; FOR只能在“foreach”意义上使用,循环遍历可迭代中的每个元素。
为什么FOR循环的控件结构在Python中遗漏了?
答案 0 :(得分:8)
The Zen of Python说“应该有一个 - 最好只有一个 - 显而易见的方法。”Python已经有了这样做:
for i in xrange(10):
pass
如果你想明确所有部分,你也可以这样做:
for i in xrange(0, 10, 1):
pass
因为它已经有了“明显”的方法,所以添加另一种方式将是不合理的。 (那会是“nez”吗?)
(注意:在Python 3中,使用range
代替xrange
。)
C风格的for
循环具有更大的灵活性,但最终你可以用Python的while
(或者C while
编写一个等效的循环),这不仅触及“一个明显的方式”原则,还有“简单比复杂”等。这当然是品味问题 - 在这种情况下,Guido van Rossum的品味。
答案 1 :(得分:3)
由于这是可以追溯到Python 0.x迷雾的问题之一(事实上,最有可能是它的前身ABC),唯一能够真正回答的人是Guido,然后才会记得。你可以尝试让他在他的History of Python博客上写一篇文章。
但是,有一些很好的理由。
首先,只有一种形式的for
而不是两种不同的形式,使得语言更小,更容易学习和阅读人类,并且更容易解析计算机。
没有&#34; foreach&#34; -style for
循环导致许多逐个错误,并使许多简单的代码更加冗长。
没有C风格的for
循环会使一些已经非常复杂的for
循环变得更加复杂,因为强制它们是while
循环。它并不影响像你这样的简单循环,它可以写成&#34; foreach&#34;循环,如for i in range(10):
- 更简洁,更易读,更容易出错。*
当看这种方式时,选择是显而易见的。
*实际上,即使复杂的循环也可以通过迭代器转换为foreach循环。有时这是一个好主意。例如,for (int i=2; i=next_prime(i); i<1000000)
真的比for i in takewhile(lambda i: i<1000000, generate_primes()):
好吗?有一个原因,C ++逐渐增加了使后者成为可能的功能,以避免你可以轻易地用前者做出的错误...
答案 2 :(得分:1)
通常,迭代元素是更好的性能。您可以使用以下相同的结果:
for i in xrange(0, 20):
pass
你应该彻底阅读python的zed: http://www.python.org/dev/peps/pep-0020/
答案 3 :(得分:0)
因为它只是一个while循环的语法糖
i = 0
while i < 10:
# stuff
i += 1
如果您在C-style-for循环中从未遇到过一个错误,请举手。这么想。