Day13 of learning python--迭代器和生成器的补充
1.复习
1)函数的定义和调用:
def 函数名(形参): 函数体 return 返回值 调用 函数名(实参)
站在形参的角度:位置参数,*args,默认参数(陷阱),**kwargs
站在实参的角度:按位值传,按关键字传
返回值:没有返回值,返回一个值,返回多个值
接收返回值:没有返回值不接收,返回一个值用一个变量接收,返回多个值用一个变量或者对应数目的变量接收
闭包函数--在内部函数引用外部函数的变量
2)装饰器:--一定是闭包函数
装饰器的作用是:在不改变原来函数的调用方式情况下,在这个函数的前后添加新的功能
完美的符合一个开发原则:开放封闭原则(对扩展是开放的,对修改是封闭的)
3)基础的装饰器公式
from functools import wraps def wrapper(func): @wraps(func) #func.__doc__(),func.__name__()还是原函数的使用 def inner(*args,**kwargs): '''在函数被调用之前添加的代码''' ret = func(*args,**kwargs) # func是被装饰的函数,在这里被调用 '''在函数被调用之后添加的代码''' return ret return inner @wrapper func(): 函数体
4)带参数的装饰器
@wrapper --> @warpper(argument) 三层嵌套函数 def outer(形参): #比如传入一flag,用来控制innner()函数内部的使用 def wrapper(func): def inner(*args,**kwargs): '''在函数被调用之前添加的代码''' ret = func(*args,**kwargs) # func是被装饰的函数,在这里被调用 '''在函数被调用之后添加的代码''' return ret return inner @outer(True) func(): 函数体
2.迭代器
print(dir([]) #告诉我列表拥有的所有方法
可以for循环的:list ,dict ,set ,tuple ,enumerate([]) ,range(10), str, f(文件句柄)
只要是能被for 循环的数据类型,就一定拥有__iter__方法
只要含有__iter__方法都是可迭代的 -- 可迭代协议,
[].__iter__()迭代器,--> __next__ 通过next就可以从迭代器中一个一个的取值
迭代器协议 -- 内部含有__next__和__iter__方法就是迭代器
当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代,是否有iter方法
1 # print('__iter__' in dir(dict)) 2 # print([].__iter__()) 3 # 一个列表执行了__iter__()之后的返回值就是一个迭代器 4 print(dir([])) 5 print(dir([].__iter__())) 6 print(set(dir([].__iter__())) - set(dir([])))
迭代器的好处:
从容器类型中一个一个的取值,会把所有的值都取到
节省内存空间(range,f)
迭代器并不会在内存中再占用一大块内存(而是随着循环,每次生成一个,每次next每次给一个)
3.生成器 -- 迭代器
生成器函数--本质上是我们写的函数
1 # 只要含有yield关键字的函数都是生成器函数 2 # yield不能和return共用且需要写作函数内 3 def generator(): 4 print(1) 5 yield 'a' 6 # 生成器函数:执行之后会得到一个生成器作为返回值 7 ret = generator() 8 print(ret) 9 print(ret.__next__())
1 def generator(): # 生成器函数 2 print(1) 3 yield 'a' 4 print(2) 5 yield 'b' 6 g = generator() #生成器 7 # ret = g.__next__() 8 # print(ret) 9 # ret = g.__next__() 10 # print(ret) 11 for i in g: 12 print(i)
def wahaha(): for i in range(2000000): yield 'wahaha%d'%i g = wahaha() for i in g: print(i)
监听文件输入例子
1 def tell(filename): 2 f = open(filename,'r',encoding='gbk') 3 while True: # for循环只能读存在的,不能读新写 4 line = f.readline() 5 if line.strip(): # strip(),默认去掉空格,换行符。或者去掉特定字符串 6 yield line.strip() 7 8 g = tell('F:\hi.txt') # 该迭代器可以对文件中的内容进行操作 9 for i in g: 10 print('***',i)
浙公网安备 33010602011771号