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 类)。

相关推荐
ttwuai1 分钟前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
用户8356290780515 分钟前
Python 实现 Excel 页面布局与打印设置自动化
后端·python
এ慕ོ冬℘゜11 分钟前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa17 分钟前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
_Jimmy_33 分钟前
AI应用开发工程师面试题库
人工智能·python·深度学习·机器学习·知识图谱
用户83562907805133 分钟前
Python 实现 Excel 命名范围(Named Range)的创建与管理
后端·python
dreamer_83991 小时前
AI智能合同比对系统:从零搭建实战教程
人工智能·python
噢,我明白了2 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
AOwhisky2 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
mabing9932 小时前
Qt 生成条纹图
开发语言·qt