编写一个计数器类型,创建的对象可以通过for循环遍历
提示:for循环可以遍历的对象是可迭代对象,内部可以通过__iter__()魔法方法获取遍历数据的迭代器
提示2:yield关键字
class Counter:
"""计数器类型"""
# 请在此处编写代码
pass
cnt = Counter(100)
for x in cnt:
print(x) # 打印0~100的数据
使用类和生成器
class Counter:
"""计数器类型"""
def __init__(self, stop):
self.stop = stop
def __iter__(self):
# 返回一个生成器,用于产生从0到stop-1的整数序列
return (x for x in range(1, self.stop+1))
cnt = Counter(100)
for x in cnt:
print(x)
__iter__()
方法返回了一个生成器表达式,它会产生一个从0到 stop-1 的整数序列。每次 for 循环请求下一个值时,生成器就会yield
一个值,直到达到stop
指定的上限,然后抛出StopIteration
异常来结束迭代。
range函数不包含结束索引本身,因此self.stop+1,最终打印0~100
在类中使用 yield 关键字创建一个生成器函数
class Counter:
"""计数器类型"""
def __init__(self, start, stop):
self.start = start
self.stop = stop
def count(self):
"""生成器方法,产生从start到stop的整数序列"""
n = self.start
while n <= self.stop:
yield n
n += 1
cnt = Counter(0, 100)
for x in cnt.count():
print(x)
每次迭代
for
循环中,生成器对象被迭代,每次迭代都会执行生成器方法,直到遇到yield
语句,此时生成器方法暂停并返回yield
后面的表达式的值。