匿名函数与装饰器的使用方法及应用场景
一、匿名函数
匿名函数,也叫lambda函数,是一种简洁、快捷的函数编写方法。它没有函数名,通常是一行代码,使用时可以赋给一个变量,也可以直接作为参数传递给函数。
使用格式:
lambda 参数列表:表达式
例如:
g = lambda x,y:x+y
g(1,2)
返回值为3
g2 = lambda :2
g2()
返回值为2
匿名函数的应用场景:
1.排序
collection模块的sort方法可以传入一个key参数,用于指定排序的规则,这个key后面可以跟一个函数,也可以使用匿名函数来排序。
例如:
a = [1,3,5,4,2,6]
a.sort(reverse=True,key=lambda x:x)
print(a)
输出结果为[6, 5, 4, 3, 2, 1]
2.过滤
过滤是一种常见的操作,可以通过 filter()方法来实现,可以使用匿名函数作为过滤条件。
例如:
list(filter(lambda x:x%2==0,[1,2,3,4,5,6]))
输出结果为[2, 4, 6]
3.转换
使用 map() 可以将一个函数应用到所有序列的元素,而匿名函数可以快速地编写这样的函数。
例如:
list(map(lambda x:x+10,[1,2,3,4,5,6]))
输出结果为[11, 12, 13, 14, 15, 16]
二、装饰器
装饰器是Python语言中一种重要的编程思想,可以在代码运行期间动态修改函数或类的功能。它提供了对现有函数或类的包装(即修饰)的方法,从而使其具有新的、增强的功能。装饰器通常是Python函数,自动接受另一个函数或类作为其参数,并返回增强功能的新函数或类。
装饰器的使用方法:
在定义函数时,在函数上方直接使用 @ 符号,接着是装饰器的名称,即可对该函数进行装饰。
例如:
@decorator
def foo():
print("Hello World")
装饰器的实现方式:
def decorator(func):
def wrapper():
print("Start")
func()
print("End")
return wrapper
def foo():
print("Hello World")
foo = decorator(foo)
foo()
通过这个例子可以看出,装饰器其实是对一个函数进行包装,而返回一个新的函数。
装饰器的应用场景:
常见的用途有:
1.日志记录
装饰器可以封装函数,在运行函数时,输出日志信息,用于调试和排错。
例如:
import logging
logging.basicConfig(level=logging.DEBUG)
def logging_decorator(func):
def wrapper(*args, **kwargs):
logging.debug(f"Calling {func.__name__!r}")
try:
return func(*args, **kwargs)
except:
logging.exception(f"Error in {func.__name__!r}")
return wrapper
@logging_decorator
def divide(a, b):
return a / b
divide(1, 0)
2.权限检测
可以通过装饰器在每次调用函数时,检测是否有权限,以确保只有合法的用户才能调用该函数。
例如:
user_is_authenticated = True
def authenticate(func):
def wrapper(*args, **kwargs):
if user_is_authenticated:
return func(*args, **kwargs)
else:
raise ValueError("User is not authenticated")
return wrapper
@authenticate
def secure_function():
print("User is authenticated")
secure_function()
3.计时
可以通过装饰器对函数运行时间进行统计和测量,以便在大型系统中优化性能。
例如:
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.perf_counter()
result = func(*args, **kwargs)
end_time = time.perf_counter()
print(f"Finished {func.__name__!r} in {end_time - start_time:.4f} secs")
return result
return wrapper
@timer
def time_consuming_function():
time.sleep(2)
print("Hello, World!")
time_consuming_function()
