Python: Syntax

Python: Syntax

Python 函数参数 *** 核心总结

📌 核心作用:处理可变数量的参数,提升函数灵活性。

  1. *args → 收位置参数为元组,用于不确定数量的输入。
  2. **kwargs → 收关键字参数为字典,用于带名称的动态参数。
  3. 顺序规则:固定参数 → *args**kwargs
  4. 解包:* 展开序列,** 展开字典。

✨ 应用场景:

• 动态计算(如 sum(*values))。
• 配置传递(如 build_model(**config))。
• 装饰器、继承等高级用法。

Python Magic Methods (魔法方法)

重写(override)这些带有一对双下划线(如 __iter____getitem____setitem____len__ 等)的方法有以下几个主要作用:


1. 让自定义类支持 Python 内置语法和操作

这些方法被称为“魔法方法”或“特殊方法”,它们让你的类像内置类型(如 list、dict)一样使用。例如:

  • __iter__ 让对象可以被 for ... in ... 遍历。
  • __getitem__ 让对象支持 obj[key] 取值。
  • __setitem__ 让对象支持 obj[key] = value 赋值。
  • __len__ 让对象支持 len(obj)
  • __add____mul__ 等让对象支持加法、乘法等运算。

2. 提升易用性和兼容性

比如 nn.Sequential 重写了 __iter__,你就可以直接 for module in seq: 遍历所有子模块;重写了 __getitem__,你可以用 seq[0] 取第一个子模块。这让 PyTorch 的容器类用起来和 Python 的 list、dict 非常像,极大提升了易用性。

3. 实现自定义行为

你可以根据自己的需求,定制这些操作的具体行为。例如,nn.Sequential__getitem__ 支持切片,返回一个新的 Sequential,这在普通的 list 上也常见。

4. 与 Python 生态无缝集成

重写这些方法后,你的类可以和 Python 的很多标准库、工具、语法无缝协作,比如解包、遍历、序列化等。


总结:
重写双下划线方法,就是让你的类像内置类型一样自然、强大、易用。这是 Python 面向对象编程的核心特性之一。

Global Variables (全局变量)

  • 只读全局变量时不用 global
  • 需要在函数内部赋值全局变量时用 global
  • 需要在嵌套函数里赋值外层变量时用 nonlocal
​​操作类型​​ ​​是否需要声明​​ ​​关键字​​
读取全局变量 -
对全局变量重新赋值 global
修改可变对象的内部元素 -
嵌套函数中修改外层变量 nonlocal

1. global

  • 用于函数内部,声明某个变量是全局变量(即模块级变量)。
  • 你可以在函数内部对这个全局变量重新赋值,而不是创建一个新的局部变量。

示例:

x = 1

def foo():
global x
x = 2 # 修改的是全局的x

foo()
print(x) # 输出2

2. nonlocal

  • 用于嵌套函数,声明变量来自最近的外层非全局作用域
  • 你可以在内层函数中修改外层函数的变量

示例:

def outer():
y = 1
def inner():
nonlocal y
y = 2 # 修改的是outer作用域的y
inner()
print(y) # 输出2

outer()