PYTHON函数工具partial用法小结!
PYTHON函数工具partial用法小结!
作者:看烟波浩渺
functools.partial 是 Python 的一个高阶函数工具,用于固定函数的某些参数,生成新的函数对象,具有一定的参考价值,感兴趣的可以了解一下。
基本语法
|
1
2
3
4
5
6
7
8
9
|
from functools import partialnew_func = partial(func, *args, **kwargs)- func:要部分应用的原始函数-*args:要固定的位置参数- **kwargs:要固定的关键字参数- 返回一个新的可调用对象 new_func |
以下是详细用法和示例:
一、基础概念
|
1
2
3
4
5
6
7
8
9
10
11
|
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 |
作用:通过预填充部分参数,生成一个更简洁的调用接口。
二、核心用法
固定位置参数
|
1
2
3
4
5
6
7
8
9
10
11
12
|
from functools import partialdef 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 |
固定关键字参数
|
1
2
3
4
5
6
|
def greet(greeting, name="Guest"):return f"{greeting}, {name}!"#固定 greeting="Hello"say_hello = partial(greet, greeting="Hello")print(say_hello("Alice")) # "Hello, Alice!" |
混合参数绑定
|
1
2
3
4
5
6
|
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 编程参数绑定
|
1
2
3
4
5
6
7
8
9
10
11
12
|
import tkinter as tkfrom functools import partialdef 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")) |
数据处理管道
|
1
2
3
4
5
6
7
8
9
|
from functools import partialdata = [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] |
装饰器参数预配置
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
from functools import partial, wrapsdef 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(): passmy_function() # 输出: Decorated with INFO |
四、进阶技巧
获取原函数信息
|
1
2
3
4
5
6
7
8
9
|
from functools import partialdef example(a, b): passp = partial(example, 1)print(p.func) # <function example at ...>print(p.args) # (1,)print(p.keywords) # {} |
支持 name 属性(Python 3.3+)
|
1
2
3
4
5
6
7
|
from functools import partialdef my_func(): passp = partial(my_func)print(p.__name__) # 输出: my_func |
可哈希性
from functools import partial
#需要实现 hash 方法才能作为字典键
|
1
2
3
4
5
6
|
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.参数顺序敏感
固定参数必须按原函数参数顺序传递:
|
1
2
3
4
5
6
7
8
9
10
|
from functools import partialdef func(a, b, c): return (a+b)*c#正确: 固定 a=1, b=2p = partial(func, 1, 2)print(p(3)) # 9#错误: 无法直接固定 c=3p = partial(func,3) #3 传递给了aprint(p(1,2)) #8 即:(3+1)*2 |
2.不可直接修改
partial 对象不可变,若需修改需重新创建。
3.与 lambda 的区别
partial 性能优于 lambda,但功能更受限于参数绑定。
到此这篇关于PYTHON函数工具partial用法小结的文章就介绍到这了。
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需129元,即可下载本站文章涉及的文件和软件。

