pyhotn3入门基础-14 返回函数和匿名函数
来源:互联网 发布:flv parser for mac 编辑:程序博客网 时间:2024/05/17 03:49
返回函数
函数作为返回值
如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数:
def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum
lazy_sum()
时,返回的并不是求和结果,而是求和函数:
>>> f = lazy_sum(1, 3, 5, 7, 9)>>> f<function lazy_sum.<locals>.sum at 0x101c6ed90>调用函数
f
时,才真正计算求和的结果:>>> f()25
>>> f1 = lazy_sum(1, 3, 5, 7, 9)>>> f2 = lazy_sum(1, 3, 5, 7, 9)>>> f1==f2False
闭包
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fsf1, f2, f3 = count() //count返回的是长度为3的列表,要用3个来接收结果 或者用list l = count l[0]() l[1]() l[2]()
可能认为调用
f1()
,f2()
和f3()
结果应该是1
,4
,9
,但实际结果是:>>> 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)) # f(i)立刻被执行,因此i的当前值被传入f() return fs
小结
一个函数可以返回一个计算结果,也可以返回一个函数。
返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量
匿名函数>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))[1, 4, 9, 16, 25, 36, 49, 64, 81]
匿名函数
lambda x: x * x
实际上就是:def f(x): return x * x
关键字lambda
表示匿名函数,冒号前面的x
表示函数参数。
匿名函数有个限制,就是只能有一个表达式,不用写return
,返回值就是该表达式的结果。
def build(x, y): return lambda: x * x + y * y
阅读全文
0 0
- pyhotn3入门基础-14 返回函数和匿名函数
- pyhotn3入门基础-7函数
- pyhotn3入门基础-13 高阶函数
- Python3 基础:返回函数和匿名函数
- pyhotn3入门基础-15 装饰器与偏函数
- python入门基础函数和匿名函数
- pyhotn3入门基础-2数据类型和变量
- pyhotn3入门基础-1
- js 匿名函数 和 返回函数
- pyhotn3入门基础-4 使用list和tuple
- pyhotn3入门基础-6使用dict和set
- pyhotn3入门基础-3 字符串
- pyhotn3入门基础-8切片
- pyhotn3入门基础-11 生成器
- pyhotn3入门基础-12 迭代器
- 返回函数、匿名函数lambda、偏函数
- python基础-匿名函数
- pyhotn3入门基础-9迭代
- linux 软件包的命名规则
- linux rpm包的编译
- linux netstat命令
- 内部排序算法:堆排序
- TensorFlow 笔记(五):模型保存和恢复
- pyhotn3入门基础-14 返回函数和匿名函数
- ubuntu安装Google输入法
- C语言三种预处理功能
- java 读取src下的配置文件
- C51语言与汇编语言的关系
- oracle创建存储过程中遇到的问题
- SaltStack实战之配置管理-LAMP自动化部署
- 深度学习的Batch Normalization
- c3p0 数据库连接池相关知识