善待,我还在学习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正等着帮助这个新手。提前谢谢。
答案 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)