匿名函数也叫lambda表达式。通常用来表示内部只有一行代码的函数。换句话说如果函数体只有一行代码则完全可以使用匿名函数表示。使用lambda关键字定义匿名函数。
假如要求两个数的和。可以通过普通函数和匿名函数加以对比。
def sun(a, b):
return a + b
print(sun(100, 20))
120
sun = lambda a, b: a + b
print(sun(100, 300))
400
从上面两个示例不难看出实现相同的功能匿名函数比起普通函数的代码要少。
闭包函数又称闭包函数或者闭合函数。简单的可以理解为一个函数中嵌套了另一个函数。 而且函数的返回值就是被嵌套的那个函数。
def add(a):
def sun(b):
return a + b
return sun
a = add(100)
print(a)
b = a(200)
print(b)
.sun at 0x10b5fbc20>
300
简单的分析代码。
# 闭包函数
def add(a):
def sun(b):
return a + b
return sun
a = add(100)
b = a(200)
print(b)
c = a(12)
print(c)
300
112
# 普通函数
def sun(a, b):
return a + b
r = sun(200, 100)
print(r)
r1 = sun(12, 100)
print(r1)
300
112
显然第一种方式表达更为简洁,在每次调用函数时,都可以少输入一个参数。其次闭包函数函数开头需要做一些额外工作,当需要多次调用该函数时,如果将那些额外工作的代码放在外部函数,就可以减少多次调用导致的不必要开销,提高程序的运行效率。
闭包函数存在一个__closure__属性。该属性记录着自由变量的地址。当闭包被调用时,系统就会根据该地址找到对应的自由变量,完成整体的函数调用。如果
def add(a):
def sun(b):
return a + b
return sun
a = add(100)
print(a.__closure__)
(,)
|
也许直接上看不出结果代表什么含义。但是实际上他是代表add被调用时a的储存地址。
递归函数就是在内部调用自身本身,这个函数就是递归函数,
def sun(n):
if n == 1:
return 1
return n * sun(n - 1)
print(sun(4))
24
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式。使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。