Python学习札记(二十四) 函数式编程5 返回函数
参考:返回函数
NOTE
1.高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
eg.求和函数
#!/usr/bin/env python3
def calsums(*args):
ans = 0
for i in args:
ans = ans+i
return ans
def slowcalsums(*args):
def cal():
ans = 0
for i in args:
ans = ans+i
return ans
return cal
def main():
resf = slowcalsums(1, 2, 3, 4, 5)
print(resf)
print(resf())
if __name__ == '__main__':
main()
sh-3.2# ./func1.py
<function slowcalsums.<locals>.cal at 0x1013dab70>
15
可以看到slowcalsums函数返回的是一个函数,赋值给resf之后resf指向该函数,调用resf()得到计算结果。
2.上例中,在函数slowcalsums中定义了函数cal,并且,内部函数cal可以引用外部函数的参数和局部变量,当slowcalsums返回函数cal时,相关参数和变量都保存在返回的函数中。这种称为“闭包(Closure)”的程序结构拥有极大的威力。
3.注意,每一次调用返回函数的函数时,返回的函数都是新的函数:
newresf = slowcalsums(1, 2, 3, 4, 5)
if resf == newresf :
print('Yeah')
else :
print('Noop')
Noop
resf()与newresf()的调用结果互不影响。
4.Closure。
(1)注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用。
(2)注意,返回的函数没有立即执行,而是直到调用了f()才执行。
#!/usr/bin/env python
def count():
ans = []
for i in range(1, 4):
def f():
return i*i
# 往ans中插入未执行的f(),相当于保存算法,此时i一直在变,当最后调用时,i=3.
ans.append(f)
return ans
def main():
f1, f2, f3 = count() # 返回的是由函数组成的list
print(f1())
print(f2())
print(f3())
if __name__ == '__main__':
main()
你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果是:
sh-3.2# ./func2.py
9
9
9
因为变量i在第一个函数调用结束之后值为3.在f2和f3调用的时候值停留于3,于是结果均为9。
ps.无力吐槽的代码,为了说明而说明。
但是这样写的话,就不一样了:
def count1():
ans = []
def f():
for i in xrange(1, 4):
ans.append(i)
return ans
return f
def main():
a1, a2, a3 = count1(), count1(), count1()
print(a1())
print(a2())
print(a3())
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。
2017/2/17
Python学习札记(二十四) 函数式编程5 返回函数的更多相关文章
- Python学习札记(二十五) 函数式编程6 匿名函数
参考:匿名函数 NOTE 1.Python对匿名函数提供了有限的支持. eg. #!/usr/bin/env python3 def main(): lis = list(map(lambda x: ...
- Python学习札记(二十六) 函数式编程7 修饰器
修饰器 NOTE 1.函数对象有一个__name__属性,可以拿到函数的名字: #!/usr/bin/env python3 def now(): print('2017/2/19') def mai ...
- Python学习札记(三十四) 面向对象编程 Object Oriented Program 5
参考:获取对象信息 NOTE 1.type()函数可以用来判断对象的类型: >>> type(123) <class 'int'> >>> type(' ...
- Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍
参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...
- Python学习札记(二十二) 函数式编程3 filter & SyntaxError: unexpected EOF while parsing
参考: filter Problem SyntaxError: unexpected EOF while parsing 遇到该语法错误,一般是由于 括号不匹配 问题. Note 1.filter 用 ...
- Python学习(二十四)—— 前端基础之Bookstrap
转载自:http://www.cnblogs.com/liwenzhou/p/8214637.html 一.Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.Jav ...
- Python学习日记(二十四) 继承
继承 什么是继承?就是一个派生类(derived class)继承基类(base class)的字段和方法.一个类可以被多个类继承;在python中,一个类可以继承多个类. 父类可以称为基类和超类,而 ...
- Python学习札记(三十九) 面向对象编程 Object Oriented Program 10
参考:使用枚举类 NOTE #!/usr/bin/env python3 from enum import Enum def main(): Mouth = Enum('Mouth', ('Jan', ...
- Python学习札记(三十八) 面向对象编程 Object Oriented Program 9
参考:多重继承 NOTE #!/usr/bin/env python3 class Animal(object): def __init__(self, name): self.name = name ...
随机推荐
- 图论之最短路径(2)——Bellman-Ford算法
继续最短路径!说说Bellman—Ford算法 思路:假设起点为s,图中有n个顶点和m个边,那么它到任一点(比如i)的最短路径 最多可以有n-1条(没有回路就是n-1条):因为最短路径中不可能包含回路 ...
- 【黑金ZYNQ7000系列原创视频教程】04.熟悉ZYNQ内部中断——内部定时器中断实验
黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36638&extra=page%3D1 爱奇艺地址: http: ...
- javascript飞机大战-----002游戏引擎
基本html布局 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Jquery Uploadify使用参数详解
开始上传 $('#uploadify_1').uploadifyUpload(); 1 uploader uploadify.swf文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击 ...
- IIS 6.0上部署ASP.NET MVC2.0
在IIS7.5及8.0上部署都没有成功,对于身份验证会出现问题,据说是要安装什么东西,在这里说下IIS6.0的配置吧,下面是使用.net 4.0,自己可以选择所需的版本. 再此之前先确定web是用到了 ...
- HOJ 2252 The Priest(动态规划)
The Priest Source : 计算机学院第二届"光熙杯"程序设计大赛 Time limit : 3 sec Memory limit : 32 M Submitted : ...
- type="submit"
<?php var_dump($_REQUEST); ?> <form action="" id="javascript_page"> ...
- 大话存储1——存储系统的发展,计算机I/O
1 存储发展 存储在这里的含义为信息记录,是伴随人类活动出现的技术. 1. 竹简和纸张 竹简是中国古代使用的记录文字的工具,后来被纸张所取代,如图1.1所示. 2. 选数管 选数管是20世纪中期出现的 ...
- mysql 数据操作 单表查询 练习
查出所有员工的名字,薪资,格式为 <名字:egon>,<薪资:3000> mysql> select concat('<姓名:',name,'>') as n ...
- POJ -1062 昂贵的聘礼(前向星 && SPFA)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/30299671 题目链接:id=1062&qu ...