python学习之“闭包”

一、闭包的定义
内层函数引用外层函数的变量(外层函数中的参数也算变量,但不包括全局变量),然后返回内层函数的情况,称为闭包。比如:

第一种情况:内部函数引用外部函数的参数变量

# -*- coding: utf-8 -*-
def function_A(x): #外层函数A,有一个参数变量为x
	def function_B(y): #定义一个内部函数
		return x*y #内部函数引用外部函数参数变量进行计算
	return function_B #返回内部函数
f = function_A(10) #调用外部函数并传递参数10进去(即x=10),注意外部函数返回值是内部函数function_B()
print type(f) #打印f的类型(结果为‘function’(即函数))
print f.__name__ #打印函数f的名称(结果为function_B)
print f(6) #给函数f传递参数6(即y=6),打印结果即为x*y=10*6=60

运行结果如图:
在这里插入图片描述
第二种情况:内部函数引用外部函数的局部变量

# -*- coding: utf-8 -*-
def function_A(): #外层函数A
	x = 10 #定义局部变量x并赋值10
	def function_B(y):  #定义一个内部函数
		return x*y #内部函数引用外部函数局部变量进行计算
	return function_B #返回内部函数
f = function_A() #调用外部函数,注意外部函数返回值是内部函数function_B()
print type(f) #打印f的类型(结果为‘function’(即函数))
print f.__name__ #打印函数f的名称(结果为function_B)
print f(6) #给函数f传递参数6(即y=6),打印结果即为x*y=10*6=60

运行结果与第一种情况一致
以上两种情况均可称为“闭包”

二、闭包的特点:
**闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变(返回闭包不要引用任何循环变量)。**举例:

# 希望一次返回3个函数,分别计算1x1,2x2,3x3:
# -*- coding: utf-8 -*-
def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()
print f1(),f2(),f3()  #打印结果全为9,不符合要求

为什么没有出现理想的结果:原因就是内层函数f()在调用局部变量i时,i的值已经变化了。
在语句 f1, f2, f3 = count()中,内部函数f并没有被调用,因为外层函数count()的返回值并不是内部函数。所以当count返回了三个函数之后,i值就变成了3,因此后面调用f1(),f2(),f3()是返回的就是3*3=9.

如何修改?

# -*- coding: utf-8 -*-
def count():
	fs = []
	for i in range(1,4):
		def f(j):#通过闭包来实现
			def g():
				return j*j
			return g #返回的闭包没有引用循环变量i
		r = f(i)  #循环调用闭包
		fs.append(r)
	return fs

f1,f2,f3 = count() #count()返回3次函数
print f1(),f2(),f3()

此时可返回正确的结果 1 4 9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值