高阶函数可以把函数作为一个结果值返回

举例说明

普通的求积函数是

vim day5-6.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
def product(*arg): #定义求积函数
a = 1 #初始值
for i in arg: #迭代循环传递的列表
a = a * i
return a #返回值 f = product(1,2,3,4) print f

运行结果24

如果不需要立即运算而是要在以后的程序中有需要的时候在运算,可以不返回结果而是返回函数

vim day5-7.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
def lazy_product(*arg):
def product():
a = 1
for i in arg:
a = a * i
return a
return product f = lazy_product(1,2,3,4) print f

执行结果

可以看出返回是一个函数体没有执行,并且每次运行返回的值是不一样的即使每次传递的参数是一样的

修改代码最后加一行

print f()

加了()函数才会执行

这种程序结构成为闭包

为了更好理解函数返回的是函数体只有在调用的时候才会执行,在来看一个例子

vim day5-8.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs f1, f2, f3 = count()
print f1(),f2(),f3()

输出会是什么呢

首先来分析函数的执行过程

1,def count():把函数count放入内存

2,f1, f2, f3 = count()调用函数把函数生成的列表分别返回给f1,f2,f3

count函数是执行一个循环并且把循环生成的函数体返回

3,执行f1,f2,f3

有人认为返回应该是1,4,9 其实返回是9,9,9

原因在于函数内引用了变量i但是没有立即执行,知道调用的时候才执行,这个时候i的值已经变为3了

为了更好了看清楚执行过程,修改一下代码,把每一步的执行结果输出

vim day5-9.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
def count():
fs = []
for i in range(1,4):
def f():
return i*i
fs.append(f)
print fs,i,fs[i-1]() #输出每一次循环时候得到的函数体f,i的值(1,2,3)以及执行这个函数的结果
print fs,i #三次循环结束以后得到的fs列表
return fs #把列表作为函数的返回值,列表内容为函数体
f1,f2,f3 = count() #调用count函数把结果返回给f1,f2,f3
print f1,f2,f3 #查看f1,f2,f3得到的函数体
print f1(),f2(),f3() #执行查看结果

执行结果

输出的前面三行的执行三次循环得到的fs以及i的值及i*i的值,第四行是循环结束后得到的fs列表和i的值 第五行是count函数返回的列表fs赋值给f1,f2,f3

第六行是执行的时候输出的结果,因为这个时候i的值已经是3了所以得到的结果是9,9,9

												

Python之返回函数的更多相关文章

  1. python基础——返回函数

    python基础——返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回.  我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_ ...

  2. python中返回函数

    Python的函数不但可以返回int.str.list.dict等数据类型,还可以返回函数! 例如,定义一个函数 f(),我们让它返回一个函数 g,可以这样写: def f(): print 'cal ...

  3. Python:Base4(map,reduce,filter,自定义排序函数(sorted),返回函数,闭包,匿名函数(lambda) )

    1.python把函数作为参数: 在2.1小节中,我们讲了高阶函数的概念,并编写了一个简单的高阶函数: def add(x, y, f): return f(x) + f(y) 如果传入abs作为参数 ...

  4. python的高级特性3:神奇的__call__与返回函数

    __call__是一个很神奇的特性,只要某个类型中有__call__方法,,我们可以把这个类型的对象当作函数来使用. 也许说的比较抽象,举个例子就会明白. In [107]: f = abs In [ ...

  5. python 返回函数

    返回函数 Python的函数不但可以返回int.str.list.dict等数据类型,还可以返回函数! 例如,定义一个函数 f(),我们让它返回一个函数 g,可以这样写: def f(): print ...

  6. python学习之---匿名函数,返回函数,偏函数

    1. 返回函数: 所谓的返回函数,指的是函数作为返回值.高阶函数除了可以接受函数作为参数外,同样可以接受函数作为结果返回.以下是一个可变参数的求和例子,一般求和函数是如此这般定义的: >> ...

  7. Python进阶之返回函数

    返回函数 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB"," ...

  8. 2017寒假零基础学习Python系列之函数之 返回多个值

    Python也和C语言一样有自己的标准库,不过在Python中叫做模块(module),这个和C语言中的头文件以及Java中的包类似,其中math就是其中之一,math模块中提供了sin()和cos( ...

  9. python -- 返回函数、匿名函数、装饰器

    返回函数 高阶函数的参数可以是函数,那么其返回值也可以是函数. 闭包 对于高阶函数,内部函数可以引用外部函数的参数和局部变量.当调用外部函数返回内部函数时,相关参数和变量都保存在返回的函数(即内部函数 ...

随机推荐

  1. IIS7 / IIS7.5 URL 重写 HTTP 重定向到 HTTPS

    1.购买SSL证书,参考:http://www.cnblogs.com/yipu/p/3722135.html 2.IIS7 / IIS 7.5 下绑定 HTTPS 网站(购买Wildcard SSL ...

  2. smm框架学习------smm框架整合实现登录功能(一)

    一.准备所需的jar包 1.1所需jar包 1.Spring框架jar包 2.Mybatis框架jar包 3.Spring的AOP事务jar包 4.Mybatis整合Spring中间件jar包 5.a ...

  3. Python可视化学习(1):Matplotlib的配置

    Matplotlib是一个优秀的可视化库,它提供了丰富的接口,让Python的可视化落地显得非常容易上手.本系列是本人学习python可视化的学习笔记,主要用于监督自己的学习进度,同时也希望和相关的博 ...

  4. 当Node.js遇见Docker

    Node.js Best Practices - How to Become a Better Developer in 2017提到的几点,我们Fundebug深有同感: 使用ES6 使用Promi ...

  5. 任务调度之持久化(基于Quartz.net)

    上一篇我们了解了任务调度及他的远端管理方式,传送门:任务调度及远端管理(基于Quartz.net) 这篇我们要完成任务调度的持久化功能,即新增修改删除之类的功能,这必须得要有的,不然都不知道后台都有什 ...

  6. Poptest学员之当小厨师变成测试开发工程师

    没开玩笑,这是我们的真实案例.做培训以来,各行各业转行做测试的学员见得太多了.修车的.客服的.销售的.司机的.医护的.前台的等等.职位虽然不分贵贱,但是薪资却分多少.每个人心中都有让家人和自己过上好日 ...

  7. Spring基础学习(三)—详解Bean(下)

    一.Bean的生命周期 1.概述      Spring IOC容器可以管理Bean的生命周期,Spring 允许在Bean的生命周期的特定点执行定制的任务.      Spring IOC容器对Be ...

  8. JavaWeb总结(四)—JSP深入解析

    一.JSP域对象 1.JSP属性范围(域对象范围) JSP提供了四个域对象,分别是pageContext.request.session.application. pageContext: 属性范围仅 ...

  9. HNOI2017前被虐记及感悟

    本文所记录的时间以HNOI2017第一天考试时间为DAY1,前一天为DAY0,以此类推. 本文记载了博主从HNOI2017开始前一周进行全真模拟考试的被虐过程和结果.文章内可能包含博主的不良情绪,如果 ...

  10. BZOJ1857 传送带 (三分法求单峰函数极值)

    第一次发BZOJ的题解,先从水题开始吧,好不容易找到一道水题,那就从这题开始吧. 1.题设部分{ 题目描述: 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线 ...