凡是含有__iter__方法的,都是可迭代对象
若同时含有__iter__ __next__ 则作为迭代器使用 用__next__方法来取值
可迭代对象用for循环取值最方便
1 a=li=[1,2,5,78,32,94].__iter__()
2 print(li.__next__()) #迭代取值
3 print(li.__next__())
4 print(li.__next__())
5 # print(li.__next__())
6 # print(li.__next__())
7 # print(li.__next__())
8 print(a.__next__())
9 # print(li.__next__()) #超出可迭代范围之后,继续会报错
10 for i in a: #for迭代会更好
11 print(i)
并且迭代器不会在内存中占用一大块地址 循环一次生成一次
生成器可以看做为特殊的迭代器,它是使用者自定义的一种迭代器,可以被for循环取值
自定义一个生成器函数实现监听文件输入的操作:
1 def tail(file): #生成器函数
2 with open(file,'r',encoding='utf-8')as f:
3 while True:
4 line=f.readline()
5 if line.strip():
6 yield line.strip() #如果内容不为空则输出
7
8 g=tail('abc.txt')
9 for i in g:
10 print(i)
生成器函数与普通函数比较返回值return被改为yield
yield与return的区别:在函数被调用执行时会停在碰到的yield所在行,并返回一个可迭代对象,只有调用者完成迭代操作后,才会继续向下执行
如果没有对可迭代对象for循环操作或取值 则只会看到返回的一个可迭代的生成器地址 类似<generator object show at 0x000002481BF7C620>
1 def show():
2 print('hello python!')
3 yield '停下来啦'
4 yield '继续执行咯'
5
6 s=show()
7 # print(s) #执行它仅仅能看到生成器地址
8 g1=s.__next__()
9 print(g1) #打印第一个yield的值
10 # g2=s.__next__()
11 # print(g2) #打印第二个的值