Python进阶教程:装饰器与生成器深入
发布时间:2026/8/23 18:48:41 作者:尧图编辑部 阅读量:1,286

目录Python进阶教程装饰器与生成器深入一、函数是一等公民二、装饰器基础三、带参数的装饰器四、常用内置装饰器五、生成器基础六、生成器表达式七、生成器实战无限序列八、实战缓存装饰器总结Python进阶教程装饰器与生成器深入本文是Python 入门教程系列的第 13 篇扩展篇。装饰器和生成器是 Python 中非常优雅的两个特性本篇深入讲解。一、函数是一等公民在 Python 中函数可以像变量一样传递和返回这是装饰器的基础defgreet(name):returnf你好{name}# 函数可以赋值给变量saygreetprint(say(张三))# 你好张三# 函数可以作为参数传递defcall_twice(func,arg):returnfunc(func(arg))print(call_twice(greet,张三))# 你好你好张三二、装饰器基础装饰器可以在不修改原函数的情况下增强函数功能importtimedeftimer(func):统计函数执行时间的装饰器defwrapper(*args,**kwargs):starttime.perf_counter()resultfunc(*args,**kwargs)elapsedtime.perf_counter()-startprint(f{func.__name__}耗时{elapsed:.4f}s)returnresultreturnwrappertimerdefslow_add(a,b):time.sleep(0.1)returnabprint(slow_add(1,2))# slow_add 耗时 0.1xxx s3三、带参数的装饰器importfunctoolsdefrepeat(times):让函数重复执行的装饰器带参数defdecorator(func):functools.wraps(func)# 保留原函数信息defwrapper(*args,**kwargs):for_inrange(times):resultfunc(*args,**kwargs)returnresultreturnwrapperreturndecoratorrepeat(times3)defsay_hello():print(Hello!)say_hello()# 打印 3 次 Hello!四、常用内置装饰器classMyClass:class_var0def__init__(self,value):self._valuevaluepropertydefvalue(self):只读属性returnself._valuevalue.setterdefvalue(self,new_val):属性赋值检查ifnew_val0:raiseValueError(不能为负)self._valuenew_valclassmethoddefcreate(cls):类方法returncls(0)staticmethoddefhelper():静态方法return工具函数objMyClass(10)print(obj.value)# 10obj.value20# 调用 setterprint(obj.value)# 20print(MyClass.create().value)# 0print(MyClass.helper())# 工具函数五、生成器基础生成器用yield逐次产出值不一次性占用内存defcount_up_to(n):i1whilein:yieldi# 暂停并返回i1gencount_up_to(5)print(next(gen))# 1print(next(gen))# 2print(list(gen))# [3, 4, 5] 继续消费剩余六、生成器表达式# 列表推导式 vs 生成器表达式squares_list[x*xforxinrange(1000000)]# 立即占用内存squares_gen(x*xforxinrange(1000000))# 惰性求值# 生成器可以传给 sum 等函数print(sum(x*xforxinrange(10)))# 285# 内存对比importsysprint(sys.getsizeof([xforxinrange(100000)]))# 约 800KBprint(sys.getsizeof((xforxinrange(100000))))# 约 112B七、生成器实战无限序列deffibonacci():无限斐波那契序列生成器a,b0,1whileTrue:yielda a,bb,ab fibfibonacci()# 取前 10 个print([next(fib)for_inrange(10)])# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]八、实战缓存装饰器importfunctoolsimporttimedefmemoize(func):手写缓存装饰器cache{}functools.wraps(func)defwrapper(*args):ifargsnotincache:cache[args]func(*args)returncache[args]returnwrappermemoizedefexpensive(n):print(f计算{n}...)time.sleep(1)returnn*n starttime.perf_counter()print(expensive(5))# 计算 5... 25print(expensive(5))# 直接命中缓存 25不打印计算print(f耗时{time.perf_counter()-start:.1f}s)# 约 1s总结本篇深入讲解了装饰器基础、带参数、内置装饰器和生成器基础、表达式、无限序列并用手写缓存装饰器串联实战。理解这两个特性能写出更简洁、更 Pythonic 的代码。