1. 局部变量
- 定义:在函数内部定义的变量。
- 作用域:仅在定义它的函数内部有效,函数执行结束后变量即被销毁。
2. 全局变量
- 定义:在函数外部声明的变量。
- 作用域:在整个程序(文件)中都可以被访问。
global 关键字的作用
- 核心功能:在函数内部使用,用于声明接下来要使用的是全局变量(而非创建一个新的局部变量)。
- 基本语法:
global 变量名
️ 使用注意事项与最佳实践
1. 尽量避免在函数中修改全局变量
- 原因:过度依赖全局变量会使代码的耦合度变高,导致程序难以维护和调试。
- 最佳实践:优先考虑使用函数参数传入数据,并通过
return返回值传出结果,保持函数的独立性。
2. global 的适用场景global 关键字通常仅用在以下特定场景中:
- 程序的全局状态管理
- 全局配置项
- 全局计数器
函数的两种传参方式
1. 位置参数
- 定义:调用函数时,传入的实参顺序与定义函数时形参的顺序完全一致。
2. 关键字参数
- 定义:调用函数时,通过
"形参名=值"的形式传递参数。 - 特点:参数的传递没有顺序要求,代码可读性更强。
️ 混合传参规则
当位置参数与关键字参数同时存在时,必须严格遵守:位置参数在前,关键字参数在后。
适用场景与最佳实践
传参方式的选择应以**代码结构清晰明了(可读性)和便于维护(维护性)**为核心目标:
- 参数较少时(不超过 3 个):可直接使用位置参数,代码更简洁。
- 参数较多时:建议使用关键字参数,明确每个参数的含义,避免传错顺序。
默认参数(缺省参数)
1. 核心定义
- 别名:也称为“缺省参数”。
- 作用:在定义函数时,预先为某个参数指定一个默认值。
- 效果:在调用函数时,如果用户没有传递该参数的值,系统将自动使用这个预设的默认值;如果传递了,则覆盖默认值。
2. 代码示例解析
以图片中的 reg_stu 函数为例:
def reg_stu(name, age, gender, city="北京"):
# ... 函数体 ...
- 场景 A(不传值):调用
reg_stu("张三", 18, "男")时,由于没传第4个参数,city自动取值为 “北京”。 - 场景 B(传值):调用
reg_stu("赵四", 22, "男", "深圳")时,city被赋值为 “深圳”,覆盖了默认的“北京”。
3. ⚠️ 关键注意事项(易错点)
- 位置限制:默认参数必须放在没有默认值的参数列表后面。
- ✅ 正确:
def func(a, b, c=10): - ❌ 错误:
def func(a, b=10, c):(会报错)
- ✅ 正确:
- 数量灵活:一个函数可以设置多个默认参数,只要它们都排在最后即可。
4. 优先级原则
- 传参优先:函数调用时,如果你显式传递了值,就听你的(修改默认值)。
- 兜底机制:如果没有传递该参数,就直接使用定义时的默认值。
不定长参数小结
1. 什么是不定长参数?
当函数的参数个数不确定时,可以使用不定长参数来解决这类问题。它允许函数接收任意数量的参数,而无需在定义时固定参数个数。
2. 不定长参数的分类
*args:不定长位置参数。函数调用时,通过位置参数传递的多个值会被自动封装成一个元组(tuple)。**kwargs:不定长关键字参数。函数调用时,通过“键=值”形式传递的多个参数会被自动封装成一个字典(dict)。
3. *args 与 **kwargs 的应用场景
*args适用场景:处理数量不确定的数据。例如:计算任意个数的和、拼接任意数量的字符串等。**kwargs适用场景:处理数量不确定的选项或配置参数,用于定制函数的行为。例如:设置样式、开关功能、传递额外配置等。
🧋 生活化类比:点奶茶
- 核心数据(
*args):你要点什么?比如“珍珠奶茶”——这是必须传的核心内容,数量可变。 - 选项配置(
**kwargs):你要什么样的?比如“甜度=少糖,冰度=去冰,加料=[布丁, 珍珠],大小=大杯”——这些是可选的配置项,用键值对表达更清晰。
✅ 代码示例:
def order_milktea(*args, **kwargs): print("你点了:", args) # ('珍珠奶茶',) print("你的要求:", kwargs) # {'甜度': '少糖', '冰度': '去冰', ...} order_milktea("珍珠奶茶", 甜度="少糖", 冰度="去冰", 加料=["布丁", "珍珠"], 大小="大杯")



没有回复内容