零基础入门python3.7 ——基础知识总结(十三) 函数高级

一。匿名函数

匿名函数也叫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

从上面两个示例不难看出实现相同的功能匿名函数比起普通函数的代码要少。

二。理解匿名函数

  • 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁;
  • 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高程序执行的性能。

三。 闭包函数

闭包函数又称闭包函数或者闭合函数。简单的可以理解为一个函数中嵌套了另一个函数。 而且函数的返回值就是被嵌套的那个函数。

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

简单的分析代码。 

  • 首先调用add函数并将其赋值给了变量a。 那么此时变量最终的结果是一个函数即sun函数
  • 既然a现在代表sun函数。 那么调用a函数就相当于调用sun函数。 所以得到了正确的结果
  • 在调用a函数时 ,因为add的参数也被赋值给了a所以在调用a的时候不会因为找不到参数而报错

四。闭包函数的好处

# 闭包函数
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__属性

闭包函数存在一个__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)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

你可能感兴趣的:(python)