局部变量与全局变量

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("珍珠奶茶", 甜度="少糖", 冰度="去冰", 加料=["布丁", "珍珠"], 大小="大杯")

 

 

请登录后发表评论

    没有回复内容