先说可迭代对象:
一类是集合数据类型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator function。
也就说凡是能迭代的都是可迭代对象
判断是否可以迭代 用isinstance 来判断
迭代器:迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个可迭代的对象必须是定义了__iter__()方法的对象,而一个迭代器必须是定义了__iter__()方法和next()方法的对象。
a = [1,2,3,4,5]
b = iter(a)
print(b)
out : <list_iterator object at 0x000001ACEBD3E208> #python中内置的iter()函数可以创造一个迭代器
print(next(a))
print(next(a))
print(next(a))
输出依次是1,2,3 超出范围时输出 StopIteration
生成器:
有两种方法 一是可以把列表生成式的[]改为() 就是一个生成
a = [i+1 for i in range(10)]
print(a)
out : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a = (i+1 for i in range(10))
print(a)
out : <generator object <genexpr> at 0x000001ACEBD23570>
二:是在一个有循环体的函数里 把 print()改为 yeild()
def fib(max):
n,a,b=0,0,1
while n<max:
# print(b)
yield b
a,b=b,a+b
n+=1
return 'done'
f=fib(6)
print(f)
out : <generator object fib at 0x000001ACEBC91750>
从这里看 这个函数就是生成器, 但是
print(next(f)) out :1
print(next(f)) out : 2
这里又实现了迭代的功能,一次只能产生一个值,像个迭代器,因此说 生成器看起来像是一个函数,但是表现得却像是迭代器
这也就是说为什么有人说生成器是一个特殊的迭代器,或有人说生成器是一个能够生成迭代器 函数
生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值,函数每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器。