使用
()
调用函数时,主要发生的事情包括查找函数对象、创建调用帧(包含了函数的局部变量和执行环境等信息)、参数传递、执行函数体和返回值(如果函数没有显式地返回值,它会隐式地返回None
)这一过程使得我们能够动态调用和执行函数
函数式编程
代码重用
闭包
基本概念
闭包(Closure)是指一个函数内部定义的函数,并且这个内部函数能够引用外部函数中的变量,即使外部函数已经执行完毕。
特点:
嵌套函数:闭包必须有一个内部函数
自由变量:内部函数使用外部函数的变量
返回内部函数:外部函数返回内部函数的引用
inner_function
就是一个闭包,因为它引用了外部函数outer_function
的变量message
正常来说,调用一个函数的时候,这个函数中的所有局部变量和形参,都只会在这个函数执行的过程中才会保留,只要这个函数执行完毕,这些局部变量和形参就会被自动释放,也就是没有了。
闭包比普通函数强大的地方在于,它在外部函数执行完毕之后,这个外部函数中的所有局部变量和形参,都不会被释放,而是等到内部函数执行完毕,以便于调用内部函数的时候可以使用。
好处:可以将局部变量永久存储
坏处:占用内存
普通函数:
[A() for i in range]
循环一次 释放一次,100 次也只有一次的 A () 数据闭包函数:
[B() for i in range]
数据一直保存在内存中,每次循环都会创建新的 保存下来
nonlocal
在嵌套函数中修改外部非全局变量。它告诉 Python 解释器,在当前作用域内寻找该变量,而不是在局部作用域内定义一个新变量
多个内部函数
一般还是只写一个内部函数
外部函数变量
闭包中,外部函数的变量,不会被立即销毁(便于内部函数调用)
可以重复使用外部函数变量,或者是不断覆盖,不断使用 赋值 之后的外部函数变量
装饰器
装饰器(Decorator)是一种高级函数,用于在不改变函数本身的情况下,扩展或修改其功能
装饰器本质上是一个返回函数的函数
装饰器通过使用 @decorator_name
语法来应用
示例:
@decorator_function
是装饰器,它会修改 display 函数的行为,使其在执行原始函数之前打印一条信息
无参数
有参数
注意事项
装饰器的执行顺序是从内到外,即先执行最内层的装饰器,再执行外层的装饰器
装饰器可以用于类方法、静态方法等,但通常用于普通函数
两者比较
装饰器通常利用闭包来实现
装饰器的内部函数(wrapper function)引用了装饰器外部函数的变量(如原始函数),从而形成闭包
闭包:用于保存函数的环境,使得内部函数可以记住和访问外部函数的变量
装饰器:用于动态地修改或扩展函数的行为,通常通过闭包实现
评论区