在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. Python存储与读写二进制文件

    技术背景 一般情况下我们会选择使用明文形式来存储数据,如json.txt.csv等等.如果是需要压缩率较高的存储格式,还可以选择使用hdf5或者npz等格式.还有一种比较紧凑的数据存储格式,就是直接按 ...

  2. webpack系列-externals配置使用(CDN方式引入JS)

    如果需要引用一个库,但是又不想让webpack打包(减少打包的时间),并且又不影响我们在程序中以CMD.AMD或者window/global全局等方式进行使用(一般都以import方式引用使用),那就 ...

  3. BOM – Navigator SendBeacon

    介绍 游览器专门做给 tracking 用的接口. 从前我们想 tracking 用户点击 anchor 是比较麻烦的. 因为 click 事件触发后, 想发 ajxax 去做 tracking re ...

  4. k8s 操作命令(合集List)

    k8s 操作命令 合集List 一.K8S最常用命令如下: 1.获取pod信息:kubectl get pod 2.查看指定pod的日志信息:kubectl logs -f --tail(最后多少行) ...

  5. Windows 调试工具课程

    本文是我在集团内部上的课程记录而成的博客内容.在本次课程里面将和大家介绍一些在 Windows 上常用的调试工具,以及调查问题的常见套路.适合于伙伴们入门 Windows 调试 本文以下内容是采用原本 ...

  6. JavaScript 学习路线图

    基础阶段 主要内容: 掌握 JavaScript 的基本语法,如变量.数据类型(字符串.数字.布尔.对象.数组等).运算符等. 理解程序的控制流,包括条件语句(如 if-else).循环语句(如 fo ...

  7. nexus 部署与设置

    安装nexus df -h 先查看目录磁盘空间,我安装的版本占用了四个G 空间,目录文件空间不够导致启动失败 上传 nexus 压缩包,并解压 查询 8081 端口号是否被占用 sudo netsta ...

  8. 揭秘!尤雨溪成立的VoidZero如何改变前端世界

    前言 Vue和Vite之父尤雨溪宣布成立公司 VoidZero,目前已经融资3200万.这篇文章欧阳将带你了解VoidZero是如何改变javascript的世界! 关注公众号:[前端欧阳],给自己一 ...

  9. 安装seaborn

    第一步:安装scipy,因为seaborn依赖scipy,如何安装scipy我之前有说过,可以看我之前安装sklearn库的过程中有安装scipy的方法. 第二步:pip install seabor ...

  10. 华为Ensp拓扑,使用MSTP、OSPF、DHCP、VRRP、链路聚合、CHAP

    OSPF+DHCP+VRRP+Eth-trunk+PPP(CHAP)+MSTP 实验目标: LSW1和LSW2核心交换机互为备份,配置链路聚合,设备冗余设计,LSW1和LSW2作为核心交换机配置DHC ...