函数式编程

函数作为返回值

逻辑连续,当内部函数被调用时,不脱离当前的逻辑

闭包

三要素

  1. 必须有一个内嵌函数
  2. 内嵌函数必须引用外部函数中变量
  3. 外部函数返回值必须是内嵌函数
# 定义:
def 外部函数名(参数):
    外部变量
    def 内部函数名(参数):
        使用外部变量
        return 内部函数名

# 调用:
变量 = 外部函数名(参数)
变量(参数)
  • 定义:是由函数及其相关的引用环境组合而成的实体
  • 优点:内部函数可以使用外部变量
  • 缺点:外部变量一直存在于内存中,不会在调用结束后释放,占用内存
  • 作用:实现python装饰器
# 演示

def give_gife_money(money):
    print("获得", money, "元压岁钱")
    def child_buy(commodity, price):
        nonlocal money
        money -= price
        print("购买了", commodity, "花了", price, "元,还剩下", money)
    return child_buy

action = give_gife_money(500)
action("变形金刚", 200)
action("芭比娃娃", 300)

函数装饰器 decorator

在不改变原函数的调用以及内部代码情况下,为其添加新功能的函数

  • 使用@函数装饰器名称修饰原函数,等同于创建与原函数名称相同的变量,关联内嵌函数;故调用原函数时执行内嵌函数
  • 一个函数可以被多个装饰器修饰,执行顺序为从近到远
# 语法

def 函数装饰器名称(func):
    def wrapper(*args, **kwargs):
        需要添加的新功能
        return func(*args, **kwargs)
    return wrapper

@ 函数装饰器名称
def 原函数名称(参数):
    函数体

原函数(参数)
  • 原函数名称 = 函数装饰器名称(原函数名称)
def func01():
    print("旧功能")

def new_func(func):
    def wrapper():
        print("新功能")
        func() # 执行旧功能
    return wrapper

# 新功能覆盖了旧功能
# func01 = new_func
# 调用一次外部函数(装饰器本质)
func01 = new_func(func01)
# 调用多次内部函数
func01()
func01()
  • 修饰原函数

def func_new(func):
    def wrapper(*args):# 2            合
        print("新功能")
        res = func(*args) # 调用旧功能  拆
        return res
    return wrapper

# func01 = func_new(func01)
@func_new
def func01(p1):# 3
    print("旧功能1")
    return 100

@func_new
def func02(p1,p2):# 3
    print("旧功能2")

value = func01(10) # 调用内函数
value = func02(10,20) # 调用内函数
print(value)