欢迎访问宙启技术站
智能推送

匿名函数与装饰器的使用方法及应用场景

发布时间:2023-06-22 04:22:22

一、匿名函数

匿名函数,也叫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()