Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义类中的Python生成器_Python_Generator - Fatal编程技术网

自定义类中的Python生成器

自定义类中的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 =

我正在学习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).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
,就可以了!此代码适用于我(为了清晰起见,删除了注释代码):


快乐编码

顺便说一句,“顺便说一句,”谢谢,这是有意义的,因为生成器的执行在产生值后会暂停。确切地说,生成器是在返回(产生)值后保持其状态的函数。在下一次调用时,它们将从原来的位置恢复,并且应该以这样的方式形成,以便每次
根据需要产生
下一个值。谢谢,这是有意义的,因为生成器的执行在产生后暂停。确切地说-生成器是在返回(产生)值后保持其状态的函数。在下一次调用时,它们从原来的位置恢复,并且应该以这样的方式形成,以便每次
根据需要产生
下一个值。