关闭

Python库functools示例详解

发表于:2024-4-29 09:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:华安9527    来源:测试开发学习交流

  functools
  functools 是 Python 标准库中一个极为实用的模块,提供了许多用于处理函数、高阶函数以及函数式编程的工具。
  1. functools.partial
  用途: 创建一个新函数,它固定了原函数的部分参数。
  示例:
  from functools import partial
  def power(base, exponent):
      return base ** exponent
  # 创建一个固定底数为2的新函数
  square = partial(power, base=2)
  # 调用新函数只需传递指数
  print(square(3))  # 输出: 8
  2. functools.update_wrapper / functools.wraps
  用途: 在编写装饰器时,保持被装饰函数的元信息(如名称、文档字符串、注解等)不变。
  示例:
  from functools import wraps
  def add_logging(func):
      @wraps(func)
      def wrapper(*args, **kwargs):
          print(f"Calling {func.__name__} with arguments {args}, {kwargs}")
          result = func(*args, **kwargs)
          print(f"{func.__name__} returned: {result}")
          return result
      return wrapper
  @add_logging
  def greet(name):
      """Greet someone by their name."""
      return f"Hello, {name}!"
  print(greet.__name__)  # 输出: greet
  print(greet.__doc__)   # 输出: Greet someone by their name.
  greet("Alice")  # 输出: Calling greet with arguments ('Alice',), {} 和 "greet returned: Hello, Alice!"
  3. functools.total_ordering
  用途: 通过实现一个或少数几个关键比较方法(如 __eq__ 和 __lt__),自动为一个类生成所有必要的比较方法(如 __le__, __gt__, __ge__, __ne__)。
  示例:
  from functools import total_ordering
  @total_ordering
  class Person:
      def __init__(self, name, age):
          self.name = name
          self.age = age
      def __eq__(self, other):
          return self.name == other.name and self.age == other.age
      def __lt__(self, other):
          return self.age < other.age
  # 自动拥有所有比较方法,如 __le__, __gt__, __ge__, __ne__
  p1 = Person("Alice", 25)
  p2 = Person("Bob", 30)
  print(p1 <= p2)  # 输出: True
  print(p1 > p2)   # 输出: False
  4. functools.lru_cache
  用途: 实现函数结果的缓存,以提高性能。基于“最近最少使用”(Least Recently Used, LRU)策略自动丢弃旧的缓存项。
  示例:
  from functools import lru_cache
  @lru_cache(maxsize=32)
  def fibonacci(n):
      if n < 2:
          return n
      return fibonacci(n - 1) + fibonacci(n - 2)
  # 多次调用相同参数时,从缓存中获取结果,避免重复计算
  print(fibonacci(20))  # 第一次调用进行计算
  print(fibonacci(20))  # 第二次调用直接使用缓存
  5. functools.reduce
  用途: 对一个可迭代对象(如列表)应用一个累积函数,从左到右将元素两两结合,返回单一结果。
  示例:
  from functools import reduce
  numbers = [1, 2, 3, 4, 5]
  # 计算列表元素的乘积
  product = reduce(lambda x, y: x * y, numbers)
  print(product)  # 输出: 120
  6. functools.cmp_to_key
  用途: 将旧式的比较函数(接受两个参数并返回负数、零或正数表示小于、等于或大于)转换为可用于排序的键函数。
  示例:
  from functools import cmp_to_key
  def compare_names(name1, name2):
      if name1 < name2:
          return -1
      elif name1 > name2:
          return 1
      else:
          return 0
  names = ["Alice", "Bob", "Charlie", "David"]
  # 使用旧式比较函数进行排序
  sorted_names = sorted(names, key=cmp_to_key(compare_names))
  print(sorted_names)  # 输出: ['Alice', 'Bob', 'Charlie', 'David']
  以上示例
  涵盖了 functools 模块中一些常用且重要的功能,包括部分函数应用、装饰器元信息保留、简化类比较方法、函数缓存、累积计算以及旧式比较函数的转换。根据实际需求,可以灵活运用这些工具来增强代码的简洁性、效率和可读性。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号