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 还需要 bc 两个参数,因此抛出 TypeError

总结:

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

相关推荐
我的xiaodoujiao4 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 38--Allure 测试报告
python·学习·测试工具·pytest
Boilermaker199210 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
沈浩(种子思维作者)10 小时前
真的能精准医疗吗?癌症能提前发现吗?
人工智能·python·网络安全·健康医疗·量子计算
MM_MS11 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
꧁Q༒ོγ꧂11 小时前
LaTeX 语法入门指南
开发语言·latex
njsgcs11 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
alonewolf_9911 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
io_T_T11 小时前
迭代器 iteration、iter 与 多线程 concurrent 交叉实践(详细)
python
古城小栈11 小时前
Rust 迭代器产出的引用层数——分水岭
开发语言·rust
华研前沿标杆游学12 小时前
2026年走进洛阳格力工厂参观游学
python