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

举例说明

普通的求积函数是

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. 2017-3-25 css样式表(一)

    样式表: 一.样式表的概念:CSS(Cascading Style Sheets)层叠式样式表,作用是美化HTML网页. 二.样式表的分类:样式表分内联式样式表.内嵌式样式表和外部样式表三种. 1.内 ...

  2. Spring中一个类的注入和引用是不一样的

    1.在Spring管理下的bean需要以下面这种方式引入(一种注入方式): private MgrService mgrService; public MgrService getMgrService ...

  3. block、块级作用域

    block:语句块 (或其他语言中的 复合语句) 用来组织零个或多条语句. 包含在{ }里面 通常在流程控制语句 (如 if, for, while)中使用 块级作用域:通过var声明的变量没有块级作 ...

  4. java实现8种排序算法(详细)

    八种排序分别是:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 希尔排序在时间性能上优于直接插入排序,但希尔排序是一种不稳定排序. 快速排序的时间性能也优于冒泡 ...

  5. js全选与反选

    HTML结构: <!doctype html><html><head><meta charset="utf-8"><title ...

  6. 【C++】智能指针详解(一):智能指针的引入

    智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式. 在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域或程序异常退出之前,我们必须手动释放掉它,否则的话就会引 ...

  7. Redis简单几步

    第一步redis安装:1.首先确认下载包为64位的还是32位的2.下载http://code.google.com/p/servicestack/downloads3.解压下载包得到以下文件:cygw ...

  8. Diary of Codeforces Round #402 (Div. 2)

    这一场的表现可以用"全程智障"4个字,生动传神地描述出来. About 写题: A. 写了一堆if比较大小, 这很勤勉.(绝对值君对自己の存在感为0表示很难过.) B. 题,直接读 ...

  9. 老李分享: JSON

    老李分享: JSON    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478, ...

  10. Spring实战——缓存

    缓存 提到缓存,你能想到什么?一级缓存,二级缓存,web缓存,redis-- 你所能想到的各种包罗万象存在的打着缓存旗号存在的各种技术或者实现,无非都是宣扬缓存技术的优势就是快,无需反复查询等. 当然 ...