如何正确定义和使用Python生成器

时间:2010-04-07 03:25:24

标签: python generator while-loop

我想从列表中定义一个生成器,它将一次输出一个元素,然后以适当的方式使用此生成器对象。

a = ["Hello", "world", "!"]
b = (x for x in a)
c = next(b, None)
while c != None:
    print c,
    c = next(b, None)

此处while方法有什么不对或可以改进吗?有没有办法避免在循环之前分配'c'?

谢谢!

2 个答案:

答案 0 :(得分:7)

为什么要使用while循环?在Python中,for循环绝对是为此设计的:

a = ["Hello", "world", "!"]
b = (x for x in a)
for c in b:
    print c,

如果你出于某种原因陷入while实施,你当前的实施可能是你能做的最好的,但它有点笨拙,你不觉得吗?

答案 1 :(得分:3)

澄清:你的意思是生成器表达式而不是生成器 - 后者是一个包含至少一个 yield 的函数定义语句/表达

同意早期的海报......你应该使用 for 循环几乎所有东西。我很少使用 while 循环,这些循环被降级为运行无限循环的简单计数器或服务器。 : - )

您也可以将genexp放在与 for 循环相同的一行...

a = ["Hello", "world", "!"]
for c in (x for x in a):
    print c,

...因为genexp不能重复使用。但是,它看起来并不可读。这也违背了这项工作的目的。为什么不只是迭代自己?

for c in ["Hello", "world", "!"]:
    print c,

你已经用完了内存来制作清单;为什么在不是nec时创建一个genexp?