gpt4 book ai didi

python - 分离 __iter__ 和 __next__ 方法

转载 作者:行者123 更新时间:2023-11-28 20:13:57 24 4
gpt4 key购买 nike

在 Python 3 中,通过定义 __iter____next__ 方法使类同时成为可迭代对象和迭代器是标准过程。但是我很难解决这个问题。以这个创建一个只产生偶数的迭代器的例子为例:

class EvenNumbers:

def __init__(self, max_):
self.max_ = max_

def __iter__(self):
self.n = 0
return self

def __next__(self):
if self.n <= self.max_: # edit: self.max --> self.max_
result = 2 * self.n
self.n += 1
return result

raise StopIteration

instance = EvenNumbers(4)

for entry in instance:
print(entry)

据我所知(如果我错了请纠正我),当我创建循环时,通过调用类似 itr = iter(instance) 的东西创建一个迭代器,它在内部调用 __iter__ 方法。这预计会返回一个迭代器对象(该实例是由于定义了 __next__ ,因此我可以直接返回 self)。要从中获取元素,将调用 next(itr) 直到引发异常。

我现在的问题是:__iter____next__ 是否以及如何分开,以便在其他地方定义后一个函数的内容?这什么时候有用?我知道我必须更改 __iter__ 以便它返回一个迭代器。

顺便说一句,这样做的想法来自这个网站 ( LINK ),它没有说明如何实现它。

最佳答案

听起来您混淆了iteratorsiterables。 Iterables 有一个返回迭代器的 __iter__ 方法。迭代器有一个 __next__ 方法,它返回它们的下一个值或引发一个 StopIteration。现在在 python 中,它是 stated迭代器也是可迭代的(但反之则不然)并且 iter(iterator) 是迭代器 所以迭代器 itr 应该只从它的 __iter__< 返回它自己 方法。

Iterators are required to have an __iter__() method that returns the iterator object itself so every iterator is also iterable and may be used in most places where other iterables are accepted

在代码中:

class MyIter:
def __iter__(self):
return self

def __next__(self):
# actual iterator logic

如果你想做一个自定义的迭代器类,最简单的方法是继承自collections.abc.Iterator你可以看到上面定义了 __iter__(它也是 collections.abc.Iterable 的子类)。那么你所需要的就是

class MyIter(collections.abc.Iterator):
def __next__(self):
...

当然有一种更简单的方法来制作迭代器,那就是使用生成器函数

def fib():
a = 1
b = 1
yield a
yield b
while True:
b, a = a + b, b
yield b

list(itertools.takewhile(lambda x: x < 100, fib()))
# --> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

仅供引用,这是抽象迭代器和可迭代的(简化)代码

from abc import ABC, abstractmethod

class Iterable(ABC):
@abstractmethod
def __iter__(self):
'Returns an instance of Iterator'
pass

class Iterator(Iterable, ABC):
@abstractmethod
def __next__(self):
'Return the next item from the iterator. When exhausted, raise StopIteration'
pass

# overrides Iterable.__iter__
def __iter__(self):
return self


关于python - 分离 __iter__ 和 __next__ 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52056146/

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