来源:自学PHP网 时间:2020-09-27 14:57 作者:小飞侠 阅读:次
[导读] 详解python中的闭包...
|
今天带来详解python中的闭包教程详解
闭包的概念 我们尝试从概念上去理解一下闭包。
def make_printer(msg):
def printer():
print(msg) # 夹带私货(外部变量)
return printer # 返回的是函数,带私货的函数
printer = make_printer("Foo!")
printer()
支持将函数当成对象使用的编程语言,一般都支持闭包。比如python,JavaScript。 如何理解闭包 闭包存在有什么意义呢?为什么需要闭包
def tag(tag_name):
def add_tag(content):
return "<{0}>{1}</{0}>".format(tag_name, content)
return add_tag
content = "Hello"
add_tag = tag('a')
print(add_tag(content)) # <a>Hello</a>
add_tag = tag('b')
print(add_tag(content)) # <b>Hello</b>
在这个例子里,我们想要给content加tag功能,但是具体的tag_name是什么样子的要根据实际需求来定,对外部调用的接口已经确定,就是add_tag(content)。如果按照面向接口方式实现,我们会先把add_tag写成接口,指定其函数和返回类型,然后分别去实现a和b的add_tag。 何时使用闭包 其实闭包在python中很常见,只不过你没特别注意这就是一个闭包。比如python中的装饰器Decorator,假如你需要写一个带参数的装饰器,那么一般都会生成闭包。
# how to define
def wrapper(func1): # 接受一个callable对象
return func1 # 返回一个对象,一般为函数
# how to use
def target_func(args): # 目标函数
pass
# 调用方式1,直接包裹
result = wrapper(target_func("123"))
# 调用方式2,使用@语法,等同于方式1
@wrapper
def target_func(args):
pass
result = target_func()
那么如果你的装饰器带参数呢?那么你就需要在原来的装饰器上再包一层,用于接收这些参数。这些参数(私货)传递到内层装饰器后,闭包就形成了。所以说当你的装饰器需要自定义参数时,一般都会形成闭包(类装饰器除外)
def html_tags(tag_name):
def wrapper_(func):
def wrapper(*args, **kwargs):
content = func(*args, **kwargs)
return "<{tag}>{content}</{tag}>".format(tag=tag_name, content=content)
return wrapper
return wrapper_
@html_tags('a')
def hello(name='Toby'):
return "Hello {}!".format(name)
# 不用@的写法
# hello = html_tags('b')(hello)
# html_tags('b') 是一个闭包,它接受一个函数,并返回一个函数
print(hello()) # <a>Hello Toby!</a>
print(hello("world")) # <a>Hello world!</a>
再了解下闭包到底长什么样子。其实闭包函数相对于普通函数会多出一个__closure__的属性,里面定义了一个元组用于存放所以的cell对象,每个 cell对象一一保存了这个闭包中所有的外部变量。
def make_printer(msg1, msg2):
def printer():
print(msg1, msg2)
return printer
printer = make_printer('Foo', 'Bar') # 形成闭包
print(printer.__closure__) # 返回cell元组
(<cell at 0x000002721C1D2138: str object at 0x000002721C1F2068>, <cell at 0x000002722B199CD8: str object at 0x000002721C1F20A0>)
print(printer.__closure__[0].cell_contents) # 第一个外部变量'Foo'
print(printer.__closure__[1].cell_contents) # 第二个外部变量'Bar'
以上就是详解python中的闭包的详细内容,更多关于python 闭包的资料请关注自学php网其它相关文章! 以上就是关于详解python中的闭包全部内容,感谢大家支持自学php网。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com