鱼C论坛

 找回密码
 立即注册
查看: 47|回复: 1

[已解决]Python高阶函数中偏函数的用法

[复制链接]
发表于 昨天 11:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


你好!偏函数这个概念初听起来可能有点抽象,但其实它做了一件非常实用且简单的事情:**固定住原函数的部分参数,从而创建一个新的、更简单、更专用的函数**。

你可以把它想象成家电上的“预设”按钮。比如全自动咖啡机有很多参数(豆量、水温、奶泡量),但你可以设置一个“美式咖啡”按钮,这个按钮就固定了制作美式咖啡的那一套参数。以后你只需按这个“美式按钮”,而不用每次都去调一大堆设置。这个“美式按钮”就是一个“偏函数”。

在Python中,我们使用 functools.partial 来创建偏函数。

它的基本语法是:

  1. new_func = partial(old_func, *args, **kwargs)
复制代码

其中 old_func 是原始函数,*args, **kwargs 是你想要固定的参数。返回的 new_func 就是一个被固定了部分参数的“新函数”。

**核心要点:** 偏函数固定参数时,是**从左到右**依次固定的。新函数调用时,只需传入剩余未固定的参数。

---

### 举例说明:理解进制转换

Python的内置函数 int() 可以把字符串转换成整数。它有一个可选参数 base(默认是10),表示进制。

  1. # 正常使用int()
  2. print(int('1010')) # 默认按十进制,结果是 1010
  3. print(int('1010', base=2)) # 明确指定按二进制,结果是 10 (十进制)
  4. print(int('FF', base=16)) # 明确指定按十六进制,结果是 255 (十进制)
复制代码


现在有个需求:在代码中,我们需要大量地把二进制字符串转成十进制整数。每次都要写 base=2 很麻烦。

**这时候,偏函数就派上用场了!**


  1. from functools import partial

  2. # 创建一个新的函数 int2
  3. # 这个新函数固定了 int() 的 base 参数为 2
  4. int2 = partial(int, base=2)

  5. # 现在,使用我们创建的新函数 int2
  6. print(int2('1010')) # 结果:10。 等同于 int('1010', base=2)
  7. print(int2('1111')) # 结果:15
  8. print(int2('10000')) # 结果:16
复制代码


看!我们创建了一个叫 int2 的“新函数”。它专门用来处理二进制转换,调用时简洁多了。

同样,我们可以创建一个专门处理十六进制的偏函数:

  1. int16 = partial(int, base=16)
  2. print(int16('FF')) # 结果:255
  3. print(int16('A0')) # 结果:160
复制代码


---

### 另一个例子:固定多个参数

假设我们有一个计算乘方的函数:

  1. def power(base, exponent):
  2.     return base ** exponent

  3. # 我们想要一个专门计算“平方”的函数
  4. square = partial(power, exponent=2)
  5. # 这里固定了 exponent 参数为 2
  6. print(square(5)) # 结果:25。 等同于 power(5, exponent=2)
  7. print(square(10)) # 结果:100

  8. # 我们想要一个专门计算“立方”的函数
  9. cube = partial(power, exponent=3)
  10. print(cube(3)) # 结果:27
复制代码


---

### 一个重要的细节:参数顺序

偏函数固定参数是按顺序的。我们再看一个例子:

  1. def show_info(name, age, city):
  2.     print(f"{name} is {age} years old, from {city}")

  3. # 固定第一个参数 name
  4. show_tom_info = partial(show_info, 'Tom')
  5. # 现在调用 show_tom_info,只需要提供剩下的 age 和 city
  6. show_tom_info(25, 'New York') # 输出:Tom is 25 years old, from New York

  7. # 如果我们想固定中间参数 age 为 30
  8. show_adult_info = partial(show_info, age=30)
  9. # 注意:因为name是第一个位置参数,没有被固定,所以调用时第一个值会给name,city用关键字传参更安全
  10. show_adult_info('Jerry', city='Shanghai') # 输出:Jerry is 30 years old, from Shanghai
复制代码


---

### 自己动手创建一个“偏函数” (理解原理)

其实你可以不用 partial,手动实现类似功能,这能帮你理解偏函数在干什么:

  1. # 原始函数
  2. def multiply(x, y):
  3.     return x * y

  4. # 手动创建一个“偏函数”,固定第一个参数x为10
  5. def multiply_by_10(y):
  6.     return multiply(10, y) # 在内部调用了原始函数,并固定了x=10

  7. print(multiply_by_10(5)) # 结果:50
  8. print(multiply_by_10(7)) # 结果:70
复制代码

functools.partial 就是自动化、通用化地帮你完成上面这个“包装”过程。

### 总结

偏函数(functools.partial)的主要作用和优点:
1.  **简化调用**:减少重复代码,让调用更简洁。
2.  **提高可读性**:新函数的名字(如 int2, square)能更清晰地表达其专用用途。
3.  **冻结参数**:把一个需要多个参数的函数,变成参数更少的新函数,这非常符合函数式编程的思想。

当你发现某个函数需要反复用相同的几个参数调用时,就可以考虑使用偏函数来优化你的代码了。希望这个解释和例子能帮助你理解!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 11:38 | 显示全部楼层    本楼为最佳答案   
Python高阶函数中偏函数的用法
《零基础入门学习Python》(最新版)第52课高阶函数中。
偏函数的用法不是很理解。能否举例讲一讲。


你好!偏函数这个概念初听起来可能有点抽象,但其实它做了一件非常实用且简单的事情:**固定住原函数的部分参数,从而创建一个新的、更简单、更专用的函数**。

你可以把它想象成家电上的“预设”按钮。比如全自动咖啡机有很多参数(豆量、水温、奶泡量),但你可以设置一个“美式咖啡”按钮,这个按钮就固定了制作美式咖啡的那一套参数。以后你只需按这个“美式按钮”,而不用每次都去调一大堆设置。这个“美式按钮”就是一个“偏函数”。

在Python中,我们使用 functools.partial 来创建偏函数。

它的基本语法是:

  1. new_func = partial(old_func, *args, **kwargs)
复制代码

其中 old_func 是原始函数,*args, **kwargs 是你想要固定的参数。返回的 new_func 就是一个被固定了部分参数的“新函数”。

**核心要点:** 偏函数固定参数时,是**从左到右**依次固定的。新函数调用时,只需传入剩余未固定的参数。

---

### 举例说明:理解进制转换

Python的内置函数 int() 可以把字符串转换成整数。它有一个可选参数 base(默认是10),表示进制。

  1. # 正常使用int()
  2. print(int('1010')) # 默认按十进制,结果是 1010
  3. print(int('1010', base=2)) # 明确指定按二进制,结果是 10 (十进制)
  4. print(int('FF', base=16)) # 明确指定按十六进制,结果是 255 (十进制)
复制代码


现在有个需求:在代码中,我们需要大量地把二进制字符串转成十进制整数。每次都要写 base=2 很麻烦。

**这时候,偏函数就派上用场了!**


  1. from functools import partial

  2. # 创建一个新的函数 int2
  3. # 这个新函数固定了 int() 的 base 参数为 2
  4. int2 = partial(int, base=2)

  5. # 现在,使用我们创建的新函数 int2
  6. print(int2('1010')) # 结果:10。 等同于 int('1010', base=2)
  7. print(int2('1111')) # 结果:15
  8. print(int2('10000')) # 结果:16
复制代码


看!我们创建了一个叫 int2 的“新函数”。它专门用来处理二进制转换,调用时简洁多了。

同样,我们可以创建一个专门处理十六进制的偏函数:

  1. int16 = partial(int, base=16)
  2. print(int16('FF')) # 结果:255
  3. print(int16('A0')) # 结果:160
复制代码


---

### 另一个例子:固定多个参数

假设我们有一个计算乘方的函数:

  1. def power(base, exponent):
  2.     return base ** exponent

  3. # 我们想要一个专门计算“平方”的函数
  4. square = partial(power, exponent=2)
  5. # 这里固定了 exponent 参数为 2
  6. print(square(5)) # 结果:25。 等同于 power(5, exponent=2)
  7. print(square(10)) # 结果:100

  8. # 我们想要一个专门计算“立方”的函数
  9. cube = partial(power, exponent=3)
  10. print(cube(3)) # 结果:27
复制代码


---

### 一个重要的细节:参数顺序

偏函数固定参数是按顺序的。我们再看一个例子:

  1. def show_info(name, age, city):
  2.     print(f"{name} is {age} years old, from {city}")

  3. # 固定第一个参数 name
  4. show_tom_info = partial(show_info, 'Tom')
  5. # 现在调用 show_tom_info,只需要提供剩下的 age 和 city
  6. show_tom_info(25, 'New York') # 输出:Tom is 25 years old, from New York

  7. # 如果我们想固定中间参数 age 为 30
  8. show_adult_info = partial(show_info, age=30)
  9. # 注意:因为name是第一个位置参数,没有被固定,所以调用时第一个值会给name,city用关键字传参更安全
  10. show_adult_info('Jerry', city='Shanghai') # 输出:Jerry is 30 years old, from Shanghai
复制代码


---

### 自己动手创建一个“偏函数” (理解原理)

其实你可以不用 partial,手动实现类似功能,这能帮你理解偏函数在干什么:

  1. # 原始函数
  2. def multiply(x, y):
  3.     return x * y

  4. # 手动创建一个“偏函数”,固定第一个参数x为10
  5. def multiply_by_10(y):
  6.     return multiply(10, y) # 在内部调用了原始函数,并固定了x=10

  7. print(multiply_by_10(5)) # 结果:50
  8. print(multiply_by_10(7)) # 结果:70
复制代码

functools.partial 就是自动化、通用化地帮你完成上面这个“包装”过程。

### 总结

偏函数(functools.partial)的主要作用和优点:
1.  **简化调用**:减少重复代码,让调用更简洁。
2.  **提高可读性**:新函数的名字(如 int2, square)能更清晰地表达其专用用途。
3.  **冻结参数**:把一个需要多个参数的函数,变成参数更少的新函数,这非常符合函数式编程的思想。

当你发现某个函数需要反复用相同的几个参数调用时,就可以考虑使用偏函数来优化你的代码了。希望这个解释和例子能帮助你理解!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-10 11:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表