繁体   English   中英

Python中的生成器和列表

[英]Generators and Lists in Python

友善,我仍在学习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正等着帮助这个新手。 提前致谢。

在Python2中,您需要编写

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

但是在Python3中,您可以编写

def genfunc():
    yield from self.some_lst

请参阅PEP380-委托给子生成器的语法


yield (x for x in self.some_lst)

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

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

yield产生下面的任何内容,并在其中放置了一个生成器表达式。 就像生成器函数一样 ,这会生成一个生成器对象:

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

这就是你所产生的。

因为您实质上产生了另一个生成器,所以您无法对其进行索引,因为它没有生成您期望的二值元组。

由于发电机表达式本身产生了发电机,你可以只直接返回一个生成器表达式,而不使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM