Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在循环时放弃迭代_Python_Python 3.x_Generator - Fatal编程技术网

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)