如果不使用生成器函数,如何在Python中实现与itertools.count等效的迭代器?

如果不使用生成器函数,如何在Python中实现与itertools.count等效的迭代器?,python,iterator,generator,Python,Iterator,Generator,使用生成器函数,这就是如何实现itertools.count(从): 我试图找到如何在没有生成器函数的情况下实现类似的迭代器 class Count: def __init__(self, start=0, step=1): self.c = start self.step = step def __iter__(self): return self def __next__(self): n = sel

使用生成器函数,这就是如何实现
itertools.count
(从):

我试图找到如何在没有生成器函数的情况下实现类似的迭代器

class Count:
    def __init__(self, start=0, step=1):
        self.c = start
        self.step = step

    def __iter__(self):
        return self

    def __next__(self):
        n = self.c
        self.c += self.step
        return n
这就是实现吗


当然,它没有任何实际意义,重点只是了解如何使用生成器实现它。

最佳实践之一是编写一个小型单元测试。您可以使用该框架来实现这一点

下面是几个测试的示例,这些测试在循环中使用类并检查迭代器的值:

import unittest
import random


class TestCount(unittest.TestCase):
    loops = 20

    def test_default(self):
        c = Count()
        for i in range(self.loops):
            self.assertEqual(i, next(c))

    def test_start(self):
        start = random.randint(-10, 10)
        c = Count(start=start)
        for i in range(start, start + self.loops):
            self.assertEqual(i, next(c))

    def test_step_pos(self):
        step = random.randint(1, 5)
        c = Count(step=step)
        for i in range(0, self.loops, step):
            self.assertEqual(i, next(c))

    def test_step_neg(self):
        step = random.randint(-5, -1)
        c = Count(step=step)
        for i in range(0, -self.loops, step):
            self.assertEqual(i, next(c))

您可以使用
collections.abc.Iterator
以更少的代码实现计数

from collections.abc import Iterator

class count(Iterator):
    def __init__(self, start=0, step=1):
        self.c, self.step = start-step, step

    def __next__(self):
        self.c += self.step
        return self.c

我觉得还可以。
from collections.abc import Iterator

class count(Iterator):
    def __init__(self, start=0, step=1):
        self.c, self.step = start-step, step

    def __next__(self):
        self.c += self.step
        return self.c