python - 自定义类中的 Python 生成器
问题描述
我正在学习 Python,我试图弄清楚为什么在自定义类中包含“yield”语句的函数不能按预期运行。我的目标是让函数充当生成器;也就是说,它返回一个生成器迭代器,然后可以在 for 语句中使用它。
该类定义如下:
class inclusive_range:
def __init__(self, num):
self._start = 0
self._step = 1
self._stop = num
self._next = self._start
# iterator implementation - would like to avoid this
# def __iter__(self):
# return self
#
# def __next__(self):
# if self._next > self._stop:
# raise StopIteration
# else:
# _r = self._next
# self._next += self._step
# return _r
# generator implementation - trying to get this to work
def generator(self):
if self._next < self._stop:
_r = self._next
self._next += self._step
yield _r
在主程序中运行此语句时,迭代器实现(已注释掉)按预期工作:
for i in inclusive_range(10):
print(i)
其中输出是预期的(打印数字 0 到 10 包括在内)。
但是,当我尝试按如下方式使用生成器时:
for i in inclusive_range(10).generator():
print(i)
输出只有一个数字 0。起初我认为 generator() 调用没有按预期返回迭代器,所以我使用调试器进行了调查:
n = inclusive_range(10)
# I pulled up the "evaluate expression" window in the debugger and did the following:
n.generator().__next()__ # prints 0
n.generator().__next()__ # prints 1!
n.generator().__next()__ # prints 2!
n.generator().__next()__ # prints 3!
# ...and so on until StopIteration is raised.
所以我的问题是......它似乎像我在调试器中所期望的那样工作,为什么它只返回第一个值?
解决方案
我认为你想要一个while
循环而不是if
你的生成器方法中的语句:
# generator implementation - trying to get this to work
def generator(self):
while self._next <= self._stop:
_r = self._next
self._next += self._step
yield _r
推荐阅读
- javascript - 反应路由器 - 没有从 url 获取参数
- c# - 列表属性实体框架的位置
- string - 字符串中的通配符作为输入
- angular - [Angular 6]如何在实时服务器中重新加载相同的子组件页面?
- angular - Angular 中未使用预渲染
- amazon-web-services - 更改 EC2 类型后实例无法访问
- kubernetes - Kyma 控制台中“公开 API”的 CLI 等效项是什么
- mongodb - MongoDB 未作为服务运行
- javascript - 仅在定义属性时推送
- kubernetes - 变量值作为 helm 图表中的 yaml 键