gpt4 book ai didi

python - 如何区分迭代器和可迭代对象?

转载 作者:太空狗 更新时间:2023-10-29 17:28:30 24 4
gpt4 key购买 nike

在 Python 中,可迭代的接口(interface)是 iterator interface 的子集。 .这样做的好处是,在许多情况下,它们可以以相同的方式处理。然而,两者之间有一个重要的语义差异,因为对于可迭代的 __iter__ 返回一个新的迭代器对象而不仅仅是 self。我如何测试可迭代对象是否真的是可迭代对象而不是迭代器?从概念上讲,我将可迭代对象理解为集合,而迭代器仅管理迭代(即跟踪位置)而不是集合本身。

例如,当一个人想要循环多次时,区别就很重要。如果给出了迭代器,那么第二个循环将不会工作,因为迭代器已经用完并直接引发 StopIteration

测试 next 方法很诱人,但这似乎很危险而且不知何故是错误的。我应该只检查第二个循环是否为空吗?

有没有办法以更 pythonic 的方式进行这样的测试?我知道这听起来像是 LBYL 对抗 EAFP 的经典案例,所以也许我应该放弃?还是我遗漏了什么?

编辑:S.Lott 在他下面的回答中说,这主要是一个想要对迭代器进行多次传递的问题,一开始就不应该这样做。但是,在我的情况下,数据非常大,并且根据情况必须多次传递以进行数据处理(绝对没有办法解决这个问题)。

迭代器也由用户提供,对于单次传递就足够的情况,它将与迭代器一起工作(例如,为简单起见,由生成器创建)。但是,如果用户在需要多次传递时只提供一个迭代器,那么可以很好地防范这种情况。

编辑 2:实际上这是一个很好的例子 Abstract Base Classes .迭代器和可迭代对象中的 __iter__ 方法名称相同,但语义不同!所以 hasattr 没用,但是 isinstance 提供了一个干净的解决方案。

最佳答案

'iterator' if obj is iter(obj) else 'iterable'

关于python - 如何区分迭代器和可迭代对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/709084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com