从菜鸟到大神,一篇文章带你玩转Python闭包与装饰器的深度应用

简介: 【7月更文挑战第4天】Python中的闭包和装饰器是增强代码优雅性的关键特性。闭包是能访问外部作用域变量的内部函数,如示例中的`inner_function`。装饰器则是接收函数并返回新函数的函数,用于扩展功能,如`my_decorator`。装饰器可与闭包结合,如`repeat`装饰器,它使用闭包记住参数并在调用时重复执行原函数。这些概念提升了代码复用和可维护性。

在Python的广阔世界里,闭包(Closures)与装饰器(Decorators)是两大强大的特性,它们不仅能让代码更加优雅,还能显著提升代码的复用性和可维护性。从初学者的视角出发,我们将通过一系列示例,逐步揭开它们神秘的面纱,带你从菜鸟成长为玩转这些高级概念的大神。

初识闭包
闭包,简而言之,是一个能够记住并访问其词法作用域(lexical scope)的函数。换句话说,闭包是一个函数值,它引用了其外部作用域中的变量。

python
def outer_function(text):
def inner_function():
print(text)
return inner_function # 注意这里返回的是函数本身,而非调用它

使用闭包

my_closure = outer_function("Hello, world!")
my_closure() # 输出: Hello, world!
在上面的例子中,inner_function就是一个闭包,因为它记住了并访问了外部作用域(outer_function)中的变量text。

深入装饰器
装饰器本质上是一个函数,它接收一个函数作为参数并返回一个新的函数。这个特性让装饰器成为在不修改原有函数定义的情况下,为函数添加新功能的强大工具。

python
def my_decorator(func):
def wrapper():
print("Something is happening before the function is called.")
func()
print("Something is happening after the function is called.")
return wrapper

@my_decorator
def say_hello():
print("Hello!")

say_hello()

输出:

Something is happening before the function is called.

Hello!

Something is happening after the function is called.

在这个例子中,@my_decorator是装饰器语法糖,等同于say_hello = my_decorator(say_hello)。装饰器my_decorator接收say_hello函数,并返回一个新的函数wrapper,该函数在调用原始函数前后分别执行了额外的操作。

闭包与装饰器的结合应用
装饰器经常与闭包结合使用,以实现更复杂的逻辑。比如,我们可以创建一个带参数的装饰器,该装饰器内部使用闭包来记住这些参数。

python
def repeat(num_times):
def decorator_repeat(func):
def wrapperrepeat(args, *kwargs):
for
in range(num_times):
result = func(args, *kwargs)
return result
return wrapper_repeat
return decorator_repeat

@repeat(3)
def greet(name):
print(f"Hello, {name}!")

greet("Alice")

输出:

Hello, Alice!

Hello, Alice!

Hello, Alice!

在这个例子中,repeat装饰器接受一个参数num_times,它返回一个实际的装饰器decorator_repeat。decorator_repeat再返回一个闭包wrapper_repeat,该闭包记住了num_times的值,并在每次调用时重复执行被装饰的函数指定次数。

通过这些示例,我们不仅学习了闭包与装饰器的基本概念,还掌握了它们在实际编程中的深度应用。希望这能帮助你从Python的菜鸟成长为玩转闭包与装饰器的大神。

相关文章
|
1月前
|
机器学习/深度学习 存储 数据挖掘
Python图像处理实用指南:PIL库的多样化应用
本文介绍Python中PIL库在图像处理中的多样化应用,涵盖裁剪、调整大小、旋转、模糊、锐化、亮度和对比度调整、翻转、压缩及添加滤镜等操作。通过具体代码示例,展示如何轻松实现这些功能,帮助读者掌握高效图像处理技术,适用于图片美化、数据分析及机器学习等领域。
72 20
|
1月前
|
测试技术 数据库 Python
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
106 61
Python装饰器实战:打造高效性能计时工具
|
1月前
|
设计模式 前端开发 Shell
Python装饰器是什么?
装饰器是Python中用于动态修改函数、方法或类功能的工具,无需改变原代码。通过将函数作为参数传递并返回新函数,装饰器可以在原函数执行前后添加额外逻辑。例如,使用`@logger`装饰器可以打印函数调用日志,而`@timethis`则可用于计算函数执行时间。为了保持被装饰函数的元信息(如`__name__`和`__doc__`),可使用`functools.wraps`装饰器。此外,带参数的装饰器可通过嵌套函数实现,如`@timeitS(2)`,以根据参数条件输出特定信息。
90 59
|
22天前
|
人工智能 开发者 Python
Chainlit:一个开源的异步Python框架,快速构建生产级对话式 AI 应用
Chainlit 是一个开源的异步 Python 框架,帮助开发者在几分钟内构建可扩展的对话式 AI 或代理应用,支持多种工具和服务集成。
130 9
|
2月前
|
算法 数据处理 Python
高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用
Savitzky-Golay滤波器是一种基于局部多项式回归的数字滤波器,广泛应用于信号处理领域。它通过线性最小二乘法拟合低阶多项式到滑动窗口中的数据点,在降噪的同时保持信号的关键特征,如峰值和谷值。本文介绍了该滤波器的原理、实现及应用,展示了其在Python中的具体实现,并分析了不同参数对滤波效果的影响。适合需要保持信号特征的应用场景。
170 11
高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用
|
27天前
|
存储 SQL 大数据
Python 在企业级应用中的两大硬伤
关系数据库和SQL在企业级应用中面临诸多挑战,如复杂SQL难以移植、数据库负担重、应用间强耦合等。Python虽是替代选择,但在大数据运算和版本管理方面存在不足。SPL(esProc Structured Programming Language)作为开源语言,专门针对结构化数据计算,解决了Python的这些硬伤。它提供高效的大数据运算能力、并行处理、高性能文件存储格式(如btx、ctx),以及一致的版本管理,确保企业级应用的稳定性和高性能。此外,SPL与Java无缝集成,适合现代J2EE体系应用,简化开发并提升性能。
Python闭包函数和计时器
本文介绍了闭包函数的概念,它允许内部函数引用外部作用域的变量但无法修改它们。示例展示了如何使用闭包来封装函数。接着,文章讨论了如何在函数调用时添加开始和结束的打印语句,通过传递函数作为参数实现。然后,文章引入装饰器,通过闭包定义了一个`timer`装饰器,用于在函数执行前后打印消息。最后,给出了一个练习,实现了一个计算函数执行时间的装饰器,处理了带有参数的被装饰函数。
|
9月前
|
Python
深入理解python的闭包函数
深入理解python的闭包函数
|
数据采集 Python
Python入门教程:什么闭包函数
闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。 提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇。
138 0
|
数据采集 Python
Python---闭包、函数作为参数传递、装饰器-----进阶必备,不必再为弄不清而烦恼
Python---闭包、函数作为参数传递、装饰器-----进阶必备,不必再为弄不清而烦恼
139 0

热门文章

最新文章