当前位置: 首页 > news >正文

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 函数式编程能力。🧩

http://www.jsqmd.com/news/1351600/

相关文章:

  • 2026年gif转png工具盘点:在线网站、软件与单帧提取这几款就够了 - 耶斯去水印
  • 单片机中断机制:从轮询困境到事件驱动的异步处理核心
  • 施工企业采购申请与预算软件测评:蓝燕云采购管理控制
  • H指数算法解析:从学术评价到LeetCode解题
  • 广东的连锁餐饮餐具哪家靠谱? - 中媒介
  • 微小不对中 = 巨额损耗,AS500对中仪守住设备与电费成本
  • 使用 STL-GO 进行带时空与拓扑约束的多智能体规划
  • Linux硬链接与软链接原理详解:从Inode到ls/stat/find实战识别
  • Unity脚本生命周期管理:OnEnable/OnDisable自动注册与双缓冲列表实践
  • 养殖场与厂房彩钢瓦锈蚀严重,翻新施工企业怎么选?2026年行业深度观察 - 优质品牌商家
  • 冰蓄冷空调与冷热电联供微网优化技术解析
  • 廊坊选建筑装饰工程铝单板口碑厂家 - 中媒介
  • SpringBoot+Vue全栈二手交易平台开发实战
  • 2026年广东高低温试验箱实力厂家精选:小型/恒温恒湿/冷热冲击/步入式/防爆/快速温变全解析 - 优企名品
  • Java毕设实战:Spring Boot+小程序构建英语学习激励闭环系统
  • Unity Addressable资源管理系统:从核心原理到工程实践
  • 2026年heic转jpg最简单方法盘点:覆盖Windows、Mac、手机与在线免费方案 - 免费软件工具方法教程
  • 2026年304不锈钢三级过滤漏斗专业制造商哪家正规?3家优选甄选名单揭晓 - geo交流
  • Node.js 模块系统:CJS 与 ESM 详解
  • AI内容去味三步法:从塑料感到高级感的实战指南
  • 【二叉树】LC 104.二叉树的最大深度
  • 维修工程师的示波器实战:11 为什么有些问题,一测反而消失了?
  • AirLLM:在4GB显存的GPU上跑70B大模型,不需要量化
  • 泰安本地防水补漏哪家好?屋顶 卫生间 外墙 地下室 阳台堵漏师傅对比(2026年8月新) - 金信达
  • 0372-Raylib-调色板
  • 符合 GB 标准亲肤鞋品 - 中媒介
  • 2026年heic转png工具盘点:哪几款在线转换和免费方法更省心 - 软件小管家
  • 混合模型ANOVA:固定与随机效应的统计分析实践
  • 前端测试实战:从单元测试到E2E的完整指南
  • 广东做智能照明系统哪家不错? - 中媒介