python闭包贴吧_Python 闭包

闭包

闭包描述

在嵌套函数中引用了自由变量的函数.这个自由变量就是外层嵌套函数中的变量(非全局变量)

闭包必须满足三个条件

1. 必须是嵌套函数

2. 内层嵌套函数必须引用了外层嵌套函数的变量

2. 外层嵌套函数的返回值是内层嵌套函数.

作用

嵌套函数的内层函数可以使用外层函数的变量,即使外层函数返回了,或者被删除了.内层函数依然可以使用外层函数的那个变量.

一个简单的闭包的示例

# encoding:utf-8

__author__ = 'Fioman'

__date__ = '2018/11/21 10:49'

# 闭包,fn使用了变量y并且外层函数make_power的返回值是fn(内层嵌套函数)

# 这个闭包可以实现x的y次方

def make_power(y):

# 自由变量就是y,当函数make_power返回后,fn依旧可以使用y的值

def fn(x):

return x ** y

return fn

# 让其实现平方的功能

f2 = make_power(2)

# 求某个数的平法

print("5的平法是:{}".format(f2(5)))

# 求立方的功能

f3 = make_power(3)

# 求某个数的立方

print("5的立方是:{}".format(5))

def outer_func():

loc_list = []

def inner_func(name):

loc_list.append(len(loc_list) + 1)

print '%sloc_list =%s' %(name, loc_list)

return inner_func

clo_func_0 = outer_func()

clo_func_0('clo_func_0')

clo_func_0('clo_func_0')

clo_func_0('clo_func_0')

clo_func_1 = outer_func()

clo_func_1('clo_func_1')

clo_func_0('clo_func_0')

clo_func_1('clo_func_1')

结果

clo_func_0 loc_list = [1]

clo_func_0 loc_list = [1, 2]

clo_func_0 loc_list = [1, 2, 3]

clo_func_1 loc_list = [1]

clo_func_0 loc_list = [1, 2, 3, 4]

clo_func_1 loc_list = [1, 2]

从上面这个简单的例子应该对闭包有一个直观的理解了。运行的结果也说明了闭包函数中引用的父函数中local variable既不具有C++中的全局变量的性质也没有static变量的行为。

在python中我们称上面的这个loc_list为闭包函数inner_func的一个自由变量(free variable)。If a name is bound in a block, it is a local variable of that block. If a name is bound at the module level, it is a global variable. (The variables of the module code block are local and global.) If a variable is used in a code block but not defined there, it is a free variable.

在这个例子中我们至少可以对闭包中引用的自由变量有如下的认识:闭包中的引用的自由变量只和具体的闭包有关联,闭包的每个实例引用的自由变量互不干扰。

一个闭包实例对其自由变量的修改会被传递到下一次该闭包实例的调用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值