何时在Python中使用“while”或“for”
我什么时候应该在Python中使用while
循环或者for
循环呢?看起来大家更喜欢用for
循环(可能是因为简洁吧?)。有没有什么特定的情况我应该选择其中一个呢?这是不是个人喜好的问题?我读过的代码让我觉得它们之间有很大的区别。
10 个回答
使用for
循环来遍历列表是更符合Python风格的选择,因为它更简单,也更容易理解。
比如说,下面这个:
for i in range(11):
print i
比下面这个要简单得多,也更容易看懂:
i = 0
while i <= 10:
print i
i = i + 1
while
循环在一些情况下很有用,特别是当你停止循环的条件不依赖于任何特定的顺序时。比如说,考虑一些不可预测的互动:
while user_is_sleeping():
wait()
当然,你可以写一个合适的迭代器来封装这个动作,然后通过 for
循环来访问它——但这样做真的能提高可读性吗?¹
在 Python 中,其他情况下最好使用 for
循环(或者使用合适的高阶函数来封装循环)。
¹ 假设 user_is_sleeping
函数在用户没有睡觉时返回 False
,那么这个示例代码可以重写成以下的 for
循环:
for _ in iter(user_is_sleeping, False):
wait()
是的,while和for之间有很大的区别。
for语句是用来遍历一个集合、可迭代对象或者生成器函数的。
while语句则是不断循环,直到某个条件变成假。
这不是个人喜好,而是看你用的数据结构是什么。
通常,我们想处理的值会表示成一个range
(实际的列表)或者xrange
(生成这些值的)。(编辑:在Python 3中,range
现在是一个生成器,表现得像以前的xrange
函数,而xrange
在Python 3中已经被移除。)这给了我们一个非常适合for语句的数据结构。
不过,通常情况下,我们会有现成的集合:比如集合、元组、列表、映射,甚至字符串,这些都是可迭代的集合,所以我们直接用for循环就可以了。
在少数情况下,我们可能想要一些函数式编程的处理,这时可以在迭代的过程中应用这些转换。sorted
和enumerate
函数就是在可迭代对象上进行转换,和for语句非常契合。
如果你没有一个整齐的数据结构可以遍历,或者没有一个生成器函数来驱动你的处理,那你就必须使用while。