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()(原地改)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

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


这些内容的联系

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

具体而言:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值