Python 中的闭包、匿名函数、decorator 装饰器与python的偏函数
Python中的闭包 def calc_sum(lst): def lazy_sum(): return sum(lst) return lazy_sum 像这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。在函数内部定义的函数和外部定义的函数是一样的,只是他们无法被外部访问。 闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。 def count(): fs = [] for i in range(1, 4): 在Python编程语言中,闭包、匿名函数和装饰器是三种重要的高级概念,它们扩展了函数的功能和灵活性。下面将详细解释这些概念及其应用。 **闭包(Closure)** 闭包是指一个函数能够记住它被创建时的环境,即它可以访问并操作在其外部定义但不在其作用域内的变量。闭包的实现依赖于Python的词法作用域规则。例如: ```python def calc_sum(lst): def lazy_sum(): return sum(lst) return lazy_sum sum_calculator = calc_sum([1, 2, 3]) result = sum_calculator() ``` 在这个例子中,`lazy_sum`函数是闭包,因为它引用了外部函数`calc_sum`的局部变量`lst`。即使`calc_sum`执行完毕,`lazy_sum`仍然能访问并使用`lst`的值。 **匿名函数(Lambda Function)** 匿名函数是一种简短的、只用一行表达式的函数,通常用于快速定义简单的函数。它由`lambda`关键字定义,不需使用`def`关键字。例如: ```python add = lambda x, y: x + y print(add(2, 3)) # 输出 5 ``` 在这个例子中,`lambda x, y: x + y`定义了一个接受两个参数并返回它们之和的匿名函数。 **装饰器(Decorator)** 装饰器是一种特殊类型的函数,它允许我们在不修改原有函数代码的情况下,增加或修改函数的功能。装饰器本质上是一个接受函数作为输入并返回新函数的高阶函数。在Python中,我们可以使用`@decorator`语法糖来简洁地应用装饰器。例如: ```python def log(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__} function...") return func(*args, **kwargs) return wrapper @log def greet(name): print(f"Hello, {name}") greet("Alice") # 输出 "Calling greet function..." 和 "Hello, Alice" ``` 在这个例子中,`log`装饰器在`greet`函数调用之前和之后打印一条消息,而无需改动`greet`函数的原始代码。 **带参数的装饰器** 装饰器不仅可以接收函数作为参数,还可以接收其他参数。通过定义一个装饰器工厂函数,我们可以创建具有不同行为的装饰器。例如: ```python def log(prefix): def log_decorator(func): def wrapper(*args, **kwargs): print(f" [{prefix}] Calling {func.__name__} function...") return func(*args, **kwargs) return wrapper return log_decorator @log("DEBUG") def test(): pass test() # 输出 "[DEBUG] Calling test function..." ``` 这里,`log`是一个装饰器工厂函数,它接受一个`prefix`参数并返回一个新的装饰器`log_decorator`。`log_decorator`再接收一个函数并返回新的函数`wrapper`,实现了带有特定前缀的日志记录。 **完善装饰器** 为了保持装饰后函数的元数据(如`__name__`、`__doc__`等),我们需要在装饰器中进行适当的处理: ```python def log(func): def wrapper(*args, **kwargs): print('call ' + func.__name__ + '()...') return func(*args, **kwargs) wrapper.__name__ = func.__name__ wrapper.__doc__ = func.__doc__ return wrapper ``` 通过这种方式,即使`log`装饰器改变了函数的行为,它也不会改变函数的名称和文档字符串,使得调用者可以像使用未装饰的函数一样使用装饰后的函数。 总结来说,闭包提供了对局部变量的持久化访问,匿名函数简化了一行代码的函数定义,而装饰器则增强了代码的可读性和复用性,允许我们在不改动原有函数的基础上添加额外的功能。这三种特性是Python高级编程中的重要工具,极大地提升了代码的灵活性和效率。




















- 粉丝: 8
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- Android Course Work-移动应用开发资源
- python教案.pdf
- 网络技术及应用课件电子教案课件整套教学课件.pptx
- 本科毕业论文:LDPC码的编译码算法研究.pdf
- 网络营销教案完整版讲义.doc
- 史丰收速算法是以史丰收教授的名字命名的.pdf
- 数学教案-小数的连除、除加、除减混合运算和简便算法.docx
- 泸州市十郎区块链同城网人事管理系统.doc
- 项目管理理论的重大科技模式研究.doc
- 自动化生产实习心得体会.docx
- 银行软件测试面试题目.docx
- 学校网络规划投标书.doc
- 网络课程设计标准市公开课一等奖百校联赛优质课金奖名师赛课获奖课件.ppt
- 陕西省项目管理师报考条件.docx
- 使用正版软件自查报告.docx
- 武汉大学网络营销().pptx


