day14笔记
迭代器
一、可迭代的
字符串、列表、元祖、字典、集合、文件句柄、文件操作符、range;以上这些都是可迭代的
判断一个对象是否是可迭代的可以用下面方法:
1 from collections import Iterable 2 3 print(isinstance('aaa',Iterable)) 4 print(isinstance(123,Iterable)) 5 print(isinstance([1,2,3],Iterable))
isinstance()括号里第一个就是你要判断的对象
所有可迭代对象都存在__iter__这个方法,所以说这个方法导致数据类型是可迭代的
可迭代协议(数据类型与python解释器之间):只要包含了__iter__方法的数据类型就是可迭代的。
二、迭代器
迭代器和可迭代对象之间的关系
1.迭代器=可迭代对象.__iter__()
1 lst_iterator = [1,2,3].__iter__() #列表为可迭代对象,使用.__iter__方法变为迭代器 2 3 print(lst_iterator.__next__()) #迭代器使用.__next__方法 4 print(lst_iterator.__next__()) 5 print(lst_iterator.__next__())
可迭代对象里有几个元素,.__next__()就可以使用几次,超过就会报错
2.迭代器包含于可迭代对象
迭代器协议:含有__iter__()和__next__()方法的对象就是迭代器
判断是否为迭代器可以使用下面的方法
1 from collections import Iterator 2 3 print(isinstance("aaa",Iterator))
迭代器能够对python中的基本数据类型进行统一的遍历,不需要关心每一个值分别是什么
1 lst_iterator=[1,2,3].__iter__() 2 print(lst_iterator.__next__()) #1 3 print(lst_iterator.__next__()) #2 4 print(lst_iterator.__next__()) #3
节省内存(惰性运算)
迭代器有两种
1.本来就是,例如文件句柄
2.可迭代对象.__iter__()
三、生成器
1.带yield关键字的函数就是生成器函数
2.生成器函数在执行时只返回一个生成器,不会执行函数里的内容
1 def generator_func(): 2 print("welcom") 3 yield qxbs 4 5 g=generator_func #返回一个生成器,并不执行函数内容 6 print(g) 7 ret=g.__next__() #执行函数内容,有几个yield就可以对应几个.__next__() 8 print(ret)
3.从生成器中取值
1.函数中有几个yield就可以用.__next__取值几次
2.for循环取值
1 def get_clothing(): 2 for cloth in range(1,200): 3 yield "第%s件衣服" %cloth 4 5 generate=get_clothing() 6 7 print(generate.__next__()) 8 print(generate.__next__()) 9 for i in range(50): 10 print(generate.__next__())
3.其它数据类型进行强转
4.注意,在调用生成器函数时,先获取生成器,再进行.__next__取值
5.生成器中的内容只能取一次,按顺序取值,取完为止
生成器实例:文件监控
1 import time 2 def tail(name): 3 f=open(name,encoding="utf-8") #打开要监控的文件 4 f.seek(0,2) #将光标移动到最后 5 while True: 6 line=f.readline() 7 if not line: #判断最后一行是否有内容 8 time.sleep(0.1) 9 continue 10 yield line 11 12 tail_g=tail("file") 13 for line in tail_g: 14 print(line)
浙公网安备 33010602011771号