python 学习笔记一(装饰器)
回调式异步编程:
函数式编程:
### 装饰器基础
装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。
装饰器可能:
1)将其替换成另一个函数或可调用对象
## 替换成其他函数
def deco(func): def inner(): print('running inner()') # print(func) return inner @deco def target(): print('running target()') target() print(target)
## 结果
<function target at 0x000002073E572BF8> # 加载模块或者被导入时执行
running inner()
<function deco.<locals>.inner at 0x000002073E5888C8> # target被替换成inner
2)会处理被装饰的函数,然后把它返回;
## 对函数进行处理,并返回
registry = [] ➊ def register(func): ➋ print('running register(%s)' % func) ➌ registry.append(func) ➍ return func ➎
@register ➏ def f1(): print('running f1()')
@register def f2(): print('running f2()')
def f3(): ➐ print('running f3()')
def main(): ➑ print('running main()') print('registry ->', registry) f1() f2() f3()
if __name__=='__main__': main() ➒
###变量作用域
Python 不要求声明变量,但是假定在函数定义体中赋值的变量是局部变量,示例如下
b = 6 def f2(a): print(a) print(b) b = 9 f2(3)
3 Traceback ( most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in f2 UnboundLocalError: local variable 'b' referenced before assignment
### 闭包
闭包是一种函数,它会保留定义函数时存在的自由变量的绑定,
这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定
注意,只有嵌套在其他函数中的函数才可能需要处理不在全局作用域中的外部变量。
def make_averager():
series = []
def aver(new_value):
# series = []
series.append(new_value)
total = sum(series)
return total/len(series)
return aver
>>> avg = make_averager()
>>> avg(10)
10.0
>>> avg(11)
10.5
>>> avg(12)
>>> avg.__code__.co_varnames
('new_value', 'total')
>>> avg.__code__.co_freevars
('series',)
"""series 的绑定在返回的 avg 函数的 __closure__ 属性中。avg.__closure__ 中的各个元素对应于avg.__code__.co_freevars 中的一个名称。这些元素是 cell 对象,有个 cell_contents 属性,保存着真正的值。"""
>>> avg.__code__.co_freevars
('series',)
>>> avg.__closure__
(<cell at 0x107a44f78: list object at 0x107a91a48>,)
>>> avg.__closure__[0].cell_contents
[10, 11, 12]
#### 参数化装饰器
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?