PYTHON函数工具partial用法小结

 更新时间:2025年07月13日 10:28:35   作者:看烟波浩渺  
functools.partial 是 Python 的一个高阶函数工具,用于固定函数的某些参数,生成新的函数对象,具有一定的参考价值,感兴趣的可以了解一下

functools.partial 是 Python 的一个高阶函数工具,用于固定函数的某些参数,生成新的函数对象。它的核心作用是参数预填充,减少重复代码。这在函数式编程中是一个常见的技术。python中partial被称为偏函数。

基本语法

from functools import partial

new_func = partial(func, *args, **kwargs)


- func:要部分应用的原始函数
-*args:要固定的位置参数
- **kwargs:要固定的关键字参数
- 返回一个新的可调用对象 new_func

以下是详细用法和示例:

一、基础概念

from functools import partial

#原函数
def func(a, b, c=3):
    return a + b + c

#固定参数生成新函数
new_func = partial(func, 1, c=10)  # 固定 a=1, c=10

#调用时只需传递剩余参数
print(new_func(2))  # 输出: 1 + 2 + 10 = 13

作用:通过预填充部分参数,生成一个更简洁的调用接口。

二、核心用法

固定位置参数

from functools import partial

def power(base, exponent):
    return base ** exponent

#固定 exponent=2,生成平方函数See:这有点像函数工厂
square = partial(power, exponent=2)
print(square(3))  # 3^2=9

#固定 pxponent=3,生成立方函数
cube = partial(power, exponent=3)
print(cube(2))    # 2^3=8

固定关键字参数

def greet(greeting, name="Guest"):
    return f"{greeting}, {name}!"

#固定 greeting="Hello"
say_hello = partial(greet, greeting="Hello")
print(say_hello("Alice"))  # "Hello, Alice!"

混合参数绑定

def connect(host, port=8080, timeout=10):
    print(f"Connecting to {host}:{port} (timeout={timeout}s)")

#固定 host 和 timeout,生成新函数
fast_connect = partial(connect, "example.com", timeout=5)
fast_connect(9090)  # 输出: Connecting to example.com:9090 (timeout=5s)

三、典型应用场景

GUI 编程参数绑定

import tkinter as tk
from functools import partial

def create_button(root, text, command):
    btn = tk.Button(root, text=text, command=command)
    btn.pack()

root = tk.Tk()

#为不同按钮绑定不同参数
create_button(root, "Btn1", partial(print, "Button 1 clicked"))
create_button(root, "Btn2", partial(print, "Button 2 clicked"))

数据处理管道

from functools import partial
data = [1, 2, 3, 4, 5]

#固定幂次生成函数
square = partial(map, lambda x: x**2)
cube = partial(map, lambda x: x**3)

print(list(square(data)))  # [1, 4, 9, 16, 25]
print(list(cube(data)))    # [1, 8, 27, 64, 125]

装饰器参数预配置

from functools import partial, wraps

def log(level, message):
    print(f"[{level}] {message}")

info = partial(log, "INFO")

#定义装饰器工厂
def decorator(level):  # 关键:定义装饰器工厂
    def actual_decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            print(f"Decorated with {level.args[0]}")
            return func(*args, **kwargs)
        return wrapper
    return actual_decorator

#正确应用装饰器
@decorator(level=info)
def my_function():
    pass

my_function()  # 输出: Decorated with INFO

四、进阶技巧

获取原函数信息

from functools import partial

def example(a, b):
    pass

p = partial(example, 1)
print(p.func)    # <function example at ...>
print(p.args)    # (1,)
print(p.keywords) # {}

支持 name 属性(Python 3.3+)

from functools import partial

def my_func():
    pass

p = partial(my_func)
print(p.__name__)  # 输出: my_func

可哈希性
from functools import partial

#需要实现 hash 方法才能作为字典键

class HashablePartial(partial):
    def __hash__(self):
        return hash((self.func, self.args, frozenset(self.keywords.items())))

hp = HashablePartial(print, "test")
cache = {hp: "cached value"}

五、注意事项

1.参数顺序敏感

固定参数必须按原函数参数顺序传递:

from functools import partial
def func(a, b, c):
    return (a+b)*c

#正确: 固定 a=1, b=2
p = partial(func, 1, 2)
print(p(3)) # 9
#错误: 无法直接固定 c=3
p = partial(func,3) #3 传递给了a
print(p(1,2)) #8 即:(3+1)*2

2.不可直接修改
partial 对象不可变,若需修改需重新创建。

3.与 lambda 的区别
partial 性能优于 lambda,但功能更受限于参数绑定。

到此这篇关于PYTHON函数工具partial用法小结的文章就介绍到这了,更多相关PYTHON partial内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python判断远程服务器上Excel文件是否被人打开的方法

    Python判断远程服务器上Excel文件是否被人打开的方法

    这篇文章主要介绍了Python如何判断远程服务器上Excel文件是否被人打开,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Python深入分析@property装饰器的应用

    Python深入分析@property装饰器的应用

    这篇文章主要介绍了Python @property装饰器的用法,在Python中,可以通过@property装饰器将一个方法转换为属性,从而实现用于计算的属性,下面文章围绕主题展开更多相关详情,感兴趣的小伙伴可以参考一下
    2022-07-07
  • Python+pytorch实现天气识别

    Python+pytorch实现天气识别

    这篇文章主要为大家详细介绍了如何利用Python+pytorch实现天气识别功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-10-10
  • Python学习之名字,作用域,名字空间

    Python学习之名字,作用域,名字空间

    这篇文章主要介绍了Python学习之名字,作用域,名字空间,文章围绕主题展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考以一下
    2022-05-05
  • tensorflow官方github预训练模型下载方式

    tensorflow官方github预训练模型下载方式

    这篇文章主要介绍了tensorflow官方github预训练模型下载方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 浅谈Python的格式化输出

    浅谈Python的格式化输出

    这篇文章主要介绍了python中的格式化输出用法,分析了Python格式化输出的种类并结合实例形式总结了针对浮点数的格式化输出方法,需要的朋友可以参考下
    2021-10-10
  • 如何理解python中数字列表

    如何理解python中数字列表

    在本篇文章里小编给大家分享的是关于python中数字列表知识点详解,有兴趣的朋友们可以参考下。
    2020-05-05
  • Python实现的排列组合计算操作示例

    Python实现的排列组合计算操作示例

    这篇文章主要介绍了Python实现的排列组合计算操作,涉及Python数学运算的相关函数与使用技巧,需要的朋友可以参考下
    2017-10-10
  • Python实现将Excel某范围单元格内容截图

    Python实现将Excel某范围单元格内容截图

    Openpyxl是一个强大的Python库,主要用于读取、写入和操作Excel文件,本文将使用Openpyxl实现将Excel某范围单元格内容截图,感兴趣的可以了解下
    2024-11-11
  • pytorch中forwod函数在父类中的调用方式解读

    pytorch中forwod函数在父类中的调用方式解读

    这篇文章主要介绍了pytorch中forwod函数在父类中的调用方式解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论