函数初识: 函数名的命名规则:和变量相同===》 1:数字、字母、下划线任意组合,不能使用空格、连字符、标点符号、引号或其他字符。==》不能是中文,也不能以数字开头 2:不可以是Python中的关键字 3:也不能随意起名,要具有可描述性, 4:长度没有限制,但是也不应太过冗长 5:可以使用官方推荐的字体:驼峰体,下划线体 def caculate(a,b): # def关键字:definition + 函数名 # 注意:函数要有返回值 res = a+b return res 函数: 本质:封装一个功能 作用/优点: 重复代码少,可读性强,复用性强 执行顺序: 代码从上到下执行的过程中遇到函数时只读取函数名,但是并不执行函数内的程序,而是被调用时才执行 装饰器初识: 作用/功能:在不改变原函数名的情况下,为函数增添额外的功能 import functools def wrapper(func): @functools.wraps(func) # functools.wraps()作用:保留原函数的信息,将装饰器伪装的更像原函数 def inner(*args,**kwargs): """被装饰之前""" ret = func(*args,**kwargs) """被装饰之后""" return ret def inner @wrapper def func(*args,**kwargs): # 在函数定义时/形参阶段:*args,**kwargs接收所有参数:*arg会把多出来的位置参数转化为tuple;**kwarg会把关键字参数转化为dict print("我是func") flag = True return flag func(*args,**kwargs) ########################################################### 多个装饰器装饰一个函数 def wrapper1(f): # f == func,传进来的函数名 def inner1(*args,**kwargs): """被装饰之前""" print('wrapper1 ,before func') # 3 f() # 4 """被装饰之后""" print('wrapper1 ,after func') # 5 return inner1 def wrapper2(f): # f == inner1 def inner2(*args,**kwargs): print('wrapper2 ,before func') # 2 f() print('wrapper2 ,after func') # 6 return inner2 def wrapper3(f): # f==inner2 def inner3(*args,**kwargs): print('wrapper3 ,before func') # 1 f() print('wrapper3 ,after func') # 7 return inner3 @wrapper3 # f = wrapper3(func) ==>f = wrapper3(inner2)==>里面的func == inner2 外面的func == inner3 @wrapper2 # f = wrapper2(func) ==>f = wrapper2(inner1)==>里面的func == inner1 外面的func == inner2 @wrapper1 # f = wrapper1(func) ==>f = wrapper(func)里面的func == 函数名func 外面的func == inner1 def func(): print('i am in func') flag = True return flag f() """ wrapper3 ,before func wrapper2 ,before func wrapper1 ,before func i am in func wrapper1 ,after func wrapper2 ,after func wrapper3 ,after func """ ############################################## 带参数的装饰器==>三层函数嵌套 def timmer(*args,**kwargs): def wrapper(f): # f == func1 def inner(*args,**kwargs): """被装饰之前""" ret = f(*args,**kwargs) # 执行函数func1并得到结果 """被装饰之后""" return ret return inner return wrapper @timmer(*args,**kwargs) # 两步:1,函数名加括号==》执行该函数,timmer(*args,**kwargs) --> wrapper 2,@wrapper 装饰器==>wrapper(func1) def func1(): print("执行函数func1") @timmer(*args,**kwargs) def func2(): print("执行函数func2") flag = True return flag func1() func2()