打开《Python入门与实战》_一步步学会Python_8.4.2 案例解析
201
2023-10-19
【摘要】 本书摘自《Python3快速入门与实战》一书中第4章,第7节,由肖冠宇、杨捷等编著。
4.7 闭包
在本书第2 章学习条件判断和循环时,我们已经知道条件判断和循环是可以嵌套使用 的,那么函数内是否也可以嵌套函数呢?答案是可以的,这就是本节闭包要实现的功能。所 谓闭包就是指当一个嵌套函数的内部函数引用了外部函数的变量,外部函数的返回值是内部 函数的引用,这种函数的表达方式我们称之为闭包。先通过示例说明闭包的使用。
例4-15 分别定义一个普通求和函数和一个闭包求和函数,对比两种函数的不同(源 代码位置: chapter04/4.7 闭包.py)。
案例代码如下:
#普通函数,求两个数字的和
def sum(x,y):
return x+y
#闭包,求两个数字的和
#外部函数
def sum closure(x)
#内部函数
def sum inner(y):
#调用外部函数的变量x
return x+y
#外部函数返回值是内部函数的引用return sum inner
rs1=sum(10,1)
#打印 rsl 的值
print("rsl={}".format(rs1))
#打印 rs1 的类型
print("rs1的类型:".format(type(rs1)))
rs func=sum closure(10)
#打印rs func的值
print("rs func={}".format(rs func))
#打印rs func的类型
print("rs func 的类型:{}".format(type(rs func)))
运行结果如下:
rsl=11
rsl 的类型:_ _ _
rs func的类型:解析:从运行结果看,变量rsl的类型是int 整数类型,变量rs func的类型是 function 函 数类型。原因是rs1是普通函数 sum 返回的两个数字的和, rs func 是闭包函数 sum closure 返 回的内部函数 sum inner 的引用,也就是说rs func 指向函数 sum inner,rs func 可以像普通 函数一样被调用。
接下来我们调用函数rs func,了解闭包函数的使用。
例4- 16 闭包函数的使用(源代码位置: chapter04/4.7 闭包.py)。
案例代码如下:
rs2=rs func(1)
print("rs2={}".format(rs2))
print("rs2的类型:0".format(type(rs2)))
运行结果如下:
rs2=11
rs2的类型:解析:从运行结果看,变量 rs2 是函数 rs func 的返回值,这个返回值计算的是10加1 的结果,由于在闭包函数 sum closure的内部函数 sum inner 中调用了外部函数的变量x, 根 据例4- 15程序的执行,此时x=10, 所以rs2的结果是10加1的计算结果11。
通过上面两个示例可以基本了解闭包的概念和闭包函数的用法。
闭包在实际工程项目中可以做很多事情。比如,需要实现一个计数器的功能,每调用一 次计数器则值增加1。下面使用普通函数和闭包分别来实现这样一个计数器。
例4- 17 使用普通函数实现计数器(源代码位置: chapter04/4.7 闭包.py)。案例代码如下:
Ⅲ
参数说明:
base: 整型,表示基准值,计数器在基准值上累加,初始值为0
step: 整型,表示步长,初始值为1
m
def counter func(base=0,step=1):
return base+step
cl=counter func()
print("当前计数器值为:{}".format(c1))
c2=counter func(cl)
print("当前计数器值为:0}".format(c2))
c3=counter func(c2)
print("当前计数器值为:{}".format(c3))
运行结果如下:
当前计数器值为:1
当前计数器值为:2
当前计数器值为:3
解析:使用普通函数实现了计数器的功能,并且可以灵活地定义基准值和步长。但问题 也很明显,就是每调用一次计数器函数都要把上一次的计数器结果作为参数传入,很容易传 错参数,调用过程有些复杂,代码量比较大。
例4- 18 使用闭包实现计数器(源代码位置: chapter04/4.7 闭包.py)。 案例代码如下:
def counter closure(base=0):
#在外部函数中定义一个列表类型的变量,存储计数器的累加基数
cnt base =[base]
def counter(step=1):
cnt base[0]+= step
return cnt base[0]
return counter
counter =counter closure()
print("当前计数器值为:{}".format(counter()))
print("当前计数器值为:{}".format(counter()))
print("当前计数器值为:{".format(counter()))
运行结果如下:
当前计数器值为:1
当前计数器值为:2
当前计数器值为:3
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~