type
status
date
slug
summary
tags
category
icon
password
📝 函数基础
1、函数简介
函数是具有某种特定功能的代码块,可以重复使用
2、函数定义
📝 函数参数概述
1、5 种参数类型速查
类型 | 关键字 | 语法示例 | 调用示例 | 说明 |
位置参数(positional-only) | 无 | def f(a, b, /): | f(1, 2) | 必须按位置,禁止关键字 |
位置或关键字 | 无 | def f(a, b): | f(1, 2) 或 f(a=1, b=2) | 默认形态 |
关键字参数(keyword-only) | *, | def f(*, k): | f(k=3) | 必须显式 k=... |
默认参数 | = | def f(a, b=0): | f(1) | 缺省值 |
可变位置 | *args | def f(*args): | f(1, 2, 3) | 多余位置收集成元组 |
可变关键字 | **kwargs | def f(**kwargs): | f(a=1, b=2) | 多余关键字收集成字典 |
2、4 阶顺序规则(PEP 570/PEP 3102)
/
左侧:仅限位置
- 左侧:位置或关键字
- 右侧:仅限关键字
*kwargs
最后收集剩余关键字
📝 函数参数类型
1、位置参数
1.1、简介
位置参数是最常见的函数形参类型,它要求调用者 按形参在定义中的顺序 依次传入实参。
在 没有
/
或 限定符 时,位置参数也允许 关键字传参;一旦加了 /
,则强制“仅限位置”1.2、语法规则
根据函数定义的参数位置来传递参数,要求传递的参数与函数定义的参数两者一一对应
如果 “传递的参数个数” 不等于 “函数定义的参数个数”,运行时会报错
2、关键字参数
2.1、简介
关键字参数允许调用者 以“键=值”形式 传参,不再受形参顺序限制,提高可读性、容错性和可扩展性。可与位置参数混用,但需遵循 位置在前、关键字在后 的顺序。
2.2、语法规则
定义端:
- 默认形态:形参无特殊符号 → 支持位置或关键字
- 强制关键字:在形参列表中插入
,
或, kw
→ 其后形参 必须 用关键字传值
调用端:
func(key=value)
或 func(pos, key=value)
顺序约束:位置实参 →
*args
→ 关键字实参 → **kwargs
3、默认参数
3.1、简介
默认参数允许在 函数定义 时为形参指定一个 缺省值,调用者可选择省略该参数,从而简化调用并增强向后兼容性。
3.2、语法规则
默认值可以是任意 不可变或可变的 Python 对象。
默认值只在函数定义时求值一次,并在后续所有调用中共享(见常见陷阱)。
默认参数 必须排在非默认参数之后。
3.3、调用规则
调用方式 | 结果 |
省略默认参数 | 使用默认值 |
显式传值 | 覆盖默认值 |
3.4、默认参数陷阱 —— 可变对象共享
4、可变位置
4.1、简介
可变位置参数允许函数接收 任意数量的“多余”位置实参,并将它们打包成一个 元组。常用于需要“不定数量输入”的场景,如求和、日志格式化、装饰器封装等。
4.2、语法规则
定义端:在形参名前加 单个星号 *,习惯命名为
*args
(args 不是关键字,可改)。位置约束:
*args
必须位于 普通位置参数之后、默认参数之前(若有默认参数需放在 *args
之后,见 PEP 3102)。调用端:多余的 位置实参 被 依次收集到元组。
4.3、常见错误
位置实参在前:
*args
之后不能再出现 普通位置参数(会触发语法错误)。默认参数位置:若需要默认参数,应放在
*args
之后,并用 仅限关键字 或 **kwargs
接收。5、可变关键字
5.1、简介
可变关键字参数允许函数接收 任意数量的“多余”关键字实参,并将它们打包成一个 字典(key 为字符串)。常用于 动态配置、装饰器、插件系统、日志封装 等需要“不定名参数”的场景。
5.2、语法规则
定义端:在形参名前加 两个星号,习惯命名为
**kwargs
(kwargs 不是关键字,可改)。位置约束:
**kwargs
必须位于 所有其他形参之后。调用端:多余的 关键字实参 被 收集成 dict。
5.3、常见错误
**kwargs
不在末尾:语法错误。键冲突:实参名与显式形参同名 → TypeError: 重复关键字参数。
📝 函数返回值
1、语法规则
return 一旦执行,函数 立即终止,后续代码不再执行。
没有 return 或 return 后面无表达式 → 隐式返回 None。
2、返回值的 6 种形态
形态 | 示例 | 调用者接收 |
单一值 | return 42 | 42 |
多个值(打包元组) | return a, b | (a, b) |
列表/字典/对象 | return [1, 2] | [1, 2] |
生成器 | yield x | 生成器对象 |
None(空函数) | 无 return | None |
提前 return | if cond: return | 提前终止 |
3、None
的两种语义
无意义函数:如纯副作用 print()。
占位/默认:如未找到结果返回 None,调用者可 if result is None: 判断。
4、多值返回(元组打包)
5、提前 return 与守卫语句
6、类型注解(PEP 484)
7、底层实现(CPython 简述)
调用时栈帧压入实参 → 执行字节码 → 遇到
RETURN_VALUE
指令:- 计算表达式结果 → 栈顶
- 弹出当前帧 → 返回值压入调用者栈顶
因此 返回对象引用,不额外拷贝大对象。