自定义类中的Python生成器
我正在学习Python,我试图弄明白为什么自定义类中包含“yield”语句的函数不能按预期运行。我的目标是让函数充当生成器;也就是说,它返回一个生成器迭代器,然后可以在for语句中使用该迭代器 该类定义如下:自定义类中的Python生成器,python,generator,Python,Generator,我正在学习Python,我试图弄明白为什么自定义类中包含“yield”语句的函数不能按预期运行。我的目标是让函数充当生成器;也就是说,它返回一个生成器迭代器,然后可以在for语句中使用该迭代器 该类定义如下: class inclusive_range: def __init__(self, num): self._start = 0 self._step = 1 self._stop = num self._next =
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).generator():
print(i)
其中输出为预期值(打印数字0到10,包括在内)
但是,当我尝试按如下方式使用生成器时:
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).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
#生成器实现-尝试使其正常工作
def发生器(自):
while self.\u next我认为您希望在生成器方法中使用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
#生成器实现-尝试使其正常工作
def发生器(自):
而self.\u next问题源于发电机未正确成型。您将需要一个循环,该循环在更新对象状态以准备下一个值时,yield
。简而言之,您只需在generator(self)
中用替换if
,就可以了!此代码适用于我(为了清晰起见,删除了注释代码):
快乐编码 问题源于发电机未正确成型。您将需要一个循环,该循环在更新对象状态以准备下一个值时,yield
。简而言之,您只需在generator(self)
中用替换if
,就可以了!此代码适用于我(为了清晰起见,删除了注释代码):
快乐编码 顺便说一句,“顺便说一句,”谢谢,这是有意义的,因为生成器的执行在产生值后会暂停。确切地说,生成器是在返回(产生)值后保持其状态的函数。在下一次调用时,它们将从原来的位置恢复,并且应该以这样的方式形成,以便每次根据需要产生下一个值。谢谢,这是有意义的,因为生成器的执行在产生后暂停。确切地说-生成器是在返回(产生)值后保持其状态的函数。在下一次调用时,它们从原来的位置恢复,并且应该以这样的方式形成,以便每次根据需要产生下一个值。