可能重复:
为什么要避免 while 循环?
我正在尝试通过学习 Python The Hard Way来学习 Python ,随着我的进步,我发现它在网站上提到,
仅使用 while 循环来永远循环,这意味着可能永远不会。这仅适用于 Python,其他语言不同。
现在我基本上是一名 Java 开发人员,这让我想知道为什么while
在 python 中应该避免使用它,尽管它在 Java 中被广泛使用。我一直无法在互联网上找到任何答案。
可能重复:
为什么要避免 while 循环?
我正在尝试通过学习 Python The Hard Way来学习 Python ,随着我的进步,我发现它在网站上提到,
仅使用 while 循环来永远循环,这意味着可能永远不会。这仅适用于 Python,其他语言不同。
现在我基本上是一名 Java 开发人员,这让我想知道为什么while
在 python 中应该避免使用它,尽管它在 Java 中被广泛使用。我一直无法在互联网上找到任何答案。
这种说法是非常主观的,我不确定我是否同意。while
在 Python 中使用无限循环很容易:
while True:
# do stuff
也许作者将其与 C 进行比较,C 中也很容易使用 for 进行无限循环:
for(;;)
/* do stuff */
对于 Python,真正不存在这样的相应构造。
话虽如此,有很多情况下无限循环很有用(在任何语言中) - 想想事件循环,或者可以通过无限循环来简化循环控制并且只有某些条件会导致break
.
您经常会处理诸如列表和字符串之类的序列,并且使用 for 循环将是一个自然的选择,但我不会仅仅因为这个而忽略 while 循环。
for
当您想要迭代一定次数时,它几乎是 Python 中的“默认”选择。例如:
for i in xrange(10):
#do stuff
#iterates 10 times
for an_element in a_collection:
#do stuff
#iterates over every element in a collection
#though generators can be "infinite"
但是,如果您想无限次循环代码,则while
循环更为惯用。
while a_boolean:
#do stuff
#iterates as long as a_boolean evaluates to True
while True:
#do stuff
#iterates till a break is encountered
由于您来自 Java 背景,while
因此 Python 中的循环与 Java 中的循环几乎相同,while
并且使用方式也几乎相同。Python 中的for
循环类似于:
for(Integer i : anArrayListOfIntegers){
//do stuff
}
for(int i=0;i<10;i++)
Python 中不存在该表单,而是使用range()/xrange()
第一个示例中的表单。也就是说,除了列表推导/生成器表达式等情况外,每个for
循环都可以替换为等效循环。while
就速度或内存使用而言,这样做没有真正的优点或缺点。然而,Python 程序员倾向于for
在迭代集合时使用,以及while
当他们想要在条件为真时或直到条件为真时进行迭代。如果你坚持这个一般的经验法则,你可能不会出错。
学习 Python The Hard Way 相当固执己见,所以我不认为这意味着你永远不应该使用while
. 我最好的猜测是,因为迭代器是 Python 中普遍存在的模式,所以大多数实际迭代都可以使用for..in
. Java 有使用的旧Iterator
模式while (it.hasNext()) { … }
,或类似的读取 JDBCResultSet
或从标准输入读取行的模式——所有这些都可以用for..in
Python 中的 a 来实现。(可行并且可以说应该这样做;for..in
更具可读性,并且yield
可以轻松编写常规可迭代对象,因此库没有理由不公开迭代器 API。)
没有什么鬼主意。事实上,while
它是 Python 中唯一的“经典”循环方式,因为for
它与foreach
其他语言中的类似(即遍历集合或迭代器的运算符)。
Python中的循环没有任何问题,while
当您不处理可迭代对象时,它就占有一席之地。
但是如果你正在处理一个可迭代的(并且这个概念在 Python 中非常普遍),for
循环总是更好的构造。
例如,在许多语言中,您会编写如下内容:
while(! file.EOF) {
...
}
在 Python 中,您使用:
for line in file:
do_something_with(line)