9.函数式编程
9.1闭包
9.1.1函数也是对象
在Python3中,没有函数重载。即当函数名相同,参数列表不同时,后面定义的函数会覆盖前面定义的函数。
#程序9-1
def add(x,y):
return x+y
def add(x,y,z):
return x+y+z
print(add(1,2))
print(add(1,2,3))
运行结果:
Traceback (most recent call last):
File ".\run.py", line 10, in <module>
print(add(1,2))
TypeError: add() missing 1 required positional argument: 'z'
在Python3中,一切皆对象。即函数、类都是对象。
#程序9-2
def add(x,y):
return x+y
f = add
print(f(1,2))
class Student():
def print_info(self):
print('student')
Cls = Student
stu1 = Cls()
stu1.print_info()
运行结果:
3
student
9.1.2函数作为参数
在Python3中,函数也是对象,那么函数也可以作为其他函数的参数或返回值。
#程序9-3:函数作为参数
def square(x):
return x*x
l = [1,2,3,4,5]
def fun(l,f):
n = 0
for m in l:
l[n] = f(m)
n += 1
fun(l,square)
print(l)
运行结果:
[1, 4, 9, 16, 25]
#程序9-4:函数作为返回值
def fun():
def add(x,y):
return x+y
return add
f1 = fun()
print(f1)
print(f1(1,2))
f2 = fun()
print(f2)
print(f2(7,2))
运行结果:
<function fun.<locals>.add at 0x03490A08>
3
<function fun.<locals>.add at 0x035596A8>
9
函数fun称为封闭函数;函数add称为嵌套函数。当每执行一次封闭函数,都会创建一个嵌套函数的新实例。
9.1.3嵌套函数
嵌套函数的作用:函数封装;闭包。
#程序9-5:封装
def fun():
def add(x,y):
return x+y
return add
def add(x,y,z):
return x+y+z
f = fun()
print(f(1,2))
print(add(1,2,3))
运行结果:
3
6
由于嵌套函数被封闭函数保护起来,并不在全局作用域中,因此可以重新定义一个和嵌套函数同名的函数。
嵌套函数本质上属于封闭函数的局部对象,因此并不能在外部直接访问。
9.1.4闭包
在讲闭包之前,先看下面的代码。
#程序9-6
m = 1
def add(a):
m = m + a
return m