【发布时间】:2020-11-22 15:13:11
【问题描述】:
我对使用__iter__() 和__next__() 之类的方法有点困惑(我想它们被称为dunders)。
我试图理解迭代器和可迭代对象并编写了以下代码:
x = (1, 2, 3, 4, 5, 6)
try:
y = x.__iter__()
while 1:
print(y.__next__())
except StopIteration:
print('Iterator has exhausted')
然后当我使用__iter__ 和__next__ 作为函数时,代码得到执行而没有错误:
x = (1, 2, 3, 4, 5, 6)
try:
y = iter(x)
while 1:
print(next(y))
except StopIteration:
print('Iterator has exhausted')
谁能告诉我如何将它们用作方法和函数?它适用于所有的dunders吗?
【问题讨论】:
-
iterandnext是函数。__iter__and__next__是方法。 -
所以你的意思是, __iter__() 和 __next__() 是对象元组的方法(这里)和 next() 和 iter() 是内置函数。而这对其他笨蛋来说不是真的吗?
-
“这件事对其他笨蛋来说不是真的吗?”是什么让你做出这样的推断?所有 dunder 都为每个支持它们的类提供了单独的实现,整个相关的内置函数只为所有类型实现一次。
-
您不应该真正调用魔术方法,这就是为什么它们可能或可能不适用于内置类型。然而,第二个变体中的
iter(x)确实为您提供了一个迭代器,因此您可以使用y.__next__()。 -
@tevemadar 你在那里自相矛盾!一旦你调用了
y = iter(x),你就会想调用next (y),而不是y.__next()__。
标签: python python-3.x magic-methods