这个Python生成器是如何工作的?

这个Python生成器是如何工作的?,python,generator,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} >>> 实际上,这个函数是否设计为只

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

>>> 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}
>>>
实际上,这个函数是否设计为只返回一个值

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

>>> 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}
>>>
这是生成器理解的语法。试着像这样迭代:

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}
def f():
    yield from (i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}]))
next()
函数从生成器返回下一项。根据以下文件:

next(迭代器[,默认值])

通过调用迭代器的
next()
方法,从迭代器中检索下一项。 如果给定默认值,则在迭代器耗尽时返回, 否则将引发StopIteration

在这种情况下,返回的是

{'a':1, 'b':2}
这是一本字典。如果您像这样使用
for
循环,您将迭代键,因此依次打印
a
,和
b
(如果您使用的是python3.6),因为键的顺序是有保证的。在较旧的python版本中,您将以任意顺序打印密钥

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

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

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}
def f():
    yield from (i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}]))

谢谢令人惊讶的是,yield返回字典中的第一项。可能值得注意的是,不能保证从字典中迭代键的顺序。在3.6之前的Python版本中,它可能是随机的。在3.6本身中,密钥将按照它们添加到字典中的顺序生成,但这被视为一个实现细节,而不是您应该依赖的东西。这可能会在3.7或更高版本中发生变化(这可能会发生,但尚未决定)。>>>>def f():。。。产生下一个(({'a':1,'b':2},{'c':3,'d':4})中的i代表i…>>t=f()>>>对于t中的项:。。。打印(项目)。。。{'a':1,'b':2}>>@user3267989做了一个小小的改变。我想我应该说得更具体些。@Blckknght谢谢你的建议。把它加进去!