百万年薪python之路 -- 闭包
Posted zhangchaoyin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百万年薪python之路 -- 闭包相关的知识,希望对你有一定的参考价值。
2.闭包
闭包的定义:
- 闭包是嵌套在函数中的函数。
- 闭包必须是内层函数对外层函数的变量(非全局变量)的引用。
一句话定义就是:在嵌套函数内,对非全局变量 (且不是本层的变量)的引用
如何判断判断闭包?举例让同学回答:
# 例一:
def wrapper():
a = 1
def inner():
print(a)
return inner
ret = wrapper() #是
print(ret.__code__.co_freevars)
# 例二:
a = 2
def wrapper():
def inner():
print(a)
return inner
ret = wrapper() #不是
print(ret.__code__.co_freevars)
# 例三:
def wrapper(a,b):
def inner():
print(a)
print(b)
return inner
a = 2
b = 3
ret = wrapper(a,b) #是
print(ret.__code__.co_freevars)
以上三个例子,最难判断的是第三个,其实第三个也是闭包,如果我们每次去研究代码判断其是不是闭包,有一些不科学,或者过于麻烦了,那么有一些函数的属性是可以获取到此函数是否拥有自由变量的,如果此函数拥有自由变量,那么就可以侧面证明其是否是闭包函数了(了解):
自由变量的定义:在函数中使用的,但既不是函数参数也不是函数的局部变量的变量
def make_averager():
series = []
def averager(new_value):
series.append(new_value)
total = sum(series)
return total/len(series)
return averager
avg = make_averager()
# 函数名.__code__.co_freevars 查看函数的自由变量
print(avg.__code__.co_freevars) # ('series',)
当然还有一些参数,仅供了解:
# 函数名.__code__.co_freevars 查看函数的自由变量
print(avg.__code__.co_freevars) # ('series',)
# 函数名.__code__.co_varnames 查看函数的局部变量
print(avg.__code__.co_varnames) # ('new_value', 'total')
# 函数名.__closure__ 获取具体的自由变量对象,也就是cell对象。
# (<cell at 0x0000020070CB7618: int object at 0x000000005CA08090>,)
# cell_contents 自由变量具体的值
print(avg.__closure__[0].cell_contents) # []
用闭包写的小爬虫
from urllib.request import urlopen
def get_url():
url = 'http://www.xiaohua100.cn/index.html'
def get():
ret = urlopen(url).read()
print(ret)
return get
get_func = get_url()
get_func()
闭包的作用:保存局部信息不被销毁,保证数据的安全性。
闭包的应用:
- 可以保存一些非全局变量但是不易被销毁、改变的数据。
- 装饰器。
以上是关于百万年薪python之路 -- 闭包的主要内容,如果未能解决你的问题,请参考以下文章