Python迭代器和生成器
Python迭代器
1、可迭代对象和迭代器
- 可迭代对象:
实现了能返回迭代器的 iter 方法或者实现了 getitem 方法而且其参数是从零开始的索引的对象均为可迭代对象
- 迭代器:
迭代器是这样的对象:实现了无参数的 next 方法,返回下一个元素,如果没有元素了,那么抛出 StopIteration 异常;并且实现iter 方法,返回迭代器本身。
字符串,列表或元组对象都可用于创建迭代器
- 两者的关系:
1)可迭代对象包含迭代器。
2)如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。
3)定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。
2、代码示例(使用列表来创建迭代器)
(1)使用for循环遍历元素
list=[1,2,3,4] it = iter(list) # 创建迭代器对象 for x in it: print (x, end=" ")
结果:
1 2 3 4
(2)使用next遍历元素
>>> list=[1,2,3,4] >>> IT=iter(list) >>> next(IT) 1 >>> next(IT) 2 >>> next(IT) 3 >>> next(IT) 4 >>> next(IT) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>>
3、创建迭代器
1)把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__()
2)迭代器对象支持通过next取值,如果取值结束则自动抛出StopIteration
3)for循环内部在循环时,先执行__iter__方法,获取一个迭代器对象,然后不断执行next取值,有异常StopIteration时终止循环
# 创建迭代器类型 class IT(object): def __init__(self): self.counter = 0 def __iter__(self): return self def __next__(self): self.counter += 1 if self.counter == 3: raise StopIteration return self.counter # 根据类实例化来创建一个迭代器 obj1 = IT() v1 = next(obj1) print(v1) v2 = next(obj1) print(v2) v3 = next(obj1) # 抛出异常 print(v3) obj2=IT() for i in obj2: # 首先会执行迭代器对象的__iter__方法回去返回值,一直去返回的执行next对象 print(i)
Python生成器
1、生成器是一种使用普通函数语法定义的迭代器
2、包含yield语句的函数都被称为生成器
3、不使用return返回一个值,而是可以生成多个值,每次一个
4、每次使用yield生成一个值后,函数都将冻结,及再次停止执行
5、被重新唤醒后,函数将从停止的地方开始继续执行
l3 = [x * x for x in [1,2,3,4,5]] #列表推导式 结果:[1,4,9,16,25] l4 = (x * x for x in [1,2,3,4,5]) >>> l4 结果:<generator object <genexpr> at 0x0000021CD228C7C8> #generator就是生成器
使用 yield 实现斐波那契数列:
import sys def fibonacci(n): # 生成器函数 - 斐波那契 a, b, counter = 0, 1, 0 while True: if (counter > n): return yield a a, b = b, a + b counter += 1 f = fibonacci(10) # f 是一个迭代器,由生成器返回生成 while True: try: print (next(f), end=" ") except : sys.exit()