[英]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.