#闭包函数,其中 exponent 称为自由变量 def nth_power(exponent): def exponent_of(base): return base ** exponent return exponent_of # 返回值是 exponent_of 函数 square = nth_power(2) # 计算一个数的平方 cube = nth_power(3) # 计算一个数的立方 print(square(2)) # 计算 2 的平方 print(cube(2)) # 计算 2 的立方运行结果为:
4
8
def nth_power_rewrite(base, exponent): return base ** exponent上面程序确实可以实现相同的功能,不过使用闭包,可以让程序变得更简洁易读。设想一下,比如需要计算很多个数的平方,那么读者觉得写成下面哪一种形式更好呢?
# 不使用闭包 res1 = nth_power_rewrite(base1, 2) res2 = nth_power_rewrite(base2, 2) res3 = nth_power_rewrite(base3, 2) # 使用闭包 square = nth_power(2) res1 = square(base1) res2 = square(base2) res3 = square(base3)显然第二种方式表达更为简洁,在每次调用函数时,都可以少输入一个参数。
def nth_power(exponent): def exponent_of(base): return base ** exponent return exponent_of square = nth_power(2) #查看 __closure__ 的值 print(square.__closure__)输出结果为:
(<cell at 0x0000014454DFA948: int object at 0x00000000513CC6D0>,)
可以看到,显示的内容是一个 int 整数类型,这就是 square 中自由变量 exponent 的初始值。还可以看到,__closure__ 属性的类型是一个元组,这表明闭包可以支持多个自由变量的形式。
本文链接:http://task.lmcjl.com/news/9564.html