python中闭包Closure函数作为返回值的方法示例


Posted in Python onDecember 17, 2017

前言

首先看看闭包的概念:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,闭包是由函数和与其相关的引用环境组合而成的实体。

一、函数作为返回值

高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

>>> def lazy_sum(*args):
...  def sum():
...   ax = 0
...   for n in args:
...    ax = ax + n
...   return ax
...  return sum
... 
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x1014ae730>
>>> f()
25

当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数:

>>> f1 = lazy_sum(1, 3, 5, 7)
>>> f2 = lazy_sum(1, 3, 5, 7)
>>> f1
<function lazy_sum.<locals>.sum at 0x1014ae8c8>
>>> f2
<function lazy_sum.<locals>.sum at 0x1014ae7b8>
>>> f1 == f2
False

二、闭包

在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

简单的说,这种内部函数可以使用外部函数变量的行为,就叫闭包

在这个例子中,我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。

注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。

返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

>>> def count():
...  fs = []
...  for i in range(1, 4):
...   def f():
...    return i * i
...   fs.append(f)
...  return fs
... 
>>> f1, f2, f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
9

全部都是9!原因就在于返回的函数引用了循环变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。

如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:

>>> def count():
...  def f(j):
...   def g():
...    return j * j
...   return g
...  fs = []
...  for i in range(1, 4):
...   fs.append(f(i))
...  return fs
... 
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
利用python获得时间的实例说明
Mar 25 Python
Python的__builtin__模块中的一些要点知识
May 02 Python
Python使用PyCrypto实现AES加密功能示例
May 22 Python
Python的语言类型(详解)
Jun 24 Python
Python实现的NN神经网络算法完整示例
Jun 19 Python
Django模板Templates使用方法详解
Jul 19 Python
Python线程threading模块用法详解
Feb 26 Python
python代码实现将列表中重复元素之间的内容全部滤除
May 22 Python
python使用re模块爬取豆瓣Top250电影
Oct 20 Python
python从PDF中提取数据的示例
Oct 30 Python
python实战之用emoji表情生成文字
May 08 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 Python
django模板语法学习之include示例详解
Dec 17 #Python
详解python string类型 bytes类型 bytearray类型
Dec 16 #Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 #Python
python读取与写入csv格式文件的示例代码
Dec 16 #Python
浅谈用VSCode写python的正确姿势
Dec 16 #Python
numpy中索引和切片详解
Dec 15 #Python
Python实现简单网页图片抓取完整代码实例
Dec 15 #Python
You might like
一个简单的php实现的MySQL数据浏览器
2007/03/11 PHP
PHP新手入门学习方法
2011/05/08 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
js获取当前select 元素值的代码
2010/04/19 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
JS的get和set使用示例
2014/02/20 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
2020/08/31 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
基于python的汉字转GBK码实现代码
2012/02/19 Python
Django中实现点击图片链接强制直接下载的方法
2015/05/14 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
Mac安装python3的方法步骤
2019/08/09 Python
pytorch 预训练层的使用方法
2019/08/20 Python
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
食品安全标语
2014/06/07 职场文书
门面房租房协议书
2014/08/20 职场文书
部队反四风对照检查材料
2014/09/26 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
房产电话营销开场白
2015/05/29 职场文书