【Python快速上手(十三)】

发布于:2024-05-05 ⋅ 阅读:(26) ⋅ 点赞:(0)

Python快速上手(十三)

Python3 lambda函数和装饰器

Python3 lambda函数

在 Python 中,lambda 函数是一种特殊的匿名函数,它允许你快速定义简单的函数而无需使用 def 关键字。lambda 函数通常用于函数式编程范式中,可以作为参数传递给高阶函数或者在需要简单函数时使用。

定义 lambda 匿名函数

lambda 函数的语法形式为:

lambda arguments: expression

其中:

  • lambda 关键字用于声明一个匿名函数。
  • arguments 是函数的参数,可以有多个,也可以没有参数。
  • expression 是一个表达式,用于定义函数的返回值。
使用 lambda 匿名函数

lambda 函数通常与内置函数(如 map()、filter()、sorted()等)或其他高阶函数一起使用。

  1. 作为参数传递给高阶函数
    # 使用 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']
    
  2. 单独调用 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 result
    return 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 result
    return wrapper

@log
def add(x, y):
    return x + y

add(3, 5)

2. 性能分析

import time

def 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 result
    return wrapper

@timer
def fibonacci(n):
    if n <= 1:
        return n
    else:
        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 装饰器来解决这个问题。