装饰器
1、函数的引申
#实际上函数的名字可以被赋值,也可以作为一个容器类型的元素,可以作为函数的参数
#变量怎么使用,函数的名字都可以怎么用
例如:
def a():
print('in a ')
def wahaha(f): #形参是个变量
f() #形参加( ) 就是a() 函数的调用
wahaha(a) #传入的实参是个函数 的内存地址
2、函数名字作为返回值
def wahaha():
def a():
print('in a ')
return a ##这里是返回a 的内存地址 ,但是没有调用, 如果是return a() 就是会调用这个函数
func = wahaha()
func() ##这个() 就是a 函数的调用 相当于=a()
3、闭包
def wahaha():
name = 'alex'
def a();
print('ina',name) ####内层函数引用了外层函数的变量,那么a就是一个闭包函数
return a
4、闭包的用处
局部函数可以调用,但是全局调用不了,所以相对安全
5、装饰器固定格式
def 装饰器名字(func):
def inner(*args,**kwargs):
'''在执行被装饰的函数之前做的事'''
ret = func(*args,**kwargs)
'''在执行被装饰的函数之后做的事'''’
return ret
return inner
@装饰器名字
def wahaha():
pass
wahaha()
6、什么时候用装饰器?
#在已经写好的程序基础之上,需要对一个函数执行前后增加功能的时候
开放封闭原则:
开放:对扩展是开放的
封闭:对修改时的封闭,例如底层代码的封闭
7、 扩展
如果函数内部有注释例如:
def func(a,b):
‘’’
这是注释
‘’’
查看注释用:func.(doc)
查看函数的名字用:func.(name)
8、一个函数被好几个装饰器装饰
def wrapper(func):
def inner(*args,**kwargs):
print('start 1')
ret = func(*args,**kwagrs)
print('end 2')
return ret
return inner
9、自己理解带参数的装饰器
迭代器
1、定义
1.1 一个一个取值,而不是一次性把所有的数据都创建出来,迭代器中的数据不取不创建
1.2 只能按顺序取,不能跳过也不能回头
1.3 一个迭代器中的数据只能从头到尾取一次
2.可迭代协议
2.1 如果一个数据类型中,如果有iter方法,这个数据类型就是可迭代类型,
3.迭代器协议
3.1 一个数据类型中有iter和next方法,那么这个数据类型就是一个迭代类型
例如:
监听文件例子:
def listen():
f = open(‘test’,mode=‘r’,encoding=‘utf-8’)
while True:
content = f.readline().strip()
if content:
yield content
如果有错误日志的就打印出来
上述例子的
if content 就变更为 if ‘error’ in content
1、实时输出文件
for content in listen():
print(content )
列表推导式
1、 ls = 【i*i for i in range(30) if i%3==0】
print(ls)