递归函数、纯函数、匿名函数lambda

递归函数
  在函数中调用函数自身;递归函数一定要写终止条件,否则将产生无限递归即死循环。

# 阶乘 6*5*4*3*2*1

def func(n):
    if n == 1:
        return 1
    else:
        return n * func(n - 1)  # 累加把*换成+即可


print(func(6))  # 6*5*4*3*2*1 = 720

import sys

# 获取最大递归深度
res = sys.getrecursionlimit()
print(res)  # 1000
# 可以通过setrecursionlimit去设置递归最大深度
# 但是要考虑内存能否满足条件,内存满了就会停止,一般不会修改这个
# sys.setrecursionlimit(5000)

# Python中递归效率比较低,不推荐使用递归
# 每次调用函数都需要临时开辟一块内存去保存函数运行中的数据,无论函数是否相同的参数去重复调用
# 直到递归全部运行完毕才去释放内存
# 针对这种情况可以使用 缓存装饰器 去提升递归函数的运行效率
# 优化运行机制,把调用函数对于相同参数重复调用的,无需重新函数计算(无须新开辟内存),直接返回之前缓存的返回值
# 如果必须使用递归函数去解决问题时,一定要使用缓存装饰器,可以大大提高运行效率

from functools import lru_cache


@lru_cache(maxsize=128)  # maxsize参数指调用时递归占多少内存
def func_lru(n):
    if n == 1 or n == 2 or n == 3:
        return n
    else:
        return func(n - 1) + func(n - 2) + func(n - 3)


func_lru(50)

纯函数
  函数的返回结果只依赖于它的参数,并且在执行过程中没有副作用。
三个原则
  1、变量都只在函数作用域内获取,或者作为函数的参数传入
  2、相同的输入保证相同的输出
  3、不会产生副作用,不会改变被传入的数据或者全局变量的其他数据
函数的副作用
  访问了函数外的数据,对外部数据进行了操作改变了系统环境
纯函数的作用就是降低代码的耦合度(代码的耦合度,是指代码中的单元代码的紧密程度,其中一个单元代码的更改对其它单元代码的影响力与作用)

# 纯函数
def func(a, b):
    return a + b

# 不是纯函数,使用了外部变量
c = 100
def func1(a, b):
    return a + b + c

# 不是纯函数,调用函数后就改变了外部数据
li = []
def func2(a, b):
    li.append(a)
    li.append(b)
    return a + b

匿名函数(lambda 表达式)
  语法  lambda 参数: 返回值

上一篇:重磅首发 |《Elasticsearch 中国开发者调查报告》探索开发者的现状和未来


下一篇:Python的lambda函数用法