廖雪峰的Python-返回函数

时间:2022-08-16 22:37:47

一、返回函数

返回值是一个函数的高阶函数。高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

  • 例1:可变参数的求和
#!/usr/bin/env python
#-*- coding: utf-8 -*-


def calc_sum(*args):
ax = 0
for n in args:
ax = ax + n
return ax


y = calc_sum(1,2,3,4,5)

print y


注:(可变参数:即一个函数可以接收多个参数,而这些参数的个数在函数调用之前事先是不知道的。)
*args&kwargs:在函数定义中使用*args和kwargs传递可变长参数. *args用作传递非命名键值可变长参数列表(位置参数); kwargs用作传递键值可变长参数列表)
详细内容见:1、廖雪峰-函数参数 2、wklken-PYTHON中如何使用*ARGS和**KWARGS 3、虫虫购-Python中可变参数的函数

如果不需要立刻求和,在后面的代码中,根据需要再计算可以不返回求和的结果,而是返回求和的函数。

  • 例2:返回函数求和
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum



二、闭包

注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。

另一个需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了f()才执行。

  • 例3: 含局部变量的返回函数
#!/usr/bin/env 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()
9 9 9
在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果是:9,9,9全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:

  • 例4:含循环变量的返回函数(1)
#!/usr/bin/env python
#-*- coding: utf-8 -*-

def count():
fs = []
for i in range(1,4):
def f(j):
def g():
return j*j
return g
fs.append(f(i))
return fs

f1,f2,f3 = count()

print f1(),f2(),f3()

1,4,9



注:count()函数是返回fs这个list,这个list中的元素是函数而不是数字,就像[f(),f(),f()],
f1,f2,f3=count() 就是f1,f2,f3=[f(),f(),f()] 当然这个f()是count里面的,
第一个f()赋给了f1,第二个f()赋给了f2,...这样赋值方法。


另一种写法是:

  • 例5:含循环变量的返回函数(2)

#!/usr/bin/env python
#-*- coding: utf-8 -*-

def count():
fs = []
for i in range(1,4):
def f(j=i):
return j*j
fs.append(f)
return fs

f1,f2,f3 = count()

print f1(),f2(),f3()

1,4,9



2017年6月12日18:29:14
修改于

2017年6月13日12:49:56