gpt4 book ai didi

python - 以类似于 continue 的方式跳过 Python 迭代器 __next__ 中的迭代

转载 作者:行者123 更新时间:2023-12-05 05:43:44 24 4
gpt4 key购买 nike

我想使用跳过某些元素的 __next__ 创建一个 Python 迭代器类。

例如,我在这里使用 yieldcontinue 实现了一个生成器,我希望它下面的迭代器类做完全相同的事情。

def generator_style(my_iter):
for i in my_iter:
if i < 999990:
continue
yield i


print(", ".join(str(s) for s in generator_style(range(1000000))))

# prints 999990, 999991, 999992, 999993, 999994, 999995, 999996, 999997, 999998, 999999


class iterator_style:
def __init__(self, my_iter):
self.my_iter = iter(my_iter)

def __iter__(self):
return self

def __next__(self):
i = next(self.my_iter)
if i < 999990:
# what do I do here??? I can't use continue
return next(self)
return i

print(", ".join(str(s) for s in iterator_style(range(1000000))))

# I want it to print 999990, 999991, 999992, 999993, 999994, 999995, 999996, 999997, 999998, 999999

不幸的是,这个版本由于以下原因而崩溃

RecursionError: maximum recursion depth exceeded while calling a Python object

虽然它适用于较小的数字。

我不能用 continue 替换 return next(self) 行,因为:

    continue
^
SyntaxError: 'continue' not properly in loop

最佳答案

你是对的,递归对这样的算法有很多限制。通常你会希望避免深度递归以避免 RecursionErrors。在这种情况下,您需要递归调用 __next__ 999990 次才能获取您的值。

为避免这种情况,您可以改用 while 循环。继续调用 next 直到达到满足条件的值。

def __next__(self):
while (i := next(self.my_iter)) < 999990:
pass
return i

另一种写法,如果你发现赋值表达式令人困惑:

def __next__(self):
while True:
i = next(self.my_iter)
if i < 999990:
continue
return i

关于python - 以类似于 continue 的方式跳过 Python 迭代器 __next__ 中的迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71761604/

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