__dir__():
类型.dir()可以查看该类型中所有的功能
迭代器:
迭代器一定是可迭代的,可迭代的不一定是迭代器.
可迭代对象.__iter__()方法,可以得到一个可迭代对象
迭代器的取值:
可以通过for循环和__next__()方法来获取值
代码:
迭代判断1:
# 查看列表的所有功能 print([].__dir__()) # 判断字典类型是否是迭代器和可迭代对象 print('__next__' in {}.__dir__()) # False print('__iter__' in {}.__dir__()) # True
迭代器的判断2:
from collections import Iterable # 可迭代的 from collections import Iterator # 迭代器 print(isinstance([],Iterator)) print(isinstance({},Iterator)) # False # False # 判断是否是可迭代的 print(isinstance([],Iterable)) print(isinstance({},Iterable)) # True # True
迭代器的使用:
li = [1,2,3,4,5,'a'] l = li.__iter__() # 每次给出一个元素,并且不会返回去走 print(l.__next__()) # 1 print(l.__next__()) # 2 print(l.__next__()) # 3 print(l.__next__()) # 4 print(l.__next__()) # 5 print(l.__next__()) # a
iter:
只要是能被for循环的数据类型都有__iter__()方法
一个列表或可迭代多想执行了__iter__()后的返回值就是迭代器
双下方法介绍:
__length_hint__():获取元素个数
__setstate__():从什么位置开始取值
__next__():取值
工作中可能会遇到:
可迭代对象: 打印时出现iterrator
直接给内存地址
只有是可迭代对象才能使用for循环
我们遇到一个新的变量,不确定能不能被for循环,可以判断是不是迭代器或可迭代对象
迭代器的好处:
从容器类型中一个一个取值,会把所有的值都取到
可以节省内存空间:
迭代器并不会一次在内存中占用大块的内存,每次next给出一个,给出后消失
生成器(generatoor): 本质还是迭代器
生成器函数:
关键字:yield
只要含有yield关键字的都是生成器函数,yield关键字必须在函数内使用,不能和return一起使用
生成器函数调用后会返回一个生成器调用时每调用一次就会执行一次yiels上边的函数体和它的返回值,并且上一个yield的函数体和返回值不执行
取值:
可以使用for循环取值,也可以使用__next__取值
如果for循环被终止后接着取值则会再for循环后的开始取不会重新开始
代码:
使用生成器打印9个娃哈哈,在外边打印第十个,带数值:
def wahaha(): yield '娃哈哈' w = wahaha() w1 = w.__next__() for i in range(1,11): if i>9: break print(w1,i) print(w1)
小作业:
实现文件监听,并且使用生成器返回给调用者
代码:写入内容后需要保存才会打印出来
# 先创建一个文件 def func(file): f = open(file,encoding='utf-8') # 使用while让程序一直在跑 while 1: f1 = f.readline() if f1.strip(): yield f1.strip() f2 = func('file') for i in f2: print(i)