返回函数
将函数作为返回值返回
作用:比如求和,我们一般将实现写在函数中,然后调用这个函数,但是若我们不需要立即求和,而是在后面的代码中,根据需要再计算
比如:
def s(n):
print('s')
def su():
print('su')
sum=0
m=0
for m in n:
sum=sum+m
return sum
print('end')
return su
代码执行如下:
>>> f=s([1,2,3,4,5])
s
end
>>> f()
su
15
可以看出,函数首先执行内部函数外的代码,并返回内部函数,当调用时,再执行内部函数。
当有多个返回值呢?
def fun():
print('fun')
def fun1():
print('fun1')
def fun2():
print('fun2')
print('end')
return fun1,fun2
由前面函数那一节可知,有多个返回值,其实返回的是一个tuple
,所以若需要使用函数fun1
则:
>>> f=fun()
fun
end
>>> f[0]()
fun1
闭包
闭包比较复杂,难以理解。返回函数中不要引用任何可能会变化的变量
def fun():
L=[]
for m in range(1,4):
print('fun')
def sum():
print('sum')
return m*m
return sum
执行结果如下:
>>> f=fun()
fun
fun
fun
>>> f
<function fun.<locals>.sum at 0x000001DA11E71378>
>>> f()
sum
9
可以看出,只有一个返回函数被执行。
def count():
print('count()')
def f(j):
print('f()函数')
return j*j
fs = []
for i in range(1, 4):
print('count()的循环')
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
执行结果如下:
>>> f=count()
count()
count()的循环
f()函数
count()的循环
f()函数
count()的循环
f()函数
>>> f
[1, 4, 9]
可以看出,得到的是返回的数列,和普通函数一样,实时执行了内部函数,所以为了有所区别,我们使用以下代码:
def count():
print('count()')
def f(j):
print('f()函数')
def s():
return j*j
return s
fs = []
for i in range(1, 4):
print('count()的循环')
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
执行结果如下:
>>> f=count()
count()
count()的循环
f()函数
count()的循环
f()函数
count()的循环
f()函数
>>> f
[<function count.<locals>.f.<locals>.s at 0x00000287E29116A8>, <function count.<locals>.f.<locals>.s at 0x00000287E2911730>, <function count.<locals>.f.<locals>.s at 0x00000287E29117B8>]
>>> f[0]()
1
>>> f[1]()
4
可以看到,在调用函数之前,并没有执行s()
函数的代码,而是一个返回元素都是函数地址的list
,然后调用每个元素,才执行s()
函数。
匿名函数lambda
lambda x:表达式
关键字lambda
表示匿名函数,冒号前面的x
表示函数参数,匿名函数只能有一个表达式,不用写return
,返回值就是该表达式的结果
- 将匿名函数赋给变量
>>> a=lambda x : x*x
>>> a(10)
100
- 将匿名函数作为返回值
def f(x, y):
return lambda: x * x + y * y
执行如下:
f(10,20)
<function f.<locals>.<lambda> at 0x00000287E29111E0>
>>> f(10,20)()
30
所以,返回值是一个无参数的匿名函数。