python高阶函数——返回函数(闭包)
首先,来看一个一般意义的求和:
>>> def cal_sum(*args):
... sum = 0
... for i in args:
... sum = sum + i
... return sum
...
>>> cal_sum(1,2,3,4)
10
如果我们这么定义呢:
>>> def lazy_sum(*args):
... def sum():
... sum = 0
... for i in args:
... sum = sum + i
... return sum
... return sum
...
>>> l = lazy_sum(1,2,3,4)
>>> l
<function lazy_sum.<locals>.sum at 0x00E4A198>
我们发现,这种定义的函数,返回的并不是一个具体的求和,而是一个函数!来看看怎么调用这个函数:
>>> l()
10
在这个例子中,lazy_sum中又定义了一个函数sum(),这个内部函数可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这就是‘闭包’。
再来试验一下:
>>> l1=lazy_sum(1,2,3,4)
>>> l2=lazy_sum(1,2,3,4)
>>> l1==l2
False
我们发现,l1和l2互不影响!这说明lazy_sum每次调用都返回一个新函数,即使传入的参数相同。
其实,返回的函数在其定义的内部引用了局部变量args,当一个函数返回了一个函数后,其内部的局部变量还能被新函数引用。另外,返回的函数并没有立即被执行,而是直到调用了l()后才执行。通过下面的例子再来加深一下印象
例子1:
>>> def count():
... f = []
... for i in range(1,4):
... def fp():
... return i * i
... f.append(fp)
... return f
...
>>> f1,f2,f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
9
全部都是9,并不是1,4,9.原因在于返回的函数引用了变量i,但它并没有立即执行。等三个函数都返回时,他们所引用的变量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)) #f(i)立即被执行,变量i的当前值被传入f()
... return fs
...
>>> f1,f2,f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9
python高阶函数——返回函数(闭包)的更多相关文章
- python 高阶内置函数
1.lambda 匿名函数 lambda 参数: 返回值 函数名统一都叫lambda. 2.sorted() 排序函数 排序函数 sorted(iterable,key,reverse) key:排序 ...
- Python高阶函数及函数柯里化
1 Python高阶函数 接收函数为参数,或者把函数作为结果返回的函数为高阶函数. 1.1 自定义sort函数 要求:仿照内建函数sorted,自行实现一个sort函数.内建函数sorted函数是返回 ...
- Python高阶函数_map/reduce/filter函数
本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过 ...
- python——高阶函数:高阶函数
python高阶函数 00初识高阶函数 一等公民 函数在python中是一等公民(First-Class Object),同样和变量一样,函数也是对象,只不过是可调用的对象,所以函数也可以作为一个普通 ...
- python高阶函数的使用
目录 python高阶函数的使用 1.map 2.reduce 3.filter 4.sorted 5.小结 python高阶函数的使用 1.map Python内建了map()函数,map()函数接 ...
- python 高阶函数之filter
前文说到python高阶函数之map,相信大家对python中的高阶函数有所了解,此次继续分享python中的另一个高阶函数filter. 先看一下filter() 函数签名 >>> ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- python函数式编程之返回函数、匿名函数、装饰器、偏函数学习
python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...
- Python高阶用法总结
目录 1. lambda匿名函数 1.1 函数式编程 1.2 应用在闭包 2. 列表解析式 3. enumerate内建函数 4. 迭代器与生成器 4.1 迭代器 4.3 生成器 5. 装饰器 前言: ...
- JS进阶-特殊形式的函数-返回函数的函数/重写自己的函数
返回函数的函数 // 返回函数的函数 function a() { alert("aa"); return function () { alert("bb"); ...
随机推荐
- yarn和npm的对比以及yarn的使用
0--前言 为什么要使用yarn,如果你从事前端开发有些年头了,那你肯定对npm又爱又恨,爱就不说了,恨嘛,就是NPM经常奇慢和卡顿,这还能忍,经常各种错误就没法忍了,尤其是他人创建的项目,自己在安装 ...
- LVS+Keepalived-DR模式(Apache)
Environment:4台CentOS机器 两台LVS 两台web服务器 LVS主备的操作,都需要安装ipvsadm和keepalived LVS主机操作 : 1.更改Keepalived的配置文件 ...
- c, ANSI C, embedded c, after IKM online assessment
C programming language was developed in 1972 by Dennis Ritchie at bell laboratories of AT&T (Ame ...
- PyTorch官方教程中文版
首先呈上链接:http://pytorch123.com/ PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序.它主要由Facebookd的人工智能小组开发,不 ...
- plsql判断和循环
if语句 语法1 如果条件成立,执行if和end if 之间的语句. if 条件表达式 then plsql语句; end if; 语法2 if 条件表达式 then 条件成立时执行的语句; else ...
- oracle开启关闭日志归档
oracle归档日志开启之后,会产生大量的日志,需要定时清理以及不重要的数据库可以不开启归档模式,下面介绍一下oracle归档开启.关闭以及日志的删除:一.oracle归档日志开启及关闭1.登录服务端 ...
- Seata AT 模式启动源码分析
从上一篇文章「分布式事务中间件Seata的设计原理」讲了下 Seata AT 模式的一些设计原理,从中也知道了 AT 模式的三个角色(RM.TM.TC),接下来我会更新 Seata 源码分析系列文章. ...
- mac查看开关机记录-last命令
命令 last | grep reboot (查看开机时间记录) last | grep shutdown (查看关机时间记录) /var/log/messages日志中查询reboot(系统重启) ...
- 数据库Oracle的安装与卸载
Oracle的安装步骤: 口令管理里面有scott,需要重新设置其口令,scott是测试表,里面有现成的表可以用来做实验. Oracle 自带客户端工具 SQLPlus sys 用户登录命令: sy ...
- [TimLinux] CSS 计数功能实现递归目录
内容引用自<css世界>: count-reset 与 counter 为父子关系,兄弟关系会导致序号混乱 调用一次 count-increment 将给序号进行一次报数,调用 count ...