目录
一、基础概念
1、装饰器
1、装饰器本质就是函数
2、实现装饰器知识储备
1、函数即变量
2、高阶函数
3、嵌套函数
例子
1、将一个函数名作为实参传递给另外一个函数
2、返回值为函数名
3、函数嵌套函数
4、完整装饰器例子
5、装饰器高级版本
2、列表生成器
3、生成器
4、斐波那契数列
5、迭代器
6、内置函数
7、json、pickle序列化
8、软件目录结构规范
一、基础概念
1、装饰器:
1、装饰器本质上就是函数,用来装饰其他函数
原则:装饰器写好后,原则上不能修改其他函数源代码
1、不能修改被装饰函数源代码
2、不能修改被装饰函数调用方式
总结成一点就是装饰器对被装饰函数完全透明,用这个函数的人完全不知道装饰器的存在
2、实现装饰器的知识储备
1、函数即变量
在python中,变量定义值,在内存中开辟一块空间存放该变量值,当变量名不再引用该变量值后,python解释器会自动回收该值所在内存,函数也是如此,通过函数名调用函数体,当函数名不再引用该函数体,函数体从内存中被解释器回收。
2、高阶函数
a)把一个函数名作为实参传递给另外一个函数,在不修改被装饰函数源代码情况下为其添加功能
b)返回值为该函数名,不修改函数的调用方式
3、嵌套函数
在一个函数内通过def声明一个函数
装饰器=高阶函数+嵌套函数
例子
1、将一个函数名作为实参传递给另外一个函数
def test1(func): #传入函数名作为实参 func() def bar(): print('in the bar!') test1(bar) #输出: in the bar!
import time def bar(): print('in the bar!') def test1(func): start_time = time.time() func()# 运行bar函数 stop_time = time.time() print('the func running time is %s' %(stop_time-start_time)) test1(bar) #输出: in the bar! the func running time is 8.58306884765625e-05
2、返回值为函数名
import time def bar(): print('in the bar!') def test1(func): print(func) return func bar = test1(bar) #将bar函数名作为参数传递给函数test1内,同时返回值为bar函数名而不是bar函数执行结果,并将其重新赋值给bar bar() #执行bar()会先执行test1,打印bar对应的内存地址,然后执行bar函数对应的函数体内容 #输出: <function bar at 0x289a464> in the bar!
3、函数嵌套函数
def foo(): print('in the foo') def bar(): print('in the bar') return bar() #执行foo时会返回bar函数执行结果 foo() #输出: in the foo in the bar
4、完整装饰器例子
import time def deco(func): def wrapper(*args,**kwargs): #无论原始函数自身带任何参数均可以在这包含 start_time = time.time() func(*args,**kwargs) #当test1传入时,执行test1的返回结果,如果源函数携带参数,这里可以在执行原函数时带源函数所带参数 stop_time = time.time() print('the func time is %s' %(stop_time-start_time)) return wrapper #直接返回函数名 @deco #@deco 等价于 test1 = deco(test1) def test1(name): time.sleep(3) print('in the test1') print('the name is %s' %name) test1('gavin') #输出: in the test1 the name is gavin the func time is 3.0022261142730713
import time def deco(func): def wrapper(*args,**kwargs): #无论原始函数自身带任何参数均可以在这包含 start_time = time.time() func(*args,**kwargs) #当test1传入时,执行test1的返回结果,如果源函数携带参数,这里可以在执行原函数时带源函数所带参数 stop_time = time.time() print('the func time is %s' %(stop_time-start_time)) return wrapper #直接返回函数名 @deco #@deco 等价于 test1 = deco(test1) def test1(name): time.sleep(3) #print('in the test1') #print('the name is %s' %name) return name #返回name值 print(test1('gavin')) #输出: the func time is 3.0015320777893066 None #用该方法没法返回源函数需要返回的参数
import time def deco(func): def wrapper(*args,**kwargs): #无论原始函数自身带任何参数均可以在这包含 start_time = time.time() res = func(*args,**kwargs) #当test1传入时,执行test1的返回结果,如果源函数携带参数,这里可以在执行原函数时带源函数所带参数 stop_time = time.time() print('the func time is %s' %(stop_time-start_time)) return res #当需要被修饰函数有返回值时,可以在装饰器中将其返回 return wrapper #直接返回函数名 @deco #@deco 等价于 test1 = deco(test1) def test1(name): time.sleep(3) #print('in the test1') #print('the name is %s' %name) return name print(test1('gavin')) #输出 the func time is 3.00175404548645 gavin
5、装饰器高级版本:通过装饰器来划分不同的登录认证界面
#版本一,通过不带参数的auth装饰器来完成home与bbs认证 user,passwd = 'gavin','123' def auth(func): def wrapper(*args,**kwargs): username = input('usernmae: ').strip() password = input('password: ').strip() if user == username and passwd == password: print('