Python中的生成器和列表

时间:2014-07-07 18:45:07

标签: python list python-2.7 tuples generator

善待,我还在学习python(但越来越好)。我查看了有关发电机的其他帖子,但没有找到我的具体问题的答案。对不起,如果我错过了。

所以我正在编写一个充当生成器的方法。我可以让它工作,但不是我想要的方式。我正在努力了解发电机。

如果我写下以下内容:

def genfunc(self):
    """
    self.some_lst is defined in __init__ as a list of tuples. e.g [(1,2),(2,3)]
    """
    yield (x for x in self.some_lst)

我得到了

Line 73: TypeError: '<invalid type>' does not support indexing

但是,如果我把它写成:

def genfunc()
    """
    self.some_lst is defined in __init__ as a list of tuples. e.g [(1,2),(2,3)]
    """
    for x in self.some_lst:
        yield x

一切正常。

两个问题:1。我对发电机的根本缺失是什么? 2.当我尝试(但失败)时,有没有办法在一行中写这个?

我知道有些SOers正等着帮助这个新手。提前谢谢。

2 个答案:

答案 0 :(得分:3)

在Python2中,您需要编写

def genfunc():
    for x in self.some_lst:
        yield x

但是在Python3中你可以编写

def genfunc():
    yield from self.some_lst

请参阅PEP380 -- Syntax for Delegating to a Subgenerator


yield (x for x in self.some_lst)

不起作用,因为(x for x in self.some_lst)是一个对象 - 一个生成器表达式。所以yield表达式只产生一个对象,而不是生成器表达式中的项。

答案 1 :(得分:3)

您正在将生成器表达式与您的生成器混合。

yield产生后面的内容,你在那里放了一个生成器表达式。就像生成器函数一样,这会生成一个生成器对象:

>>> (x for x in some_lst)
<generator object <genexpr> at 0x100544aa0>

这就是你所得到的。

因为你基本上产生了另一个生成器,所以你无法对它进行索引,因为它没有产生你期望的2值元组。

由于生成器表达式本身会生成一个生成器,您可以直接返回该生成器表达式 ,而不使用yield

def genfunc(self):
    """
    self.some_lst is defined in __init__ as a list of tuples. e.g [(1,2),(2,3)]
    """
    return (x for x in self.some_lst)