当前位置:首页>python>Python进阶第1讲——动态参数传递

Python进阶第1讲——动态参数传递

  • 2026-10-11 07:31:34
Python进阶第1讲——动态参数传递

💡 卷首语

恭喜你,顺利通关了《零基础速成 25 讲》!如果说基础阶段教的是“认字”,那么从今天开启的《Python 实战进阶 20 讲》,教的就是如何“写出专业的文章”。

在这套全新的专栏里,我们不搞虚头巴脑的理论。我们的唯一目标是:带你褪去“学生气”,把代码写得像大厂高级工程师一样优雅、高效、且绝不轻易报错。

今天是第 01 讲,我们先拿所有人都绕不开的“函数参数”开刀。


🚨 痛点引入:永远在变的需求,永远在改的参数

在刚学 Python 时,我们写函数通常是“一个萝卜一个坑”。比如,写一个计算两个数字相加的工具:

def add(a, b):    return a + bprint(add(1, 2))  # 输出: 3

这看起来毫无破绽。直到有一天,老板/客户提出了新需求:“现在的业务升级了,需要能计算 3 个数字的和!”

你咬咬牙,又写了一个:

def add_three(a, b, c):    return a + b + c

问题来了: 如果明天要计算 10 个数、100 个数呢?难道我们要一直往括号里塞变量名,写出 add_100(a, b, c... ) 这种冗长得像面条一样的代码吗?

不仅低效,而且极度死板。在真实的工程开发中,数据的数量往往是不可预知的。我们需要一种机制:无论外界塞进来多少个数据,我们的函数都能张开大口,统统吃下。


📦 破局利器:*args 的无底洞魔法

在 Python 中,想要接收任意数量的位置参数,只需在参数名前面加一个神奇的星号 *。

业界习惯将其命名为 *args(Arguments 的缩写)。它就像一个“无底洞打包袋”,专门负责把多出来的参数收拢在一起。

我们来看看它如何一劳永逸地解决连加问题:

def dynamic_add(*args):    # 打印出来看看 args 到底是个啥?    print(f"[Debug] args 的类型是: {type(args)}")    total = 0    # 既然打包好了,直接用 for 循环遍历即可    for num in args:        total += num    return total# 无论传多少个参数,一个函数全部搞定!print("两数相加:", dynamic_add(1, 2))             # 输出: 3print("五数相加:", dynamic_add(1, 2, 3, 4, 5))    # 输出: 15

🧠 【底层揭秘】: 为什么加个星号就能用 for 循环了?因为 Python 解释器在底层,自动把你传入的 (1, 2, 3, 4, 5) 打包成了一个“元组 (Tuple)”。args 的本质,就是一个装着所有输入数据的元组。


🏷️ 进阶武装:用 **kwargs 给数据贴标签

*args 虽然好用,但它有个致命缺陷:它只能按顺序接收一堆没名没姓的数据。

假设你在开发一个用户注册系统,不同用户填写的资料是不一样的:

  • 用户 A 只填了姓名和年龄。

  • 用户 B 填了姓名、职业、城市、甚至游戏段位。

面对这种带有“属性标签”的不确定数据,我们需要出动两颗星号:**kwargs(Keyword Arguments)。

def build_profile(name, **kwargs):    # 先定义一个必须有的基础档案    profile = {"user_name": name}    # 将外界传入的其他标签,更新到我们的字典里    profile.update(kwargs)     return profile# 极其灵活,想传什么属性就传什么属性user1 = build_profile("Alice", age=25, city="Beijing")user2 = build_profile("Bob", job="Engineer", level=99, hobby="Coding")print(user1)# 输出: {'user_name': 'Alice', 'age': 25, 'city': 'Beijing'}print(user2)# 输出: {'user_name': 'Bob', 'job': 'Engineer', 'level': 99, 'hobby': 'Coding'}

🧠 【底层揭秘】: 双星号 **kwargs 会在底层将带有等号的关键字参数(如 age=25),自动转化为一个“字典 (Dictionary)”。掌握这一点极其重要,因为在未来调用 DeepSeek、ChatGPT 等 AI 大模型的 API 时,几乎所有的高级参数配置都是基于这种字典逻辑构建的。


👑 终极形态:大厂标配的“万能函数”

如果我们把 普通参数、*args 和 **kwargs 组合在一起,就能召唤出可以接收世界上任何形式输入的**“万能函数”**。

在 Django、PyTorch、Requests 这些世界顶级的开源框架源码中,这种写法随处可见。

⚠️ 注意!这里有一条不可逾越的传参铁律,顺序绝不能乱:👉 固定位置参数 -> *args -> **kwargs

def omni_function(a, b, *args, **kwargs):    print("--- 拆解开始 ---")    print(f"1. 固定参数 a: {a}, b: {b}")    print(f"2. 多余的位置参数 (元组): {args}")    print(f"3. 多余的关键字参数 (字典): {kwargs}")# 随便怎么传,它都能精准接住并分类omni_function(1, 2, 3, 4, 5, task="clean", speed="fast")# --- 运行结果 ---# 1. 固定参数 a: 1, b: 2# 2. 多余的位置参数 (元组): (3, 4, 5)# 3. 多余的关键字参数 (字典): {'task': 'clean', 'speed': 'fast'}

(解析:1 和 2 喂给了固定参数;3, 4, 5 没地方去,被打包进了 args;带有等号的 task 和 speed,被打包进了字典 kwargs。)


📝 本讲总结

写代码就像搭积木,越高级的积木,通用性越强。今天只需记住这句顺口溜,你就算彻底掌握了 Python 函数参数的终极奥义:

🌟 单星号打成包(变元组),双星号贴标签(变字典)!


🎁 获取本讲全套规范源码

纸上得来终觉浅,绝知此事要躬行。本文展示的所有底层逻辑和调试技巧,我已经为你严格按照大厂 PEP8 规范打包成了一个 .py 源码文件,拿走就能跑!

最新文章

随机文章