迭代器(Iterator)和生成器(generator)浅析

凡是含有__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)       #打印第二个的值
原文地址:https://www.cnblogs.com/wen-kang/p/9309838.html