gpt4 book ai didi

python - 基于生成器编写 python 迭代器的最佳方法是什么

转载 作者:太空宇宙 更新时间:2023-11-03 12:33:56 25 4
gpt4 key购买 nike

我一直在寻找一种编写基于生成器的 Python 迭代器的好方法。我找到了许多关于迭代器主题的教程,还有许多关于生成器和 yield 语句的教程,但没有找到将两者结合起来的教程。我构建了一个可以运行的小示例,想知道是否有更好的方法来执行此操作。

class myIterator :

def __init__(self, n) :
self.last = n
self.myGen = self.myGenerator()

def __iter__(self) :
return self.myGenerator()

def next(self) :
return self.myGen.next()

def myGenerator(self) :
prev = 0
fib = 1
while fib < self.last :
res = fib
yield res
fib = fib + prev
prev = res

raise StopIteration

我在现实世界的程序中使用了这种技术,可以在 SQLStatements.py in my Github repository 找到

其中最令人费解的部分是定义 next() 函数。显而易见的解决方案在每次调用时都返回第一个元素。存储一个包含生成器的实例变量是可行的,但似乎有点麻烦。

如果您知道更好的方法或涵盖此主题的优秀教程,请告诉我。

编辑:@MartijnPieters 发布的第三个示例完全解决了这个问题。将 self.generator.next 函数保存在 self.next 中提供了 next 函数。我希望这可以帮助其他人尝试解决这个问题。

最佳答案

迭代器协议(protocol)由两部分组成。 __iter__ 方法是最重要的方法,当您在对象上使用 iter() 时,它应该返回迭代器。

只需将 __iter__ 的主体替换为 myGenerator;也不需要提高 StopIteration:

class myIterator:
def __init__(self, n):
self.last = n

def __iter__(self):
prev = 0
fib = 1
while fib < self.last:
res = fib
yield res
fib += prev
prev = res

现在 iter(myIterator(10)) 是一个迭代器并且有一个 .next() 方法。

如果您希望您的类直接用作迭代器,您需要 __iter__ 返回 self 并提供一个 .next()方法。

.next() 方法为每个函数体生成一个 元素(并使用return somevalue)。生成器只是一个使用 yield 的函数,实际上,这样的方法本身为您实现了迭代器协议(protocol)(包括 .next())。

如果你要使用 .next(),它会看起来像这样:

class myIterator:
def __init__(self, n):
self.last = n
self.prev = 0
self.fib = 1

def __iter__(self):
return self

def next(self):
if self.fib < self.last:
res = self.fib
self.fib += self.prev
self.prev = res
return res

raise StopIteration

或者您可以重用生成器的.next() 方法:

class myIterator:
def __init__(self, n):
self.last = n
self.next = self.myGenerator().next # Use the generator `.next`

def __iter__(self):
return self

def myGenerator(self):
prev = 0
fib = 1
while fib < self.last:
res = fib
yield res
fib += prev
prev = res

关于python - 基于生成器编写 python 迭代器的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187261/

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