2017-08-12 25 views
1

有人可以解释一下这个生成器代码在做什么吗?这个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} 
>>> 

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

回答

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()方法检索迭代器的下一个项目。 如果给出默认值,则在迭代器用尽时返回,否则返回StopIteration。 。

在这种情况下,什么是返回是

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

这是一本字典。如果您像这样对此使用for循环,则可以遍历这些键,因此可以依次打印出ab(如果您使用python3.6),因为键的顺序是有保证的。在较早的python版本中,您将以任意顺序打印密钥。

实际上,这个函数的设计目的是只返回一个值吗?

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

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

谢谢。令人惊讶的是,收益率返回字典中的第一项。 – user3267989

+0

可能值得注意的是,密钥从字典中迭代的顺序不能保证。在3.6之前的Python版本中,它可能是随机的。在3.6本身中,键将按照它们添加到字典中的顺序排序,但这被认为是实现细节,而不是您应该依赖的。这可能会在3.7或更高版本中发生变化(可能会发生,但尚未确定)。 – Blckknght

+0

>>> 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

相关问题