千家信息网

Python中闭包的概念和实例分析

发表于:2025-01-27 作者:千家信息网编辑
千家信息网最后更新 2025年01月27日,这篇文章主要讲解了"Python中闭包的概念和实例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Python中闭包的概念和实例分析"吧!Pytho
千家信息网最后更新 2025年01月27日Python中闭包的概念和实例分析

这篇文章主要讲解了"Python中闭包的概念和实例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Python中闭包的概念和实例分析"吧!

Python中闭包的概念:

我们尝试从概念上去理解一下闭包。在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组"私有"变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。简单来讲,当某个函数被当成对象返回时,夹带了外部变量,就形成了一个闭包。实例如下:

def make_printer(msg):

def printer():

print msg # 夹带私货(外部变量)

returnprinter # 返回的是函数,带私货的函数

printer = make_printer( Foo! )

printer()

Python中闭包存在的意义:

闭包存在有什么意义呢?为什么需要闭包?闭包存在的意义就是它夹带了外部变量(私货),如果它不夹带私货,它和普通的函数就没有任何区别。同一个的函数夹带了不同的私货,就实现了不同的功能。其实你也可以这么理解,闭包和面向接口编程的概念很像,可以把闭包理解成轻量级的接口封装。接口定义了一套对方法签名的约束规则,实例如下。

deftag(tag_name):

defadd_tag(content):

return"<{0}>{1}".format(tag_name,content)

returnadd_tag

content = Hello

add_tag = tag( a )

printadd_tag(content)

# Hello

add_tag = tag( b )

printadd_tag(content)

# Hello

在这个实例里,我们想要一个给content加tag的功能,但是具体的tag_name是什么样子的要根据实际需求来定,对外部调用的接口已经确定,就是add_tag(content)。如果按照面向接口方式实现,我们会先把add_tag写成接口,指定其参数和返回类型,然后分别去实现a和b的add_tag。但是在闭包的概念中,add_tag就是一个函数,它需要tag_name和content两个参数,只不过tag_name这个参数是打包带走的。所以一开始时就可以告诉我怎么打包,然后带走就行。

上面的实例不太生动,其实在我们生活和工作中,闭包的概念也很常见。比如说手机拨号,你只关心电话打给谁,而不会去纠结每个品牌的手机是怎么实现的,用到了哪些模块。再比如去餐馆吃饭,你只要付钱就可以享受到服务,你并不知道那桌饭菜用了多少地沟油。这些都可以看成闭包,返回来的是一些功能或者服务(打电话,用餐),但是这些功能使用了外部变量(天线,地沟油等等)。你也可以把一个类实例看成闭包,当你在构造这个类时,使用了不同的参数,这些参数就是闭包里的包,这个类对外提供的方法就是闭包的功能。但是类远远大于闭包,因为闭包只是一个可以执行的函数,但是类实例则有可能提供很多方法。

使用闭包的时机:

其实闭包在Python中很常见,只不过你没特别注意这就是一个闭包。比如Python中的装饰器Decorator,假如你需要写一个带参数的装饰器,那么一般都会生成闭包。为什么?因为Python的装饰器是一个固定的函数接口形式。它要求你的装饰器函数(或装饰器类)必须接受一个函数并返回一个函数:

# how to define

def wrapper(func1): # 接受一个callable对象

returnfunc2 # 返回一个对象,一般为函数

# how to use

def target_func(args): # 目标函数

pass

# 调用方式一,直接包裹

result = wrapper(target_func)(args)

# 调用方式二,使用@语法,等同于方式一

@wrapper

def target_func(args):

pass

result = target_func()

那么如果你的装饰器如果带参数呢?那么你就需要在原来的装饰器上再包一层,用于接收这些参数。这些参数(私货)传递到内层的装饰器里后,闭包就形成了。所以说当你的装饰器需要自定义参数时,一般都会形成闭包。(类装饰器例外)

defhtml_tags(tag_name):

defwrapper_(func):

defwrapper(*args, **kwargs):

content = func(*args, **kwargs)

return"<{tag}>{content}".format(tag=tag_name,content=content)

returnwrapper

returnwrapper_

@html_tags( b )

defhello(name= Toby ):

return Hello {}! .format(name)

# 不用@的写法如下

# hello = html_tag( b )(hello)

# html_tag( b ) 是一个闭包,它接受一个函数,并返回一个函数

printhello() # Hello Toby!

printhello( world ) # Hello world!

下面让我们来了解一下闭包的包到底长什么样子。其实闭包函数相对与普通函数会多出一个__closure__的属性,里面定义了一个元组用于存放所有的cell对象,每个cell对象一一保存了这个闭包中所有的外部变量。

>>> defmake_printer(msg1,msg2):

defprinter():

printmsg1,msg2

returnprinter

>>> printer = make_printer( Foo , Bar ) # 形成闭包

>>> printer.__closure__ # 返回cell元组

(, )

>>> printer.__closure__[0].cell_contents # 第一个外部变量

Foo

>>> printer.__closure__[1].cell_contents # 第二个外部变量

Bar

感谢各位的阅读,以上就是"Python中闭包的概念和实例分析"的内容了,经过本文的学习后,相信大家对Python中闭包的概念和实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

闭包 函数 实例 参数 变量 概念 就是 接口 私货 功能 对象 实例分析 分析 方式 不同 意义 方法 学习 普通 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 浪潮服务器刷新fru信息工具 群晖邮件服务器安全设置 软件开发互动平台在线学习 2b2t服务器没密码正常吗 tt服务器远程管理 初中生能学软件开发吗 技术软件开发公司缴纳什么税种 数据深圳软件开发一部 软件开发工程师证书是什么 数据库名称 数据库用户 失落的方舟steam服务器维护 软件开发拍摄素材有什么用 金蝶怎么在数据库反初始化 医保系统显示无法连接服务器 哈利波特里的服务器是什么 计算机网络技术接本考什么 尖峰知识竞赛网络安全 党统建立数据库失败 oa系统账号密码放在数据库哪里 易语言为什么打不开edb数据库 深圳市金科软件开发有限公司 企业怎样确保网络安全 一般数据库名称 excei如何做简单的数据库 手机修改服务器 db2数据库服务器存储空间 峰米科技是互联网公司吗 15项互联网领先科技成果乌镇 如果要禁止修改数据库中的表 合同软件开发的特征
0