首页 > 编程 > Python > 正文

Python closure闭包解释及其注意点详解

2019-11-25 11:50:17
字体:
来源:转载
供稿:网友

一、闭包

1.定义:当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数之中,这种结果,叫做闭包。

2.例子:连载17中的myF4就是一个典型的例子​。

3.闭包常见的坑

def count():  #定义列表fs = []for i in range(1, 4):  def f():  return i * ifs.append(f)# 按照我们的预期, 应该是fs = [f, f, f].其中f中一次包含1, 4, 9, 这样才对, 但实际结果不是, 我么接着看return fsf1, f2, f3 = count()print(f1(), f2(), f3())

不是我们预期的1 4 9。

(1)原因分析:返回函数引用了变量i,i并非立即执行,而是等到三个函数都返回的时候才统一执行,此时i已经变为3,最终调用的时候却反回了3*3.

(2)总结:返回闭包的时候,返回函数不能引用任何循环变量了

(3)解决方案:再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变,已经绑定的函数参数值不变。

​改进代码:

def count2():  def f(j):    def g():      return j*j    return g  fs = []  for i in range(1,4):    fs.append(f(i))    #我们进行了传参,因此j就固定下来,它就执行了j  return fsf4,f5,f6 = count2()print(f4(),f5(),f6())

二、装饰器

def hello():  print("我是一个程序")f = hellof()hello()#用id来证明f和hello是一个函数print(id(f),id(hello))

三、源码:

d20_2_closure_interpretation

地址:https://github.com/ruigege66/Python_learning/blob/master/d20_2_closure_interpretation

,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表