参考:返回函数

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 返回函数的更多相关文章

  1. Python学习札记(二十五) 函数式编程6 匿名函数

    参考:匿名函数 NOTE 1.Python对匿名函数提供了有限的支持. eg. #!/usr/bin/env python3 def main(): lis = list(map(lambda x: ...

  2. Python学习札记(二十六) 函数式编程7 修饰器

    修饰器 NOTE 1.函数对象有一个__name__属性,可以拿到函数的名字: #!/usr/bin/env python3 def now(): print('2017/2/19') def mai ...

  3. Python学习札记(三十四) 面向对象编程 Object Oriented Program 5

    参考:获取对象信息 NOTE 1.type()函数可以用来判断对象的类型: >>> type(123) <class 'int'> >>> type(' ...

  4. Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍

    参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...

  5. Python学习札记(二十二) 函数式编程3 filter & SyntaxError: unexpected EOF while parsing

    参考: filter Problem SyntaxError: unexpected EOF while parsing 遇到该语法错误,一般是由于 括号不匹配 问题. Note 1.filter 用 ...

  6. Python学习(二十四)—— 前端基础之Bookstrap

    转载自:http://www.cnblogs.com/liwenzhou/p/8214637.html 一.Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.Jav ...

  7. Python学习日记(二十四) 继承

    继承 什么是继承?就是一个派生类(derived class)继承基类(base class)的字段和方法.一个类可以被多个类继承;在python中,一个类可以继承多个类. 父类可以称为基类和超类,而 ...

  8. Python学习札记(三十九) 面向对象编程 Object Oriented Program 10

    参考:使用枚举类 NOTE #!/usr/bin/env python3 from enum import Enum def main(): Mouth = Enum('Mouth', ('Jan', ...

  9. Python学习札记(三十八) 面向对象编程 Object Oriented Program 9

    参考:多重继承 NOTE #!/usr/bin/env python3 class Animal(object): def __init__(self, name): self.name = name ...

随机推荐

  1. 【黑金原创教程】【TimeQuest】TimeQuest原创教程连载导读【连载完成,共七章】

    [第一章]TimeQuest 静态时序分析模型的概念 [第二章]TimeQuest模型角色,网表概念,时序报告 [第三章]TimeQuest 扫盲文 [第四章]内部延迟与其他 [第五章]网表质量与外部 ...

  2. redis link 链表结构

    lpush key value 作用: 把值插入到链接头部 rpop key 作用: 返回并删除链表尾元素 lrange key start stop 作用: 返回链表中[start ,stop]中的 ...

  3. 一键搞定JavaEE应用,JRE+Tomcat+Mysql-JaveEE绿色运行环境JTM0.9版 (转载)

    这是一个集成了jre,tomcat,mysql的绿色运行环境, 直接解压之后就可以运行.不需要用户自己安装jre,tomcat,mysql,一键到位,看起来像是桌面式的web应用.换句话说,就像是we ...

  4. Win7系统右上角没有搜索怎么办?Win7找回资源管理器中的搜索框

    最近有win7系统用户发现打开资源管理器,文件夹等右上角没有搜索框,这让人十分不方便无法进行搜索,那么如何找回呢?下面小编就分享一下方法给大家.推荐 最好用的Win7系统下载 操作步骤: 1.打开Wi ...

  5. yii 表单如何写,action指向哪里?

    文本框:textInput(); 密码框:passwordInput(); 单选框:radio(),radioList(); 复选框:checkbox(),checkboxList(); 下拉框:dr ...

  6. Oracle之使用rman进行异机恢复测试记录

    本次测试目的是从生产数据库导出rman备份然后在测试数据库恢复 1,拷贝备份至相应目录 2,进入rman rman target \ 3,关闭数据库 shutdown 4,以nomount模式启动数据 ...

  7. 百度输入法引起的Mac远程桌面Ctrl+.快捷键不起作用

    被这个问题困扰已久!在Mac中通过远程桌面(Remote Desktop)连接至Windows服务器时,Ctrl+.快捷键不起作用,而这是用Visual Studio写代码时常用的快捷键(对应的命令是 ...

  8. 当url作为id时的删除

    API Documentation — Elasticsearch 6.3.1 documentation https://elasticsearch-py.readthedocs.io/en/mas ...

  9. python bug the C library strftime function.

    import timedef date2mktime(date, format_='%Y-%m-%d'): return int(time.mktime(time.strptime(date, for ...

  10. 005-ant design -结合echart

    原因: ant design本省提供图标组件,是基于 BizCharts ,但是使用有些限制比如:TimelineChart带有时间轴的图表.使用 TimelineChart 组件可以实现带有时间轴的 ...