python迭代器解包【python】

*self.args 是 Python 中的迭代器解包(unpacking)语法,作用是将一个可迭代对象(如元组、列表)中的元素"拆解"为独立的位置参数,传递给函数。

核心理解:

假设 self.args 是一个元组 (a, b, c),那么 self.func(*self.args) 等价于 self.func(a, b, c)------即把元组中的每个元素作为单独的参数传给 self.func,而不是把整个元组作为一个参数传递。

可运行的 demo 示例:

下面通过一个简单案例,对比"不解包"和"解包"的区别,直观展示 * 的作用:

python 复制代码
# 定义一个测试函数:接受3个位置参数,返回它们的和
def add(a, b, c):
    print(f"函数接收到的参数:a={a}, b={b}, c={c}")
    return a + b + c


class Demo:
    def __init__(self, func, args):
        self.func = func  # 存储目标函数(如add)
        self.args = args  # 存储参数(可迭代对象,如元组)

    def run_with_unpack(self):
        # 使用 * 解包参数:将self.args中的元素拆分为独立参数
        result = self.func(*self.args)
        print(f"解包调用的结果:{result}\n")

    def run_without_unpack(self):
        # 不使用 * 解包:将self.args作为一个整体参数传递
        try:
            result = self.func(self.args)
            print(f"不解包调用的结果:{result}")
        except TypeError as e:
            print(f"不解包调用失败:{e}")


if __name__ == "__main__":
    # 准备参数:一个包含3个元素的元组(与add函数的参数数量匹配)
    params = (10, 20, 30)

    # 创建Demo实例,传入函数add和参数params
    demo = Demo(add, params)

    # 1. 使用 * 解包调用(正确方式)
    print("=== 测试解包调用 ===")
    demo.run_with_unpack()

    # 2. 不使用 * 解包调用(错误方式)
    print("=== 测试不解包调用 ===")
    demo.run_without_unpack()

运行结果及解释:

复制代码
=== 测试解包调用 ===
函数接收到的参数:a=10, b=20, c=30
解包调用的结果:60

=== 测试不解包调用 ===
不解包调用失败:add() missing 2 required positional arguments: 'b' and 'c'
  • 解包调用(*self.args) :
    params 是元组 (10, 20, 30),*params 会将其拆分为 10, 20, 30 三个独立参数,正好匹配 add(a, b, c) 的参数要求,调用成功,返回和为 60。

  • 不解包调用 :

    直接传递 params 时,相当于给 add 函数传入了一个元组 (10, 20, 30) 作为第一个参数 a,但 add 还需要 b 和 c 两个参数,因此抛出 TypeError。

总结:

*self.args 的核心作用是将可迭代的参数集合"拆解"为独立的位置参数 ,确保函数能按预期接收每个参数。这在需要动态传递参数(比如参数数量不固定,通过元组/列表存储)的场景中非常有用,例如多线程中传递函数和其参数时(就像你之前的 MyThread 类)。

相关推荐
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时3 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
奇思妙想聪明勤奋的小羊3 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1233 天前
2026年第38周GitHub趋势周报
python·科技·github