Python3的迭代器
迭代(iterate):意味着多次重复,类似循环。
迭代器两个基本方法:
__iter__:返回一个迭代器,包含__next__方法的对象,调用这个方法时可以不提供参数。
__next__:调用该方法时,迭代器应返回其下一个值,如果迭代器没有可供返回的值,就引发StopIteration异常。
迭代器出现的原因:
很多情况下,使用列表有点大材小用。如果你有一个逐个计算值的函数,你可能只想逐个地获取值,而不是一次性获得所有。如果有很多值,或者无穷多的值时,就需要列表足够大。比如斐波拉契数。
1 # 运用生成器实现斐波那契数列 2 import sys 3 4 # 要多少数就输入多少n 5 def fibs(n): 6 a,b,counter = 0, 1, 0 7 while True: 8 if counter > n: 9 return 10 yield a 11 a, b = b, a+b 12 counter += 1 13 14 #求1000以内的斐波那契数列 15 f = fibs(10) 16 17 while True: 18 try: 19 print(next(f), end = " ") 20 except StopIteration: 21 sys.exit() 22 23 ##########0 1 1 2 3 5 8 13 21 34 55##########
迭代器的对象:
列表、元组、字符串
>>> list1 = [1,2,3] >>> lis = iter(list1) >>> print(next(lis)) 1 >>> print(next(lis)) 2 >>> print(next(lis)) 3 >>> print(next(lis)) Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> print(next(lis)) StopIteration
>>> str1 = "123" >>> st = iter(str1) >>> print(next(st)) 1 >>> print(next(st)) 2 >>> print(next(st)) 3 >>> print(next(st)) Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> print(next(st)) StopIteration
>>> tup1 = (1,2,3) >>> tu = iter(tup1) >>> for i in tu: print(i) 1 2 3
从迭代器创建序列:
除了对迭代器和可迭代对象进行迭代之外,还可将它们转换为序列。
在可使用序列的情况下,大多也可使用迭代器或可迭代对象(诸如索引和切片等操作除外)。
# 使用构造函数 list显式地将迭代器转换为列表 class TestIterator: value = 0 def __next__(self): self.value += 1 if self.value > 10: raise StopIteration return self.value def __iter__(self): return self ti = TestIterator() print(list(ti))
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]