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

举例说明

普通的求积函数是

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. CSS写动态下拉菜单 -----2017-03-27

    动态网站第一步:动态下拉菜单 关键点: overflow:hidden max-height xx:hover {} 设置当鼠标移上之后的效果 transition:   设置过度时间 cursor: ...

  2. Eclipese Mars安装SVN的全步骤

    在做毕业设计的过程中,由于是团队项目,需要用到SVN,而全新的Eclipse Mars从官网下载下来没有SVN插件,需要自己下载. 1.选择Help-->Eclipese MarketPlace ...

  3. java里的日期时间

    为了更好理解java的日期时间类,在这里我们先介绍一下关于历法.标准时间的一些概念. 历法有很多种,我们大中华上下五千年,自然也有自己的历法,生活中我们通常把自己传统的历法叫做农历,也有人叫它阴历或夏 ...

  4. java.lang.NoClassDefFoundError异常

    1.错误信息 2.错误分析: JVM读到程序的第三行,会在当前路径 "D:\java" 下寻找com.yangquan.aolun这个包路径下的Cat类,但当前路径下根本就没有co ...

  5. Mycat中的核心概念

      Mycat中的核心概念     Mycat中的核心概念 1.数据库中间件    Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有 存储引擎,所以并 ...

  6. 性能测试培训:定位jvm耗时函数

    性能测试培训:定位jvm耗时函数   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:90882 ...

  7. php 1到100累加 新方法

    <?php $sum = 0; for($i=0;$i<=100;$i++){ $sum += $i; } echo $sum; 之前只是这么写. 现在发现可以这么写 $sum = arr ...

  8. 解锁ORACLE数据库

    1.查找锁定数据库的用户 select username,lock_date from dba_users where username='scott';   2.解锁 alter user scot ...

  9. 第1课 - 学习Lua的意义

    学习Lua的意义 1.Lua简介             (1) 1993年.巴西 (2) 小巧精致的脚本语言,大小只有200K (3) 用标准C语言写成,能够在所有的平台上编译运行 (4) 发明的目 ...

  10. 细说OC中的load和initialize方法

    OC中有两个特殊的类方法,分别是load和initialize.本文总结一下这两个方法的区别于联系.使用场景和注意事项.Demo可以在我的Github上找到--load和initialize,如果觉得 ...