1.函数类型
函数也是一种类型,我们⾃定义的函数就是函数对象,函数名保存了函数对象的引⽤(地址)。例如,
def demo():
print("hello world")
print(type(demo))
执行结果如下,
<class 'function'>
因为函数名也是变量,所以我们可以同样将该函数名保存的函数对象的地址,赋给其他变量,使其他变量具有相同的功能。如下,
def demo():
print("hello world")
pf = demo
pf()
执行结果如下,
hello world
2.匿名函数
对于一些功能简单的函数,我们可以不通过def语句来编写函数,而是使用lambda语句来编写。
lambda语句只是一个表达式,无法进行复杂计算,但是运行效率高。例如,
pf = lambda x, y: print(x + y)
pf(1, 2)
执行结果如下,
3
3.传入函数
python中我们可以在一个函数中传入另一个函数,这种函数被称为高阶函数,也称为传入函数。例如,
def calculate(num1, num2, func):
return func(num1, num2)
print(calculate(1, 2, lambda x, y: x + y))
print(calculate(1, 2, lambda x, y: x - y))
print(calculate(1, 2, lambda x, y: x * y))
print(calculate(1, 2, lambda x, y: x / y))
执行结果如下,
3
-1
2
0.5
在这个calculate()函数中,我们传入了func()函数。这里func()函数用匿名函数来表示,简化了代码。
4.闭包
4.1.内部函数和外部函数
如果一个函数中定义了另一个函数,那么被包含的函数被称为内部函数,包含内部函数的函数被称为外部函数。例如,
def outer(): # 外部函数
print("外部函数")
def inner(): # 内部函数
print("内部函数")
内部函数只能在外部函数里调用,外界无法直接调用内部函数。
4.2.闭包
如果一个外部函数中定义了一个内部函数,内部函数中引用了外部函数的变量,且外部函数的返回值是内部函数的函数名。这时,内部函数和其执行时需要的环境变量就构成了一个闭包。
一般情况下,如果一个函数结束,函数内部的数据都会被释放掉,局部变量会消失。但是,闭包是一种特殊情况,如果外部函数在结束的时候发现自己的局部变量将来会在内部函数中使用,就把这个局部变量绑定给了内部函数,然后自己在结束。
例如,
def outer(): # 外部函数
print("外部函数")
a = 10
def inner(): # 内部函数
print(a) # 1.在内部函数里使用外部函数的变量
# a += 10 # 不可以修改外部变量
print("内部函数")
return 30
return inner # 2.外部函数返回内部函数的函数名