三、 函数、类与面向对象编程 (OOP)
- 标题:
- 函数参数与高阶函数
- 装饰器与闭包
- 面向对象三大特征
- 类、对象与魔术方法
- 异常处理
结论先行
这 6 个问题本质上都围绕一个核心:Python 把函数当作"一等对象",由此衍生出灵活的参数机制和以函数为参数/返回值的高阶函数体系。🎯
1. 函数参数类型与规则
Python 函数参数主要有 5 类,定义时需按固定顺序排列:
- 位置参数:必传,按位置匹配
- 默认参数:可省略,有默认值
- 可变位置参数
*args:收集多余位置参数 - 关键字参数:用
key=value传入 - 可变关键字参数
**kwargs:收集多余关键字参数
规则顺序:位置参数 → 默认参数 → *args → 关键字参数 → **kwargs。例如:
def f(a, b=2, *args, c, **kwargs):
pass
其中 c 是仅限关键字参数(在 *args 之后必须用关键字传入)。
2. *args 与 **kwargs 的区别
*args:把多余的位置参数打包成一个元组tuple**kwargs:把多余的关键字参数打包成一个字典dict
def demo(*args, **kwargs):
print(args) # (1, 2, 3)
print(kwargs) # {'x': 1, 'y': 2}
demo(1, 2, 3, x=1, y=2)
口诀:一颗星收位置成元组,两颗星收关键字成字典。⭐
3. lambda 表达式
lambda 是匿名函数的简写,语法为 lambda 参数: 表达式:
square = lambda x: x ** 2
print(square(5)) # 25
限制:只能写单个表达式,不能包含语句(如 if-else 块、for、赋值),但可用条件表达式。常用于临时、简短的函数场景,尤其配合 map、sorted、filter 等高阶函数。⚡
4. 函数传参会不会改变参数本身?
结论:取决于参数是"可变对象"还是"不可变对象"。 Python 是"对象引用传递"(传的是引用,不是值也不是纯引用)。
| 类型 | 示例 | 函数内修改的影响 |
|---|---|---|
| 不可变对象 | int、str、tuple | 重新绑定新对象,不影响原变量 |
| 可变对象 | list、dict、set | 原地修改会影响外部;但重新赋值则不影响 |
def modify(lst):
lst.append(4) # 原地修改 → 外部列表变化
a = [1, 2, 3]
modify(a)
print(a) # [1, 2, 3, 4]
关键区分:lst.append()(原地改)vs lst = [...](重新绑定,外部无感)。
5. map 和 reduce 的用法
map:对可迭代对象逐元素应用函数,返回迭代器。
nums = [1, 2, 3]
squared = list(map(lambda x: x**2, nums)) # [1, 4, 9]
reduce:对序列累计计算,把多个值归约成一个值(Python3 中需从 functools 导入)。
from functools import reduce
product = reduce(lambda x, y: x * y, [1, 2, 3, 4]) # 24
对比:map 是"一对一映射",reduce 是"多对一归约"。🔄
6. 高阶函数的原理
高阶函数指满足以下任一条件的函数:
- 接受一个或多个函数作为参数
- 返回一个函数作为结果
其根本前提是 Python 函数是一等对象(first-class object),可被赋值、传参、返回。
def apply(f, x): # 接收函数 f
return f(x)
apply(lambda x: x + 1, 10) # 11
map、reduce、filter、sorted(key=...) 都是高阶函数的典型实例。
这些内容的联系
它们构成一条完整的逻辑链:

具体而言:
- 函数是一等对象是总纲——没有它,就没有高阶函数,lambda 也就无法作为值传递。
- 参数规则定义了"函数如何接收数据",而
*args/**kwargs是这套规则的灵活扩展,让函数能处理任意参数。 - 传参机制(可变 vs 不可变)是参数行为的底层规则,解释了"为什么有时改了有时没改"。
- lambda 提供轻量级的函数对象,是喂给高阶函数最常用的"原料"。
- map/reduce 是高阶函数的典型应用:它们接收函数(常是 lambda)并作用在数据上。
一句话串联:参数机制负责"把数据/函数送进函数",高阶函数负责"用函数处理数据",lambda 则是临时造函数的工具,三者共同支撑 Python 函数式编程能力。 🧩
--1. 函数参数与高阶函数&spm=1001.2101.3001.5002&articleId=163532686&d=1&t=3&u=5992363ed537429f82a5cee9c324b2ef)
1063

被折叠的 条评论
为什么被折叠?



