Python.三.(一)--1. 函数参数与高阶函数

三、 函数、类与面向对象编程 (OOP)

  • 标题:
    1. 函数参数与高阶函数
    2. 装饰器与闭包
    3. 面向对象三大特征
    4. 类、对象与魔术方法
    5. 异常处理

结论先行

这 6 个问题本质上都围绕一个核心:Python 把函数当作"一等对象",由此衍生出灵活的参数机制和以函数为参数/返回值的高阶函数体系。🎯


1. 函数参数类型与规则

Python 函数参数主要有 5 类,定义时需按固定顺序排列:

  1. 位置参数:必传,按位置匹配
  2. 默认参数:可省略,有默认值
  3. 可变位置参数*args:收集多余位置参数
  4. 关键字参数:用key=value传入
  5. 可变关键字参数**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、赋值),但可用条件表达式。常用于临时、简短的函数场景,尤其配合mapsortedfilter等高阶函数。⚡


4. 函数传参会不会改变参数本身?

结论:取决于参数是"可变对象"还是"不可变对象"。Python 是"对象引用传递"(传的是引用,不是值也不是纯引用)。

类型示例函数内修改的影响
不可变对象intstrtuple重新绑定新对象,不影响原变量
可变对象listdictset原地修改会影响外部;但重新赋值则不影响
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) # 11

mapreducefiltersorted(key=...)都是高阶函数的典型实例。


这些内容的联系

它们构成一条完整的逻辑链:

具体而言:

  • 函数是一等对象是总纲——没有它,就没有高阶函数,lambda 也就无法作为值传递。
  • 参数规则定义了"函数如何接收数据",而*args/**kwargs是这套规则的灵活扩展,让函数能处理任意参数。
  • 传参机制(可变 vs 不可变)是参数行为的底层规则,解释了"为什么有时改了有时没改"。
  • lambda提供轻量级的函数对象,是喂给高阶函数最常用的"原料"。
  • map/reduce是高阶函数的典型应用:它们接收函数(常是 lambda)并作用在数据上。

一句话串联:参数机制负责"把数据/函数送进函数",高阶函数负责"用函数处理数据",lambda 则是临时造函数的工具,三者共同支撑 Python 函数式编程能力。🧩