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

yipeiwu_com5年前Python基础

一、闭包

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

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

3.闭包常见的坑

def count():
  #定义列表
fs = []
for i in range(1, 4):
  def f():
  return i * i
fs.append(f)
# 按照我们的预期, 应该是fs = [f, f, f].其中f中一次包含1, 4, 9, 这样才对, 但实际结果不是, 我么接着看
return fs
f1, 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 fs
f4,f5,f6 = count2()
print(f4(),f5(),f6())

二、装饰器

def hello():
  print("我是一个程序")
f = hello
f()
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

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

相关文章

Python使用numpy模块实现矩阵和列表的连接操作方法

Numpy模块被广泛用于科学和数值计算,自然有它的强大之处,之前对于特征处理中需要进行数据列表或者矩阵拼接的时候都是自己写的函数来完成的,今天发现一个好玩的函数,不仅好玩,关键性能强大,...

利用Python产生加密表和解密表的实现方法

利用Python产生加密表和解密表的实现方法

序言: 这是我第一次写博客,有不足之处,希望大家指出,谢谢! 这次的题目一共有三个难度,分别是简单,中等偏下,中等。对于一些刚刚入门的小伙伴来说,比较友好。废话不多说,直接进入正题。...

Python+pandas计算数据相关系数的实例

本文主要演示pandas中DataFrame对象corr()方法的用法,该方法用来计算DataFrame对象中所有列之间的相关系数(包括pearson相关系数、Kendall Tau相关...

python查询mysql中文乱码问题

问题: python2.7 查询或者插入中文数据在mysql中的时候出现中文乱码 --- 可能情况: 1.mysql数据库各项没有设置编码,默认为'latin' 2.使用MySQL.co...

python文本数据相似度的度量

编辑距离 编辑距离,又称为Levenshtein距离,是用于计算一个字符串转换为另一个字符串时,插入、删除和替换的次数。例如,将'dad'转换为'bad'需要一次替换操作,编辑距离为1。...