何时在Python中使用“while”或“for”

51 投票
10 回答
174788 浏览
提问于 2025-04-15 11:53

我什么时候应该在Python中使用while循环或者for循环呢?看起来大家更喜欢用for循环(可能是因为简洁吧?)。有没有什么特定的情况我应该选择其中一个呢?这是不是个人喜好的问题?我读过的代码让我觉得它们之间有很大的区别。

10 个回答

18

使用for循环来遍历列表是更符合Python风格的选择,因为它更简单,也更容易理解。

比如说,下面这个:

for i in range(11):
    print i

比下面这个要简单得多,也更容易看懂:

i = 0
while i <= 10:
    print i
    i = i + 1
24

while 循环在一些情况下很有用,特别是当你停止循环的条件不依赖于任何特定的顺序时。比如说,考虑一些不可预测的互动:

while user_is_sleeping():
    wait()

当然,你可以写一个合适的迭代器来封装这个动作,然后通过 for 循环来访问它——但这样做真的能提高可读性吗?¹

在 Python 中,其他情况下最好使用 for 循环(或者使用合适的高阶函数来封装循环)。

¹ 假设 user_is_sleeping 函数在用户没有睡觉时返回 False,那么这个示例代码可以重写成以下的 for 循环:

for _ in iter(user_is_sleeping, False):
    wait()
92

是的,whilefor之间有很大的区别。

for语句是用来遍历一个集合、可迭代对象或者生成器函数的。

while语句则是不断循环,直到某个条件变成假。

这不是个人喜好,而是看你用的数据结构是什么。

通常,我们想处理的值会表示成一个range(实际的列表)或者xrange(生成这些值的)。(编辑:在Python 3中,range现在是一个生成器,表现得像以前的xrange函数,而xrange在Python 3中已经被移除。)这给了我们一个非常适合for语句的数据结构。

不过,通常情况下,我们会有现成的集合:比如集合、元组、列表、映射,甚至字符串,这些都是可迭代的集合,所以我们直接用for循环就可以了。

在少数情况下,我们可能想要一些函数式编程的处理,这时可以在迭代的过程中应用这些转换。sortedenumerate函数就是在可迭代对象上进行转换,和for语句非常契合。

如果你没有一个整齐的数据结构可以遍历,或者没有一个生成器函数来驱动你的处理,那你就必须使用while

撰写回答