|
|
Python高阶函数中偏函数的用法
《零基础入门学习Python》(最新版)第52课高阶函数中。
偏函数的用法不是很理解。能否举例讲一讲。
你好!偏函数这个概念初听起来可能有点抽象,但其实它做了一件非常实用且简单的事情:**固定住原函数的部分参数,从而创建一个新的、更简单、更专用的函数**。
你可以把它想象成家电上的“预设”按钮。比如全自动咖啡机有很多参数(豆量、水温、奶泡量),但你可以设置一个“美式咖啡”按钮,这个按钮就固定了制作美式咖啡的那一套参数。以后你只需按这个“美式按钮”,而不用每次都去调一大堆设置。这个“美式按钮”就是一个“偏函数”。
在Python中,我们使用 functools.partial 来创建偏函数。
它的基本语法是:
- new_func = partial(old_func, *args, **kwargs)
复制代码
其中 old_func 是原始函数,*args, **kwargs 是你想要固定的参数。返回的 new_func 就是一个被固定了部分参数的“新函数”。
**核心要点:** 偏函数固定参数时,是**从左到右**依次固定的。新函数调用时,只需传入剩余未固定的参数。
---
### 举例说明:理解进制转换
Python的内置函数 int() 可以把字符串转换成整数。它有一个可选参数 base(默认是10),表示进制。
- # 正常使用int()
- print(int('1010')) # 默认按十进制,结果是 1010
- print(int('1010', base=2)) # 明确指定按二进制,结果是 10 (十进制)
- print(int('FF', base=16)) # 明确指定按十六进制,结果是 255 (十进制)
复制代码
现在有个需求:在代码中,我们需要大量地把二进制字符串转成十进制整数。每次都要写 base=2 很麻烦。
**这时候,偏函数就派上用场了!**
- from functools import partial
- # 创建一个新的函数 int2
- # 这个新函数固定了 int() 的 base 参数为 2
- int2 = partial(int, base=2)
- # 现在,使用我们创建的新函数 int2
- print(int2('1010')) # 结果:10。 等同于 int('1010', base=2)
- print(int2('1111')) # 结果:15
- print(int2('10000')) # 结果:16
复制代码
看!我们创建了一个叫 int2 的“新函数”。它专门用来处理二进制转换,调用时简洁多了。
同样,我们可以创建一个专门处理十六进制的偏函数:
- int16 = partial(int, base=16)
- print(int16('FF')) # 结果:255
- print(int16('A0')) # 结果:160
复制代码
---
### 另一个例子:固定多个参数
假设我们有一个计算乘方的函数:
- def power(base, exponent):
- return base ** exponent
- # 我们想要一个专门计算“平方”的函数
- square = partial(power, exponent=2)
- # 这里固定了 exponent 参数为 2
- print(square(5)) # 结果:25。 等同于 power(5, exponent=2)
- print(square(10)) # 结果:100
- # 我们想要一个专门计算“立方”的函数
- cube = partial(power, exponent=3)
- print(cube(3)) # 结果:27
复制代码
---
### 一个重要的细节:参数顺序
偏函数固定参数是按顺序的。我们再看一个例子:
- def show_info(name, age, city):
- print(f"{name} is {age} years old, from {city}")
- # 固定第一个参数 name
- show_tom_info = partial(show_info, 'Tom')
- # 现在调用 show_tom_info,只需要提供剩下的 age 和 city
- show_tom_info(25, 'New York') # 输出:Tom is 25 years old, from New York
- # 如果我们想固定中间参数 age 为 30
- show_adult_info = partial(show_info, age=30)
- # 注意:因为name是第一个位置参数,没有被固定,所以调用时第一个值会给name,city用关键字传参更安全
- show_adult_info('Jerry', city='Shanghai') # 输出:Jerry is 30 years old, from Shanghai
复制代码
---
### 自己动手创建一个“偏函数” (理解原理)
其实你可以不用 partial,手动实现类似功能,这能帮你理解偏函数在干什么:
- # 原始函数
- def multiply(x, y):
- return x * y
- # 手动创建一个“偏函数”,固定第一个参数x为10
- def multiply_by_10(y):
- return multiply(10, y) # 在内部调用了原始函数,并固定了x=10
- print(multiply_by_10(5)) # 结果:50
- print(multiply_by_10(7)) # 结果:70
复制代码
而 functools.partial 就是自动化、通用化地帮你完成上面这个“包装”过程。
### 总结
偏函数(functools.partial)的主要作用和优点:
1. **简化调用**:减少重复代码,让调用更简洁。
2. **提高可读性**:新函数的名字(如 int2, square)能更清晰地表达其专用用途。
3. **冻结参数**:把一个需要多个参数的函数,变成参数更少的新函数,这非常符合函数式编程的思想。
当你发现某个函数需要反复用相同的几个参数调用时,就可以考虑使用偏函数来优化你的代码了。希望这个解释和例子能帮助你理解!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|