一、介绍
1.1 定义
函数是可重复调用的代码块,用来实现特定功能。
系统讲解 Python 函数核心语法,涵盖函数定义与语法规范、参数传递方式(位置、默认、关键字、*args、**kwargs)、返回值机制、变量作用域(LEGB 规则)、匿名函数(lambda 配合 sorted/map/filter)、嵌套函数及递归函数。重点解析可变对象作为默认参数的陷阱、作用域查找顺序、lambda 简化逻辑以及递归的基线与递归条件,适合初学者掌握 Python 基础编程能力。

函数是可重复调用的代码块,用来实现特定功能。
def 函数名 (参数 1, 参数 2, ...):
"""函数文档字符串(可选,说明函数功能)"""
# 函数体:实现功能的代码
执行语句
return 返回值 # 可选,没有则默认返回 None
lst = [] if lst is None else lst)lst.copy() 避免)global,修改嵌套变量加 nonlocal| 对比维度 | 位置参数 | 默认参数 | 关键字参数 | 可变位置参数 (*args) | 可变关键字参数 (**kwargs) | 解包传参 |
|---|---|---|---|---|---|---|
| 参数数量 | 固定 | 固定 | 固定 | 任意数量 | 任意数量 | 固定(解包后) |
| 参数顺序 | 严格要求 | 需在位置参数后定义 | 调用时可打乱 | 无 | 无 | 解包后需匹配函数定义顺序 |
| 接收数据类型 | 单个值 | 单个值 | 单个值 | 元组 | 字典 | 列表 / 元组 / 字典(解包为单个值) |
| 适用场景 | 参数数量固定、顺序明确 | 参数有常用默认值 | 参数多 / 怕记混顺序 | 不确定位置参数数量 | 不确定关键字参数数量 | 已有列表 / 字典,需快速传参 |
| 核心限制 | 少传 / 多传都会报错 | 1. 避免用列表 / 字典等可变对象做默认值;2. 必须在位置参数后定义 | 调用时需在位置参数之后 | 需在默认参数后、**kwargs 前定义 | 必须在参数列表最后定义 | 解包后数量 / 名称需匹配函数定义(否则报错) |
| 返回值形式 | 核心特点 | 关键注意事项 |
|---|---|---|
| 无返回值(默认) | 无 return,默认返回 None | 别误判有'隐形返回值',仅执行操作时用 |
| 单个返回值 | 返回单一值,类型不限 | 返回值类型需与调用处预期匹配 |
| 多个返回值 | 本质返回元组,可解包接收 | 解包时变量数量必须与返回值数量匹配(否则报错) |
| 返回容器(列表 / 字典) | 单个容器存储多个值,数量可灵活调整 | 空容器需考虑调用处的空值处理逻辑 |
变量作用域指的是变量在程序中可以被访问、修改的范围。
定义:在所有函数外部定义的变量,属于全局作用域。
特点:整个程序运行期间都存在,可被程序中所有函数'读取'(默认不能直接修改,用 global 关键字声明)。
定义:在函数内部定义的变量,属于局部作用域。 特点:仅在定义它的函数内部可用,函数执行结束后变量会被销毁,外部无法访问。
定义:嵌套函数中,外层函数的变量对于内层函数来说,属于非局部作用域。
特点:内层函数可读取,(默认不能修改,需用 nonlocal 声明)。
临时、简化的函数,无名称,仅实现一行简单逻辑
# 语法结构:lambda + 参数列表 + : + 单个表达式
lambda 参数 1, 参数 2, ...: 表达式
核心作用:指定排序的'依据',比如按元组 / 字典的某个值排序
极简语法:sorted(序列,key=lambda x: 排序依据)
示例:元组列表按第二个元素排序
data = [(1,5), (4,8), (6,9),(1,7)]
print(sorted(data, key=lambda x: x[1]))
核心作用:对序列中每个元素执行同一简单操作
极简语法:list(map(lambda x: 处理逻辑,序列))(转列表才能看到结果)
示例:提取字典列表的指定字段
students = [{"name":"张三","age":18}, {"name":"李四","age":16},{"name":"小胡","age":20}]
print(list(map(lambda x: x["age"], students)))
核心作用:按条件筛选序列中的元素(保留返回 True 的元素)
极简语法:list(filter(lambda x: 过滤条件,序列))(转列表才能看到结果)
示例:筛选奇数
num = [1,2,3,4,5,6,7,8,9,10]
print(list(filter(lambda x: x%2==1, num)))
嵌套函数指的是在一个函数(外部函数)内部定义另一个函数(内部函数)。
函数调用遵循栈结构,最后被调用的函数最先返回 LIFO (Last In First Out,后进先出)
递归函数就是在函数体内调用自身的函数。 必须满足 2 个条件:
| 对比维度 | 递归 | 循环 |
|---|---|---|
| 代码风格 | 简洁、逻辑直观 | 稍繁琐,需手动控制循环变量 |
| 性能 | 有函数调用开销,执行速度稍慢 | 无额外调用开销,执行速度更快 |
| 内存占用 | 占用栈内存,递归深度有限制 | 内存占用稳定,无深度限制 |
| 易错点 | 遗漏基线条件 → 触发无限递归报错 | 遗漏终止条件 → 导致死循环 |
| 适用场景 | 逻辑简单、追求代码简洁时 | 数据量大、追求速度 / 低内存占用时 |
示例:阶乘的计算(简易)
n = int(input("请输入 n 的值:"))
if n < 0:
print("错误:负数没有阶乘!")
else:
def Factorial(m):
if m == 0 or m == 1:
return 1
else:
return m * Factorial(m - 1)
print(f"{n}的阶乘为{Factorial(n)}")

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online