我试图理解python中yield / generator的使用。我想知道,如果给出一个数字列表(例如:[1, 2, 3, 4, 5, 6, 7, 8, 9]
),以下两个陈述是等价的。如果他们不是,那有什么区别?
x = (n for n in numbers)
return x
for n in numbers:
yield n
答案 0 :(得分:2)
据我所知,他们几乎等同于PEP 289中的指定:
g = (x**2 for x in range(10)) print g.next()
相当于:
def __gen(exp): for x in exp: yield x**2 g = __gen(iter(range(10))) print g.next()
然而,它只是几乎等效, 时
iter(numbers)
>>> def f1(l):
... x = (n for n in l)
... return x
...
>>> def f2(l):
... for n in l:
... yield n
...
>>> a1 = f1(1)
TypeError: 'int' object is not iterable
>>> a2 = f2(2) # works
>>> next(a2) # fails only after calling "next"
TypeError: 'int' object is not iterable
会立即尝试f1
而iter(l)
只有在f2
上发出iter(l)
后才会next
。
要真正等效,您需要将iter(numbers)
传递给使用yield
的函数。
答案 1 :(得分:0)
是的,没有显着差异。这两个符号都创建了一个生成器,并且不会立即执行该语句。