如果不使用生成器函数,如何在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