廖雪峰的Python-返回函数
来源:互联网 发布:linux弱口令扫描工具 编辑:程序博客网 时间:2024/06/05 10:57
一、返回函数
返回值是一个函数的高阶函数。高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
- 例1:可变参数的求和
#!/usr/bin/env python#-*- coding: utf-8 -*-def calc_sum(*args): ax = 0 for n in args:ax = ax + n return axy = calc_sum(1,2,3,4,5)print y
注:(可变参数:即一个函数可以接收多个参数,而这些参数的个数在函数调用之前事先是不知道的。)
(*args&kwargs:在函数定义中使用*args和kwargs传递可变长参数. *args用作传递非命名键值可变长参数列表(位置参数); kwargs用作传递键值可变长参数列表)
详细内容见:1、廖雪峰-函数参数 2、wklken-PYTHON中如何使用*ARGS和**KWARGS 3、虫虫购-Python中可变参数的函数
如果不需要立刻求和,在后面的代码中,根据需要再计算可以不返回求和的结果,而是返回求和的函数。
- 例2:返回函数求和
def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum
二、闭包
注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。
另一个需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了f()才执行。
- 例3: 含局部变量的返回函数
#!/usr/bin/env python#-*- coding: utf-8 -*-def count():fs = []for i in range(1,4):def f():return i*ifs.append(f)return fsf1,f2,f3 = count()print f1(),f2(),f3()9 9 9
在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果是:9,9,9全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如果一定要引用循环变量怎么办?
方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:
- 例4:含循环变量的返回函数(1)
#!/usr/bin/env python#-*- coding: utf-8 -*-def count():fs = []for i in range(1,4):def f(j):def g():return j*jreturn gfs.append(f(i))return fsf1,f2,f3 = count()print f1(),f2(),f3()1,4,9
注:count()函数是返回fs这个list,这个list中的元素是函数而不是数字,就像[f(),f(),f()],
f1,f2,f3=count() 就是f1,f2,f3=[f(),f(),f()] 当然这个f()是count里面的,
第一个f()赋给了f1,第二个f()赋给了f2,...这样赋值方法。
另一种写法是:
- 例5:含循环变量的返回函数(2)
#!/usr/bin/env python#-*- coding: utf-8 -*-def count():fs = []for i in range(1,4):def f(j=i):return j*jfs.append(f)return fsf1,f2,f3 = count()print f1(),f2(),f3()1,4,9
2017年6月12日18:29:14
修改于
2017年6月13日12:49:56
阅读全文
0 0
- 廖雪峰的Python-返回函数
- 廖雪峰的Python-匿名函数-lambda
- 读廖雪峰的 Python 教程小结--------Python函数
- 廖雪峰python教程阅读之函数的参数
- Python学习-函数的参数(来自廖雪峰网站)
- 廖雪峰的Python学习笔记二-函数
- 廖雪峰的Python教程-高阶函数
- 廖雪峰python函数的参数学习笔记
- 廖雪峰的Python教程
- 廖雪峰的Python-filter
- 廖雪峰python学习笔记7:函数
- 廖雪峰python教程阅读之函数
- 【廖雪峰Python习题集】调用函数
- 【廖雪峰Python习题集】定义函数
- [廖雪峰 - Python2.7教程] 返回函数 - 学习笔记
- [廖雪峰 - Python2.7教程] 返回函数2 - 学习笔记
- 廖雪峰Python的研读笔记(一) Python基础、函数、高级特性
- 廖雪峰的Git、Python教程
- 架构师培训,如何低成本体系性学习? + 最佳实践架构师+自学+老师型:
- java多线程之等待/唤醒机制
- Eclipse中JDK与JRE区别
- Swift-UIButton规避重复点击
- java使用qq发送邮件
- 廖雪峰的Python-返回函数
- CentOS修改Tomcat端口号
- 贪心之钱币找零问题
- 循环冗余检验CRC(Cyclic Redundancy Check)
- KMP算法java实现
- SpringBoot Junit 测试加载 xml 读取 bean 失败
- fig11_06.cpp
- Java通用与进阶知识,仅用于自身补充
- JAVA高级特性:泛型