目录
- Python快速上手(十三)
- Python3 lambda函数和装饰器
- Python3 lambda函数
- 定义 lambda 匿名函数
- 使用 lambda 匿名函数
- 注意事项
- Python3 装饰器
- 装饰器的定义
- 装饰器的用法
- 装饰器的应用场景
- 注意事项
Python快速上手(十三)
Python3 lambda函数和装饰器
Python3 lambda函数
在 Python 中,lambda 函数是一种特殊的匿名函数,它允许你快速定义简单的函数而无需使用 def 关键字。lambda 函数通常用于函数式编程范式中,可以作为参数传递给高阶函数或者在需要简单函数时使用。
定义 lambda 匿名函数
lambda 函数的语法形式为:
lambda arguments: expression
其中:
- lambda 关键字用于声明一个匿名函数。
- arguments 是函数的参数,可以有多个,也可以没有参数。
- expression 是一个表达式,用于定义函数的返回值。
使用 lambda 匿名函数
lambda 函数通常与内置函数(如 map()、filter()、sorted()
等)或其他高阶函数一起使用。
- 作为参数传递给高阶函数
# 使用 lambda 函数作为 map() 函数的参数 numbers = [1, 2, 3, 4, 5] squared = list(map(lambda x: x**2, numbers)) print(squared) # 输出: [1, 4, 9, 16, 25]# 使用 lambda 函数作为 sorted() 函数的参数 names = ["Alice", "Bob", "Charlie", "David"] sorted_names = sorted(names, key=lambda x: len(x)) print(sorted_names) # 输出: ['Bob', 'Alice', 'David', 'Charlie']
- 单独调用 lambda 函数
# 单独调用 lambda 函数 add = lambda x, y: x + y result = add(3, 5) print(result) # 输出: 8
特点
- 匿名性:lambda 函数是匿名的,不需要使用 def 关键字来命名函数。
- 简洁性:lambda 函数通常只包含一个表达式,语法简洁清晰。
- 限制性:lambda 函数只能包含单个表达式,不能包含复杂的语句块。
注意事项
- lambda 函数通常用于定义简单的函数,如果函数逻辑较复杂,建议使用普通的函数定义。
- 在使用 lambda 函数时要注意代码的可读性,过度使用 lambda 可能会降低代码的可读性。
Python3 装饰器
装饰器(Decorator)是 Python 中一种特殊的语法,用于在不修改原始函数代码的情况下,向函数添加额外的功能或修改其行为。装饰器可以用来包装函数、类方法或静态方法,从而在运行时动态地修改它们的行为。
装饰器的定义
在 Python 中,装饰器是一个函数,它接受一个函数作为参数,并返回一个新的函数。通常,装饰器函数会在内部定义一个内嵌函数,并在内嵌函数中对原始函数进行包装、修改或增强。
def decorator(func):def wrapper(*args, **kwargs):# 在调用原始函数之前执行的操作result = func(*args, **kwargs)# 在调用原始函数之后执行的操作return resultreturn wrapper
装饰器的用法
使用装饰器时,可以使用@
符号将装饰器应用到目标函数上。
@decorator
def target_function(*args, **kwargs):# 目标函数的代码pass
装饰器的应用场景
1. 日志记录
def log(func):def wrapper(*args, **kwargs):print(f"Calling function: {func.__name__}")result = func(*args, **kwargs)print(f"Function result: {result}")return resultreturn wrapper@log
def add(x, y):return x + yadd(3, 5)
2. 性能分析
import timedef timer(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()print(f"Execution time: {end_time - start_time} seconds")return resultreturn wrapper@timer
def fibonacci(n):if n <= 1:return nelse:return fibonacci(n-1) + fibonacci(n-2)fibonacci(35)
3. 权限控制
def login_required(func):def wrapper(*args, **kwargs):if user_logged_in():return func(*args, **kwargs)else:return "Login required"return wrapper@login_required
def protected_resource():return "You accessed a protected resource"print(protected_resource())
注意事项
- 装饰器可以串联使用,一个函数可以应用多个装饰器。
- 装饰器可以带有参数,这样可以灵活地定制装饰器的行为。
- 在编写装饰器时,要注意保持原始函数的签名和文档字符串不变,可以使用
functools.wraps
装饰器来解决这个问题。