Python 为什么在循环时放弃迭代
我使用的是Python 为什么在循环时放弃迭代,python,python-3.x,generator,Python,Python 3.x,Generator,我使用的是yield from,但我不知道对yield的影响。如果我将yield from放入while循环中,它工作得很好,但是当我同时取消循环时,会发生异常 final_result={} def销售总额(专业名称): 总数=0 nums=[] 尽管如此: x=收益率 打印(专业名称+销售额:,x) 如果不是x: 打破 总数+=x nums.append(x) 返回总数,nums def中间(钥匙): 尽管如此: 最终结果[关键]=销售总收益率(关键) def 2(钥匙): 最终结果[关键]
yield from
,但我不知道对yield
的影响。如果我将yield from
放入while
循环中,它工作得很好,但是当我同时取消循环时,会发生异常
final_result={}
def销售总额(专业名称):
总数=0
nums=[]
尽管如此:
x=收益率
打印(专业名称+销售额:,x)
如果不是x:
打破
总数+=x
nums.append(x)
返回总数,nums
def中间(钥匙):
尽管如此:
最终结果[关键]=销售总收益率(关键)
def 2(钥匙):
最终结果[关键]=销售总收益率(关键)
def主(乐趣):
数据集={A:[12001500],“B:[28,55,98]}
对于键,data_set.items()中的data_set:
m=乐趣(关键)
m、 发送(无)
对于数据集合中的值:
m、 发送(值)
m、 发送(无)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
主(中)#工作正常
主(中间2)#停止迭代
我希望main(middle2)
能像main(middle)
一样正常工作,但是有一个StopIteration
例外。sales\u sum
是一个有限迭代器middle2
在其上迭代一次middle
尝试多次迭代。导致main
异常的原因是m.send(None)
调用导致middle2
生成器耗尽(在子生成器sales\u sum
响应其接收到的错误值而中断其循环后)。当生成器耗尽时,它将引发StopIteration
。通常这是不可见的,因为您在中为循环使用迭代器,但在这种情况下,它会中断您的代码
有几种方法可以解决此问题。一种是使用对next
的双参数调用,而不是使用m.send(None)
:
这与m.send(无)的作用相同
,但还有抑制停止迭代
的额外好处。请注意,调用next
中的None
实际上与send
中的值不同。它是迭代器耗尽时的默认返回值,而不是发送进来的值(使用next
时总是None
)
另一种方法是更改middle2
,这样它就不会在sales\u sum
生成器结束时结束。您可以在末尾添加一个额外的yield
语句,以便在其子生成器返回时,它在向final\u result
赋值后最后一次生成控件
最后一个想法是用m.close()替换m.send(None)
。这需要对最终结果进行一些更改,因为关闭
调用将向生成器抛出一个GeneratorExit
异常。如果需要,可以将其用作要执行的信号,而不是查找错误值:
def sales_sum(pro_name):
total = 0
nums = []
while True:
try:
x = yield
except GeneratorExit:
return total, nums
print(pro_name+" Sales volume: ", x)
total += x
nums.append(x)
通过此更改,middle2
将不需要任何修改。感谢您的想法。现在,我想了解更多关于“从中收益”的详细信息,您有什么建议吗?我建议阅读,了解如何从中收益以及生成器close()
方法(以及其他内容)添加到Python中。您的意思是它在主中的下一个for
之前进入了中间的下一个循环?
def sales_sum(pro_name):
total = 0
nums = []
while True:
try:
x = yield
except GeneratorExit:
return total, nums
print(pro_name+" Sales volume: ", x)
total += x
nums.append(x)