1.上节内容回顾
递归:
- 明确的结束条件
- 问题规模每递归一次都应该比上一次的问题规模有所减少
- 效率低
高阶函数
文件:
rb、wb、ab
一般用在不同系统之间传数据,和传视频流的时候用到,一般以这种形式打开的需要制定encoding=‘utf-8’的字符编码形式
其他:
- f.seek()
- f.tell()
- f.truncate()
- f.flush()
2.装饰器
定义:装饰器本质是函数,(装饰其他函数)就是为其他函数添加附加功能
原则:
- 不能修改被装饰的函数的源代码
- 不能修改被装饰的函数的调用方式
言外之意就是说被装饰的函数在装饰器前都是完全透明的
实现装饰器知识储备:
- 函数即“变量”
- 高阶函数
-
-
- 把一个函数名当做实参传给另外一个函数(不修改被装饰函数源代码的情况下为期添加功能)
- 返回值中包含函数名(不修改函数的调用方式)
-
3.嵌套函数
一、函数的调用顺序:函数就像变量一样,在定义的时候就是把函数体赋值给函数名这样子,Python在调用函数之前,该函数一定要先被声明
1 def foo(): 2 print(foo) 3 bar() 4 foo() 5 def bar(): 6 print(bar) 7 #报错,bar函数还未声明
改正:
1 def foo(): 2 print('foo') 3 bar() 4 def bar(): 5 print('bar') 6 foo()
二、 高阶函数
1 def bar(): 2 print 'in the bar' 3 def foo(func): 4 res=func() 5 return res 6 foo(bar)
三、嵌套函数
1 def foo(): 2 def bar(): 3 print 'in the bar' 4 5 bar() 6 7 foo()
四、装饰器
装饰器的语法以@开头,接着就是装饰器要装饰的函数的声明
装饰器就是一个函数,一个用来包装函数的函数,装饰器在函数声明完成的时候被调用,调用之后声明的函数被换成一个被装饰器装饰过后的函数。
当函数有形参时,在装饰的函数中也需要有相应的形参;
当原函数有return返回值时,在装饰的函数中也要萹蓄有return func(args);
函数参数固定:
1 def decorator(func): 2 def wrapper(n): 3 print('atarting') 4 func(n) 5 print('stopping') 6 return wrapper 7 def test(n): 8 print('in the test arg is %s'%n) 9 decorator(test)('alex')
函数参数不固定
1 def decorator(func): 2 def wrapper(*args,**kwargs): 3 print('starting') 4 func(*args,**kwargs) 5 print('stopping') 6 return wrapper 7 def test(n,x=1): 8 print('in the test arg is %s,he is %d'%(n,x)) 9 decorator(test)('alex',x=2)
1.无参装饰器
1 import time 2 def decorator(func): 3 def wrapper(*args,**kwargs): 4 start =time.time() 5 func(*args,**kwargs) 6 stop = time.time() 7 print('run time is %s'%(stop-start)) 8 return wrapper 9 @decorator #test=decorator(test) 10 def test(list_test): 11 for i in list_test: 12 time.sleep(0.1) 13 print('_'*20,i) 14 test(range(10))
2.有参装饰器
1 import time 2 def timer(timeout =0): 3 def decorator(func): 4 def wrapper(*args,**kwargs): 5 start = time.time() 6 func(*args,**kwargs) 7 stop = time.time() 8 print("run time is %s"%(stop-start)) 9 print(timeout) 10 return wrapper 11 return decorator 12 @timer(2) #test=timer(2)(test) 13 def test(list_test): 14 for i in list_test: 15 time.sleep(0.1) 16 print('-'*20,i) 17 test(range(10))
高阶函数+嵌套函数=》装饰器
举一个复杂的例子:
1 import time 2 user,passwd = 'alex','abc123' 3 def auth(auth_type): 4 print("auth func:",auth_type) 5 def outer_wrapper(func): 6 def wrapper(*args, **kwargs): 7 print("wrapper func args:", *args, **kwargs) 8 if auth_type == "local": 9 username = input("Username:").strip() 10 password = input("Password:").strip() 11 if user == username and passwd == password: 12 print("