让我用以下代码突出显示问题:
def genny():
yield 1
yield 2
yield 3
def middleman(input_gen=None):
if input_gen:
gen = input_gen
else:
gen = genny()
return [next(gen), gen]
if __name__ == '__main__':
pro_list = middleman()
pro_value = pro_list[0]
print pro_value
pro_gen_id = pro_list[1]
for i in range(2):
pro_list = middleman(pro_gen_id)
pro_value = pro_list[0]
print pro_value
我的限制是middleman()函数不能是生成器,但我需要显示生成器genny()中的所有值。我通过将生成器对象传递回main()函数然后再将其发送回middleman()来完成此操作。这是实现这一目标的最佳方式还是有更好的方法?
答案 0 :(得分:1)
如果没有你的例子(可以理解为玩具的例子)所指的更大的上下文,那就很难说了。
一般来说,从函数中返回多个值是完全没问题的(尽管是tuple or namedtuple are a bit more common)。
在您的特定情况下,middelman
函数只是next
生成器(接收或内部构造),然后返回此值和生成器。我认为让middleman
创建或返回生成器没有任何好处,让客户端代码执行next
。以下代码与您的代码相同(请参阅ideone):
def genny():
yield 1
yield 2
yield 3
def middleman(input_gen=None):
return genny() if input_gen is None else input_gen
if __name__ == '__main__':
pro = middleman()
for e in pro:
pro = middleman(pro)
print e
它客观上更短,对我来说也更清晰。