🚀 作者 :“大数据小禅”
🚀 粉丝福利 :加入小禅的大数据社群
🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬
目录
高级知识点之闭包
在万物皆对象的Python中,函数是否能作为函数的返回值进行返回呢?
为什么输出的结果会是64?
closure是内部函数的一个属性,用来保存环境变量
高频面试点之闭包经典问题
看看下面的程序的运行结果
高级知识点之闭包
在万物皆对象的Python中,函数是否能作为函数的返回值进行返回呢?
def my_power(): n = 2 def power(x): return x ** n return power #直接把这个函数给return回去 p = my_power() print(p(4)) 输出: 16
def my_power(): n = 2 def power(x): return x ** n return power n = 3 p = my_power() #在调用函数的时候n=2就被引用,不受n=3的影响。 print(p(4)) 输出: 16
n = 2 def my_power(): def power(x): return x ** n return power n = 3 #虽然上面由一个n=2,但是会找到距离最近的一个n=3替换进来。 p = my_power() print(p(4)) 输出: 64
例1 def my_power(): n = 2 def power(x): return x ** n return power p = my_power() print(p.__closure__) 结果:(<cell at 0x00000264518F9A38: int object at 0x00007FFA7F617120>,) #int类型
例2 n = 2 def my_power(): def power(x): return x ** n return power n = 3 p = my_power() print(p.__closure__) 输出结果 None
通过例1跟例2对比,我们可以知道,例2并不是闭包。注意了:!!!闭包指的是,在返回一个函数的同时,将这个函数所携带的一些环境,比如说环境变量n=2,去进行这个返回,而类似第二种就不是一个闭包,他返回的是一个函数。!!
高频面试点之闭包经典问题
下面的程序是否是闭包?能否正确运行
def my_power(): n = 2 def power(x): n += 1 #当在闭包里面的时候,没有办法直接修改n=2的值,所以这个程序会报错 return x ** n return power p = my_power() print(p(3))
def my_power(): n = 2 def power(x): nonlocal n #表示引用这个函数外面非全局变量,进行使用,这时候就可以修改这个值。 n += 1 return x ** n return power p = my_power() print(p.__closure__) #打印出来的是(<cell at 0x00000264518F9A38: int object at 0x00007FFA7F617120>,)可以看到这个变量类型被携带出来。 print(p(3)) print(p(3)) 输出: (<cell at 0x000001BD4D1BC738: int object at 0x00007FFEB90B7120>,) 27 81
def my_power(): n = 2 L = [] for i in range(1, 3): #因为这里产生1,2两个数字,所以下面会循环两次,要用f1,f2两个变量值来接收,不然报错 def power(): return i ** n #这里的i值是不可以确定的,在python中如果连传入的形参都不确定的话,那么python编译完会默认记住上面那个for循环的最后一个值,也就是都是2,所以导致最后面输出两个都是4,而不是一个1,一个4. L.append(power) return L f1, f2 = my_power() print(f1()) print(f2()) print(f1.__closure__[0].cell_contents) #看闭包里面携带的环境变量是多少 print(f2.__closure__[0].cell_contents) 输出: 4 4 2 2