这对于Python 2.7.x中的生成器是如何工作的

时间:2016-09-06 02:18:30

标签: python python-2.7

我知道Python中的for x in list循环,但我偶然发现了一种我找不到文档的生成器。我发现下面的示例仅在列表a中的列表长度为2时才有效,或者它给出了解包错误,因此我怀疑某些2元组或与字典相关的解包器可能正在运行。有人可以向我解释这个生成器语法是如何工作的吗?

$ python                                                                                                                                            
Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [[1,2],[3,4],[5,6]]
>>> (b for c, b in a)
<generator object <genexpr> at 0x1071abaa0>
>>> [x for x in (b for c, b in a)]
[2, 4, 6]

我在调用min时使用此生成器的项目中遇到了它。最初我认为传入的是多个args,但语法没有任何意义,单独测试就发现了一个生成器。

https://github.com/bigbighd604/Python/blob/master/graph/Ford-Fulkerson.py#L59

2 个答案:

答案 0 :(得分:4)

不要被c, b中的逗号所欺骗。在Python中,逗号 - 而不是括号 - 是定义元组的原因。您的代码等同于[x for x in (b for (c, b) in a)],它会遍历a的元素,将c分配给ab中每个双元素列表的第一个元素}到第二个,然后将b分配给x。如果a的元素不是可迭代的双元素,那么您将获得ValueError

答案 1 :(得分:1)

从内部开始,我们从列表a:

创建一个生成器表达式
a = [[1,2],[3,4],[5,6]]

所以,让我们一个人看一下:

(b for c, b in a)

因此,如果您回顾列表a,我们会有一个列表列表,其中每个子列表只有两个项目。因此,您的生成器表达式发生的是c, b将子列表中的每个解压缩值表示为元组。但是,如果你看一下表达式,我们只会采用b,这就是为什么结果会最终成为:

2, 4, 6

然后向外移动,我们只是从该生成器表达式创建列表理解:

[x for x in (b for c, b in a)]

列表中的结尾:

[2, 4, 6]

实际上,如果您希望从该表达式中获取列表,您可以这样做:

list(b for c, b in a)