python函数嵌套闭包_为什么不将python嵌套函数称为闭包?

The question has already been answered by aaronasterling

但是,有人可能会对变量如何存储在引擎盖下感兴趣 .

Before coming to the snippet:

闭包是从其封闭环境继承变量的函数 . 当你将函数回调作为参数传递给另一个将执行I / O的函数时,这个回调函数将在稍后调用,并且这个函数将 - 几乎神奇地 - 记住声明它的上下文,以及所有可用的变量在这种情况下 .

如果函数不使用自由变量,则它不会形成闭包 .

如果有另一个内部级别使用自由变量 - 所有以前的级别都保存词法环境(最后的例子)

函数属性 func_closure in python < 3.X or closure in python > 3.X save the free variables.

python中的每个函数都有这个闭包属性,但如果没有自由变量,它不会保存任何内容 .

example: of closure attributes but no content inside as there is no free variable.

>>> def foo():

... def fii():

... pass

... return fii

...

>>> f = foo()

>>> f.func_closure

>>> 'func_closure' in dir(f)

True

>>>

NB: FREE VARIABLE IS MUST TO CREATE A CLOSURE.

我将解释使用与上面相同的代码段:

>>> def make_printer(msg):

... def printer():

... print msg

... return printer

...

>>> printer = make_printer('Foo!')

>>> printer() #Output: Foo!

并且所有Python函数都有一个闭包属性,所以让我们检查与闭包函数关联的封闭变量 .

这是函数 func_closure 的属性 func_closure

>>> 'func_closure' in dir(printer)

True

>>> printer.func_closure

(,)

>>>

closure 属性返回一个单元格对象元组,其中包含封闭范围中定义的变量的详细信息 .

func_closure中的第一个元素可以是None或包含函数自由变量绑定的单元格元组,它是只读的 .

>>> dir(printer.func_closure[0])

['__class__', '__cmp__', '__delattr__', '__doc__', '__format__', '__getattribute__',

'__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',

'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'cell_contents']

>>>

在上面的输出中你可以看到 cell_contents ,让我们看看它存储的内容:

>>> printer.func_closure[0].cell_contents

'Foo!'

>>> type(printer.func_closure[0].cell_contents)

>>>

因此,当我们调用函数 printer() 时,它会访问 cell_contents 中存储的值 . 这就是我们如何得到输出'Foo!'

我将再次解释使用上面的代码片段进行一些更改:

>>> def make_printer(msg):

... def printer():

... pass

... return printer

...

>>> printer = make_printer('Foo!')

>>> printer.func_closure

>>>

在上面的代码片段中,我不打印打印机功能内的msg,因此它不会创建任何自由变量 . 由于没有自由变量,闭包内部将没有内容 . 这正是我们上面看到的 .

现在我将解释另一个不同的片段,以清除所有 Free Variable 与 Closure :

>>> def outer(x):

... def intermediate(y):

... free = 'free'

... def inner(z):

... return '%s %s %s %s' % (x, y, free, z)

... return inner

... return intermediate

...

>>> outer('I')('am')('variable')

'I am free variable'

>>>

>>> inter = outer('I')

>>> inter.func_closure

(,)

>>> inter.func_closure[0].cell_contents

'I'

>>> inn = inter('am')

因此,我们看到 func_closure 属性是闭包单元格的元组,我们可以明确地引用它们及其内容 - 单元格具有属性"cell_contents"

>>> inn.func_closure

(,

,

)

>>> for i in inn.func_closure:

... print i.cell_contents

...

free

am

I

>>>

这里当我们调用 inn 时,它会引用所有保存自由变量,所以我们得到 I am free variable

>>> inn('variable')

'I am free variable'

>>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值