【发布时间】:2021-12-09 15:52:50
【问题描述】:
Zen of Python 声明:
应该有一种——最好只有一种——明显的方法。
现在,给定以下内容:
nums = [2, 3, 4]
it = iter(nums)
it.__next__()
next(it)
最后两个语句有什么区别?它们都返回迭代器中的下一项而不更改迭代器对象。我看到.__next__() 可以用来创建迭代器对象。这是唯一的区别吗?
【问题讨论】:
-
next(it)是明确的方法,而不是使用 dunder 方法(next(it)在内部调用it对象的__next__方法),与 @ 的方法相同987654328@不是a.__add__(b) -
“不改变迭代器对象”——不正确。
-
__next__是next函数实现的一部分。next显然是您应该使用的。 -
在错误处理方面存在差异。假设您有一些变量 X,由于某些编码错误,它不是迭代器。在尝试直接访问 dunder 函数的情况下,您将获得 AttributeError,而如果您在其上调用 next(),您将获得 TypeError。此外,虽然不太可能,但使用 next() 允许更改底层实现。使用 next()
-
@don'ttalkjustcode 我的意思是对象的身份在操作之后被保留了。