函数的运用,闭包
一,函数名的运用 二,闭包 三,装饰器
1.函数名的内存地址
2.函数名可以赋值给其他变量
3.函数名可以当做容器类的元素
4.函数名可以当做函数的参数
5.函数名可以作为函数的返回值
函数名的运用
函数名是一个变量,但是它是一个特殊的变量,与括号配合可以执行函数的变量
1.函数名的内存地址
def a(): print("我是a") print(a) # a是个地址. 这个地址是个函数 b = a # 函数可以赋值 b() #打印结果:<function a at 0x0000000001E68B70> #我是a
2.函数名可以赋值给其他变量
def func(): print("哈哈") a=func #把函数func当成一个变量赋值给另一个变量a a() #执行a,相当于执行func."函数调用"
3.函数名可以当做容器类的元素
def func1(): print("我是func1") def func2(): print("我是func2") def func3(): print("我是func3") lst = [func1, func2, func3] #把每个函数都放进一个列表 for e in lst: #循环拿出每个函数 e() # e表示的是lst中的每一个函数. 函数()执行函数. e() 执行每一个函数
4.函数名可以当做函数的参数
def func(): print("你在哪") def func2(fu): #(fu)就是把func拿来给(fu)了 print ("我是func2") fu() #执行传递过来的fu,函数后面跟空括号表示执行 print ("我是func2") func2(func) #把函数func当成函数传递给func2 的参数fu #结果:我是func2 #你在哪 #我是func2
5.函数名可以作为函数的返回值
def func1(): print ("函数1") def func2(): print("函数2") return func2 #把func2返回给func1 fu=func1() #此时的func1包括func1和func2,然后赋值给fu fu() #运行fu() #结果:函数1 函数2
闭包
什么是闭包? 闭包就是内层函数,对外层函数(非全局变量)的变量的引用,叫闭包.这个时候. 外层的这个局部变量将会常驻内存
目的: 让内存永远的记住一个变量
def func(): a=1 def inner(): print (a) #在这里内层函数引用外层函数 return inner fu=func() fu() #print (fu.__closure__) 这一段是检查闭包 #结果:1 #(<cell at 0x0000000001E28468: int object at 0x0000000077FB6C10>,) #闭包的结果 #返回None就不是闭包
#以爬虫为例
from urllib.request import urlopen def func(): content = urlopen("http://www.xiaohua100.cn/index.html").read() def inner(): print(content) #把外部函数content引用到内层函数 return inner fn = func() fn() print(fn.__closure__) # 检查闭包
装饰器
装饰器的作用:就是在不修改原有代码的基础上,给函数添加新的功能
#装饰器完整模型
def wrapper(func): def inner(*args,**kwargs): print ("xxx") #在执行目标函数之前要执行的内容 ret=func(*args,**kwargs) print ("xxx") #在执行目标函数之后要执行的内容 return ret return inner @wrapper # @wrpper就是语法糖 def func(): print ("xxx") #这个print里面的就是,目标函数 func() #调用目标函数
例题:
def wrapper (fn):
def inner(*args,**kwargs):
print("我们")
ret=fn(*args,**kwargs)
print("去吧")
return ret
return inner
@wrapper
def fn():
print ("一起")
fn()
#结果:我们 一起 去吧