函数初识:
函数名的命名规则:和变量相同===》
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()