我是一个新手,我正在try 实现我自己的Cycle方法,我模仿的是IterTools.Cycle方法. 我编写了以下代码.它给出了输出,但有一个例外.

  1. 我想了解为什么抛出此异常,以及有什么方法可以避免它
  2. 有没有更好的/替代的方法来实现循环方法
def cycle(iterinp):
    iter1 = iterinp
    iterVal = iter(iter1)
    while True:
        try:
            yield next(iterVal)
        except TypeError:
            print("Argument is not an iterator")
        except:
            iter1 = iterinp
            iterVal = iter(iter1)


c = cycle([1,2,3])
print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(c))
print(next(c))

发帖主题:Re:Kolibrios

1 2
3
1
2
3

例外情况: 在0x0000016BECE19C40>的:<生成器对象循环中忽略异常 运行时错误:生成器忽略了生成器退出

推荐答案

当程序退出时,它试图通过调用任何剩余对象的__del__方法来执行清理.对于生成器对象,__del__方法将调用它们的close方法,这将引发GeneratorExit异常,以便生成器正常退出.

但是,由于您的代码盲目地捕捉带有except:块的所有异常,GeneratorExit异常无法传播,从而导致抱怨GeneratorExitRuntimeError被忽略.

解决方案是简单地明确您实际想要捕获的异常类型,同时让其他异常传播.在这种情况下,您实际上只想捕获StopIteration,因此更改:

except:

致:

except StopIteration:

演示:https://replit.com/@blhsing/StainedFumblingOrganization

请注意,__del__方法是not guaranteed,即使在程序退出时也要始终调用,这就是@SuperStormer comments 无法在他/她的try 中重现错误的原因.

此外,itertools.cycle应该将任何可迭代对象作为参数,而不只是一个列表,而且对于您的实现,一旦耗尽了输入可迭代对象,就不能通过简单的iter调用来恢复它,除非它是一个序列,如列表,就像您的示例中的情况一样.

itertools.cycle‘S文档中已经有一个完美的优秀的PYTHON实现示例供您参考:

Make an iterator returning elements from the iterable and saving a copy of each. When the iterable is exhausted, return elements from the saved copy. Repeats indefinitely. Roughly equivalent 致:

def cycle(iterable):
    # cycle('ABCD') --> A B C D A B C D A B C D ...
    saved = []
    for element in iterable:
        yield element
        saved.append(element)
    while saved:
        for element in saved:
              yield element

Python相关问答推荐

如何观察cv2.erode()的中间过程?

telegram 机器人API setMyName不起作用

pandas DataFrame中类型转换混乱

这家einsum运营在做什么?E = NP.einsum(aj,kl-il,A,B)

如何使用上下文管理器创建类的实例?

为什么tkinter框架没有被隐藏?

如何在箱形图中添加绘制线的传奇?

在Python中处理大量CSV文件中的数据

难以在Manim中正确定位对象

发生异常:TclMessage命令名称无效.!listbox"

如何获取TFIDF Transformer中的值?

Polars:用氨纶的其他部分替换氨纶的部分

优化器的运行顺序影响PyTorch中的预测

如何在Polars中从列表中的所有 struct 中 Select 字段?

python sklearn ValueError:使用序列设置数组元素

干燥化与列姆化的比较

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

如何在海上配对图中使某些标记周围的黑色边框

Discord.py -

计算机找不到已安装的库'