一,函数名的运用
函数名可以像变量一样,进行赋值操作
1,函数名的内存地址 打印函数名(不加括号),打印出来的是一个地址
def func(): print("呵呵") print(func) #<function func at 0x1024cb048>
2,函数可以作为容器(list,tuple,dict)的元素,保存在容器内
def func1(): print("哈哈") def func2(): print("呵呵") def func3(): print("哈哈哈") lst = [func1,func2,func3] for i in lst: i() # 哈哈 # 呵呵 # 哈哈哈
3,函数可以作为返回值返回
def func1(): print("哈哈") def func2(): print("哈哈2") print("哈哈1") return func2 fn = func1() fn() # 哈哈 # 哈哈1 # 哈哈2
4,函数可以作为参数进行传递
def func(): print("哈哈") def func2(fn): #这里的fn是func print("我是func2") fn() #执行传递过来的fn print("我是func2") func2(func) # 我是func2 # 哈哈 # 我是func2
5,函数名可以赋值给其他变量
def func(): print("呵呵") a = func a() #呵呵
二,闭包
1,目的:让内存永远记住一个变量 (闭包的作用就是让一个变量能够常驻内存,供后面的程序使用)
在内层函数里面访问外层函数的局部变量,叫闭包,这个时候,外层的这个局部变量,将会常驻内存
def func1(): name = "alex" def func2(): print(name) #这个地方引用了上层的name,就是闭包 func2() func1() #alex
我们可以使用_closure_来检测函数是否是闭包,使用函数名._closure_返回cell就是闭包,返回None就不是闭包
def func1(): name = "alex" def func2(): print(name) #alex func2() print(func2.__closure__) #(<cell at 0x102a7c048: str object at 0x1025b05a8>,) func1()
在函数外边调用内部函数
def outer(): name = "alex" def inner(): print(name) return inner fn = outer() fn()
三,装饰器初识
开闭原则(开放封闭原则):对添加功能开放,对修改代码封闭,优点是代码好维护
装饰器的作用就是在不修改原有代码的基础上,给函数扩展功能
def wrapper(fn):
def innre(*args,**kwargs):
'''目标函数之前要做什么'''
ret = fn(*args,**kwargs)
'''目标函数之后要做什么"
return ret
return inner
@wrapper #语法糖
def target()
pass