hbirthday 发表于 昨天 11:37

Python高阶函数中偏函数的用法

《零基础入门学习Python》(最新版)第52课高阶函数中。
偏函数的用法不是很理解。能否举例讲一讲。

FishC 发表于 昨天 11:38

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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: Python高阶函数中偏函数的用法