来源:自学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