文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python库functools示例详解

2024-11-29 23:09

关注

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 模块中一些常用且重要的功能,包括部分函数应用、装饰器元信息保留、简化类比较方法、函数缓存、累积计算以及旧式比较函数的转换。根据实际需求,可以灵活运用这些工具来增强代码的简洁性、效率和可读性。

来源:测试开发学习交流内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯