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

1 投票
2 回答
681 浏览
提问于 2025-04-15 21:19

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

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 个回答

3

澄清一下:你说的是 生成器表达式,而不是 生成器 -- 后者是一个函数定义,里面至少有一个 yield 语句。

我同意之前的说法……你几乎应该用 for 循环来处理所有事情。我很少用 while 循环,通常它们只用来做简单的计数或者让服务器一直运行下去。:-)

你也可以把生成器表达式放在和 for 循环同一行……

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

……因为生成器表达式不能被重复使用。不过,这样写起来不太容易读。而且,这样做也违背了这个练习的目的。为什么不直接遍历列表本身呢?

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

你已经用内存创建了列表;那为什么还要创建一个生成器表达式呢?这并不是必要的。

7

为什么要使用 while 循环呢?在 Python 中, for 循环其实是专门为这个设计的:

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

如果你在某种情况下被迫使用 while 循环,你现在的做法可能是你能做到的最好选择,但听起来有点笨重,是不是?

撰写回答