有人能解释一下这个发生器代码在做什么吗?
(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()
方法检索迭代器的下一个项目。 如果给出默认值,则在迭代器用尽时返回,否则返回StopIteration。 。
在这种情况下,什么是返回是
{'a':1, 'b':2}
这是一本字典。如果您像这样对此使用for
循环,则可以遍历这些键,因此可以依次打印出a
和b
(如果您使用python3.6),因为键的顺序是有保证的。在较早的python版本中,您将以任意顺序打印密钥。
实际上,这个函数的设计目的是只返回一个值吗?
是的。作为练习,请尝试更改return
至yield from
,如下所示:
def f():
yield from (i for i in [{'a':1, 'b':2}, {'c':3, 'd':4}]))
谢谢。令人惊讶的是,收益率返回字典中的第一项。 – user3267989
可能值得注意的是,密钥从字典中迭代的顺序不能保证。在3.6之前的Python版本中,它可能是随机的。在3.6本身中,键将按照它们添加到字典中的顺序排序,但这被认为是实现细节,而不是您应该依赖的。这可能会在3.7或更高版本中发生变化(可能会发生,但尚未确定)。 – Blckknght
>>> def f(): ... yield next((i'in in [{'a':1,'b':2},{'c':3,'d':4}]] )) ... >>> t = f() >>> for item in t: ... print(item) ... {'a':1,'b':2} >>> – user3267989