我应该在什么时候使用python自定义生成器手动引发“StopIteration”?

我应该在什么时候使用python自定义生成器手动引发“StopIteration”?,python,exception,generator,Python,Exception,Generator,在下面的代码中,我假设有两个生成器生成排序的和可比较的值,我希望生成一个生成器,从这两个生成器生成“同步”对。所谓同步,我指的是当两者产生相同的值时,从两者中产生,否则只推进“延迟”值(将其产生的值与None配对) 上述操作可以继续产生最后一对(3,3): from cytoolz import take list(take(10, pairs)) 输出: [(1, 1), (2, 2), (3, 3

在下面的代码中,我假设有两个生成器生成排序的和可比较的值,我希望生成一个生成器,从这两个生成器生成“同步”对。所谓同步,我指的是当两者产生相同的值时,从两者中产生,否则只推进“延迟”值(将其产生的值与
None
配对)

上述操作可以继续产生最后一对
(3,3)

from cytoolz import take
list(take(10, pairs))                                             
输出:

[(1, 1),
 (2, 2),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3)]
[(1, 1),
 (None, 2),
 (3, None),
 (None, 2),
 (3, None),
 (None, 2),
 (3, None),
 (None, 2),
 (3, None),
 (None, 2)]
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-96-61eb4df81d52> in <module>
----> 1 list(take(10, pairs))

<string> in generate_pairs(g1, g2)

UnboundLocalError: local variable 'n1' referenced before assignment
同样在B中,似乎应该提出手动
StopIteration

pairs = generate_pairs((n1 for n1 in [1, 3]), (n2 for n2 in [1, 2]))
list(take(10, pairs))
输出:

[(1, 1),
 (2, 2),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3)]
[(1, 1),
 (None, 2),
 (3, None),
 (None, 2),
 (3, None),
 (None, 2),
 (3, None),
 (None, 2),
 (3, None),
 (None, 2)]
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-96-61eb4df81d52> in <module>
----> 1 list(take(10, pairs))

<string> in generate_pairs(g1, g2)

UnboundLocalError: local variable 'n1' referenced before assignment
从下面的测试来看,在我看来,也需要某种方式来终止发电机:

pairs = generate_pairs((_ for _ in []), (n2 for n2 in [1, 2, 3]))
list(take(10, pairs))
输出:

[(1, 1),
 (2, 2),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3),
 (3, 3)]
[(1, 1),
 (None, 2),
 (3, None),
 (None, 2),
 (3, None),
 (None, 2),
 (3, None),
 (None, 2),
 (3, None),
 (None, 2)]
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-96-61eb4df81d52> in <module>
----> 1 list(take(10, pairs))

<string> in generate_pairs(g1, g2)

UnboundLocalError: local variable 'n1' referenced before assignment
UnboundLocalError回溯(最近一次调用)
在里面
---->1份清单(10对)
成对生成(g1、g2)
UnboundLocalError:赋值前引用了局部变量“n1”
但是,如果我取消注释代码中的所有
raisestopIteration
,我需要手动处理产生的异常。例如,它们不会在for循环中自动处理

我只希望我的成对生成器在两个输入生成器都用完后停止生成东西,而不发生戏剧性的变化。我做错了什么

编辑
似乎使用
return
而不是
raisestopIteration
很好地修复了我的代码。不过,我仍然对一些解释感兴趣。

@JETM感谢您的链接。我还发现终止生成器的正常方法是返回。@JETM感谢链接。我还发现终止生成器的正常方法是返回。