Python.三.(一)--1. 函数参数与高阶函数
三、 函数、类与面向对象编程 (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()(原地改)vslst = [...](重新绑定,外部无感)。
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) # 11map、reduce、filter、sorted(key=...)都是高阶函数的典型实例。
这些内容的联系
它们构成一条完整的逻辑链:
具体而言:
- 函数是一等对象是总纲——没有它,就没有高阶函数,lambda 也就无法作为值传递。
- 参数规则定义了"函数如何接收数据",而
*args/**kwargs是这套规则的灵活扩展,让函数能处理任意参数。 - 传参机制(可变 vs 不可变)是参数行为的底层规则,解释了"为什么有时改了有时没改"。
- lambda提供轻量级的函数对象,是喂给高阶函数最常用的"原料"。
- map/reduce是高阶函数的典型应用:它们接收函数(常是 lambda)并作用在数据上。
一句话串联:参数机制负责"把数据/函数送进函数",高阶函数负责"用函数处理数据",lambda 则是临时造函数的工具,三者共同支撑 Python 函数式编程能力。🧩
