在Python编程中,functools.partial是一个强大的工具,它提供了一种部分应用函数的方式,能够在创建新函数时固定部分参数,从而在后续调用中减少需要传递的参数数量。本文将深入介绍functools.partial的基本概念、使用方法,并通过丰富的示例代码演示其在不同场景中的实际应用。

什么是functools.partial?

在Python中,functools.partialfunctools模块提供的一个函数。它的作用是部分应用一个函数,返回一个新的可调用对象,类似于原始函数,但其中的一些参数被固定。这能够更灵活地使用函数,适应不同的需求。

基本用法示例

从一个简单的示例开始,了解functools.partial的基本用法:

Python
import functools

# 原始函数
def greet(name, greeting='Hello'):
return f'{greeting}, {name}!' # 使用 functools.partial 固定参数
greet_hello = functools.partial(greet, greeting='Hello')
greet_hi = functools.partial(greet, greeting='Hi') # 调用新函数
print(greet_hello('Alice')) # 输出: Hello, Alice!
print(greet_hi('Bob')) # 输出: Hi, Bob!

在这个例子中,通过functools.partial创建了两个新的函数:greet_hellogreet_hi。它们分别固定了greeting参数为'Hello''Hi'。这样,通过调用新函数时,只需要传递剩余的参数,使得代码更为简洁。

实际应用场景

1. 文件读取

在实际的文件读取场景中,可以利用functools.partial简化代码,固定文件读取函数的一些参数:

Python
import functools

# 原始函数
def read_file(file_path, mode='r', encoding='utf-8'):
with open(file_path, mode, encoding=encoding) as file:
return file.read() # 固定文件读取函数
read_text_file = functools.partial(read_file, mode='r', encoding='utf-8') # 调用新函数
content = read_text_file('example.txt')
print(content)

通过这样的部分应用,创建了新的函数read_text_file,其中modeencoding参数被固定,使得在调用时更为简便。

2. 定制排序

functools.partial还能在排序等场景中发挥作用。例如,可以创建一个定制排序函数:

Python
import functools

# 原始函数
def custom_sort(item, key=None, reverse=False):
return sorted(item, key=key, reverse=reverse) # 固定排序函数
sort_desc = functools.partial(custom_sort, reverse=True) # 调用新函数
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers_desc = sort_desc(numbers)
print(sorted_numbers_desc)

在这个例子中,通过functools.partial创建了一个新的排序函数sort_desc,固定了reverse参数为True。这样,每次调用sort_desc时,只需要传递待排序的列表和可能的自定义排序函数,使得定制排序更为便捷。

多次部分应用

functools.partial不仅支持一次部分应用,还可以多次使用。以下是一个例子:

Python
import functools

# 原始函数
def power(base, exponent):
return base ** exponent # 部分应用 power 函数
square = functools.partial(power, exponent=2)
cube = functools.partial(power, exponent=3) # 调用新函数
print(square(4)) # 输出: 16
print(cube(3)) # 输出: 27

在这个例子中,通过多次使用functools.partial,部分应用了power函数,分别创建了squarecube两个新的函数。这展示了functools.partial的灵活性和多次应用的便利性。

高级应用

除了基本用法之外,functools.partial还有一些更为高级的应用,使其在不同场景中更加强大。以下是一些进阶用法的示例:

1. 动态修改部分应用函数

functools.partial创建的部分应用函数是可以动态修改的。这意味着,可以在创建新函数后,随时修改已经固定的参数,生成不同版本的函数。

Python
import functools

# 原始函数
def power(base, exponent):
return base ** exponent # 部分应用 power 函数
square = functools.partial(power, exponent=2) # 动态修改参数
square.func.exponent = 3 # 调用新函数
print(square(4)) # 输出: 64

在这个例子中,首先创建了一个固定exponent参数为2的新函数square,然后动态修改了exponent参数为3,生成了一个不同的部分应用函数。这样的灵活性能够在程序运行过程中根据需要调整部分应用函数的行为。

2. 自定义函数签名

通过使用functools.wraps,可以保留原始函数的文档字符串和函数签名,使得部分应用函数更具有可读性。

Python
import functools
from functools import wraps # 原始函数
def greet(name, greeting='Hello'):
"""Greet someone with a custom message."""
return f'{greeting}, {name}!' # 使用 functools.partial 和 functools.wraps
greet_hello = functools.partial(greet, greeting='Hello')
greet_hello.__name__ = 'greet_hello' # 修改函数名 # 保留原始函数的文档字符串和函数签名
greet_hello = wraps(greet)(greet_hello) # 查看函数签名
print(greet_hello.__annotations__) # 输出: {'name': <class 'str'>, 'return': <class 'str'>}

通过functools.wraps,能够保留原始函数greet的文档字符串和函数签名,使得greet_hello在查看函数信息时更为友好。

3. 部分应用方法

functools.partial不仅能用于函数,还可以用于方法。下面是一个类方法的部分应用示例:

Python
import functools

class MyClass:
@classmethod
def create(cls, value, multiplier=1):
return cls(value * multiplier) # 部分应用类方法
create_double = functools.partialmethod(MyClass.create, multiplier=2) # 调用新方法
obj = create_double(3)
print(obj.value) # 输出: 6

在这个例子中,使用functools.partialmethod创建了一个新的类方法create_double,其中multiplier参数被固定为2。这展示了functools.partial在类方法的部分应用中的使用方式。

总结

在本文中,深入探讨了Python中的functools.partial,这是一个在实际编程中非常实用的工具。通过基本用法的介绍,了解了如何通过部分应用函数来灵活调整函数的参数,使得代码更为简洁和可读。进一步地,学习了一些高级应用,包括动态修改部分应用函数、自定义函数签名以及在方法上的部分应用。

functools.partial在实际应用中发挥了重要的作用,特别是在简化代码、提高可维护性和灵活性方面。通过创建新的部分应用函数,能够在不改变原有逻辑的基础上,根据需求快速生成新的函数版本。这对于适应不同场景和需求的编程任务非常有帮助。

Python模块之functools.partial的更多相关文章

  1. python标准库--functools.partial

        官方相关地址:https://docs.python.org/3.6/library/functools.html 一.简单介绍: functools模块用于高阶函数:作用于或返回其他函数的函 ...

  2. Python模块学习 - Functools

    Functools模块 Higher-order functions and operations on callable objects,看这个标题我都是懵逼的,这都是啥啥啥啊,赶紧拿出百度翻译:可 ...

  3. Python使用functools模块中的partial函数生成偏函数

    所谓偏函数即是规定了固定参数的函数,在函数式编程中我们经常可以用到,这里我们就来看一下Python使用functools模块中的partial函数生成偏函数的方法 python 中提供一种用于对函数固 ...

  4. python中的functools模块

    functools模块可以作用于所有的可以被调用的对象,包括函数 定义了__call__方法的类等 1 functools.cmp_to_key(func) 将比较函数(接受两个参数,通过比较两个参数 ...

  5. [python 基础]python装饰器(一)添加functools获取原函数信息以及functools.partial分析

    python装饰器学习的时候有两点需要注意一下 1,被装饰器装饰的函数取其func.__name__和func.func_doc的时候得到的不是被修饰函数的相关信息而是装饰器wrapper函数的doc ...

  6. Python标准库: functools (cmp_to_key, lru_cache, total_ordering, partial, partialmethod, reduce, singledispatch, update_wrapper, wraps)

    functools模块处理的对象都是其他的函数,任何可调用对象都可以被视为用于此模块的函数. 1. functools.cmp_to_key(func) 因为Python3不支持比较函数,cmp_to ...

  7. python functools.wraps functools.partial实例解析

    一:python functools.wraps 实例 1. 未使用wraps的实例 #!/usr/bin/env python # coding:utf-8 def logged(func): de ...

  8. python functools.partial

    functools.partial 用一些默认参数包装一个可调用对象,返回结果是可调用对象,并且可以像原始对象一样对待 冻结部分函数位置函数或关键字参数,简化函数,更少更灵活的函数参数调用 refer ...

  9. python的functools.partial的应用

    functools.partial是类似于创造“可移动”函数的意思,参数的第一个是函数名,其他的是这个函数其他参数,例如: generator_func = functools.partial( tf ...

  10. python模块之contexlib

    一.上下文管理器 with是python实现上下文管理器的核心关键词.它能够在代码执行前和执行后做一些额外的事情. 最常见的代码恐怕就是文件操作了. with open("file" ...

随机推荐

  1. 逆向WeChat(六)

    上篇回顾,逆向分析mojo,mmmojo.dll, wmpf_host_export.dll,还有如何通过mojoCore获取c++binding的remote或receiver,并调用它们的功能接口 ...

  2. 工具 – Vitest 与单元测试

    前言 Vitest 是一款配搭 Vite 的前端单元测试工具,可以用于取代 Jasmine 和 Jest. 我先聊一下测试,每当添加新代码或修改旧代码后,我们多少都得测试一下,以确保功能正确才能交付. ...

  3. 我对互联网和网站运作的理解 – Domain, DNS, Hosting 介绍

    前言 一直没有写过关于互联网和网站运作的原理相关文章. 这篇就稍微介绍一下它们. 1. 电脑文件 网站是由许多网页组成的, 网页就是电脑里的 file. extension 是 .html 类似于 . ...

  4. MySQL服务无法启动 服务没有报告任何错误

    安装MYSQL后 启动服务 出现错误 在启动MySQL服务时 出现该报错 解决方法: 将原本在MySQL根目录下的my.ini文件移动到bin目录下(my.ini文件参考:这里)    删除根目录下的 ...

  5. 贝壳找房携手 Flutter,为三亿家庭提供更好的居住服务 | Flutter 开发者故事

    贝壳找房是科技驱动的新居住服务平台,致力于在二手房.新房.租房以及装修等居住领域为三亿家庭提供全方位的品质居住服务.如此庞大的用户群体,自然也有着十分多样和复杂的使用场景和需求.以往使用原生开发模式时 ...

  6. [Tkey] OSU!

    更新的题解可看 此处 你说得对但是 恐怖日本病毒会自动向你的电脑中下载 OSU! 题意简述 一个 01 串,每个位置有 \(p_{i}\) 的概率为 \(1\),连续的 \(x\) 个 \(1\) 贡 ...

  7. 配置windows update失败还原更改

    配置windows update失败还原更改_解决方案 解决方法: 方法1:     重启,按F8,选择最后一次正常启动.     如果还是需要等待.可采用方法2: 方法2:     重启,按F8,选 ...

  8. JS时间对象与字符串相互转换

    1.Date => String 代码 /** * 函数描述:时间格式化工具 * @param format {String} 格式(y-年,M-月,d-日,H-时[24],h-时[12],m- ...

  9. 在华为云上安装高可用 KubeSphere

    随着多云多集群的场景越来越丰富,在各个云厂商环境部署 KubeSphere 的需求随之升高.由于各云厂商的云资源使用规则和菜单导航栏各不相同,会使用户花大量时间去排错.为降低部署过程错误率,本教程使用 ...

  10. python多线程应用-批量下载视频课程(宠医堂)

    #!/usr/bin/env python # -*- coding: UTF-8 -*- ''' @Name: cyt_record_download @IDE:PyCharm @Author:qt ...