这个Python Generator如何工作?

时间:2017-08-12 05:15:48

标签: python generator

有人可以解释这个生成器代码在做什么吗?

>>> def f():
...     return next((i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}]))
...
>>> t = f()
>>> for item in t:
...     print(item)
...
a
b
>>> t
{'a': 1, 'b': 2}
>>>

实际上,这个函数是否设计为只返回一个值?

1 个答案:

答案 0 :(得分:2)

  

有人可以解释一下这个生成器代码在做什么吗?

(i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}])

这是生成器理解的语法。尝试迭代迭代:

In [205]: for x in (i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}]):
 ...:     print(x)
 ...:     
{'b': 2, 'a': 1}
{'d': 4, 'c': 3}

next()函数返回生成器中的下一个项目。来自next的文档:

  

next(iterator[, default])

     

通过调用其next()方法从迭代器中检索下一个项目。   如果给出了default,则在迭代器耗尽时返回,   否则会引发StopIteration。

在这种情况下,返回的是

{'a':1, 'b':2}

这是一本字典。如果您在此处使用for循环,则会对密钥进行迭代,因此您依次打印出ab(如果您使用的是python3)。 6)因为密钥的顺序是有保证的。在较旧的python版本中,您将以任意顺序打印键。

  

实际上,这个函数是否设计为只返回一个值?

是的。作为练习,请尝试将return更改为yield from,如下所示:

def f():
    yield from (i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}]))