说啥好啊 發表於 2026-4-4 08:44:00

🎯 Python函数参数解包:*args与**kwargs深度解析

<h2>📌 引言</h2>
<p>在Python编程中,函数参数的处理是一个核心话题。<code>*args</code>和<code>**kwargs</code>是Python中两个强大且灵活的特性,它们让函数能够接受可变数量的位置参数和关键字参数。掌握这两个工具,不仅能让你写出更通用的代码,还能更好地理解和使用Python标准库及第三方库中的函数。</p>
<h2>一、*args:可变位置参数</h2>
<h3>1.1 基本用法</h3>
<p><code>*args</code>允许函数接受任意数量的位置参数。在函数内部,<code>args</code>是一个元组(tuple),包含所有传入的位置参数。</p>
<pre class="brush:python">def sum_all(*args):
    result = 0
    for num in args:
      result += num
    return result

print(sum_all(1, 2, 3))# 输出: 6
print(sum_all(10, 20))   # 输出: 30</pre>
<h3>1.2 *args的本质</h3>
<p>实际上,<code>*args</code>中的<code>args</code>只是一个约定俗成的名字。重要的是前面的<code>*</code>符号。</p>
<pre class="brush:python">def show_params(*numbers):
    print(f"类型: {type(numbers)}")
    print(f"内容: {numbers}")

show_params(1, 2, 3)
# 类型: &lt;class 'tuple'&gt;
# 内容: (1, 2, 3)</pre>
<h2>二、**kwargs:可变关键字参数</h2>
<h3>2.1 基本用法</h3>
<p><code>**kwargs</code>允许函数接受任意数量的关键字参数。在函数内部,<code>kwargs</code>是一个字典(dict)。</p>
<pre class="brush:python">def print_info(**kwargs):
    for key, value in kwargs.items():
      print(f"{key}: {value}")

print_info(name="张三", age=25, city="北京")
# name: 张三
# age: 25
# city: 北京</pre>
<h2>三、*args和**kwargs的组合使用</h2>
<pre class="brush:python">def flexible_function(required_arg, *args, **kwargs):
    print(f"必需参数: {required_arg}")
    print(f"位置参数: {args}")
    print(f"关键字参数: {kwargs}")

flexible_function("hello", 1, 2, 3, name="test", value=100)</pre>
<h2>四、参数解包(Unpacking)</h2>
<pre class="brush:python">def add(a, b, c):
    return a + b + c

numbers =
print(add(*numbers))# 等价于 add(1, 2, 3)

data = {"a": 1, "b": 2, "c": 3}
print(add(**data))    # 等价于 add(a=1, b=2, c=3)</pre>
<h2>五、实际应用场景</h2>
<h3>5.1 装饰器</h3>
<pre class="brush:python">import time

def timer(func):
    def wrapper(*args, **kwargs):
      start = time.time()
      result = func(*args, **kwargs)
      print(f"{func.__name__} 执行时间: {time.time() - start:.4f}秒")
      return result
    return wrapper</pre>
<h3>5.2 函数转发</h3>
<pre class="brush:python">def wrapper_function(*args, **kwargs):
    print("前置处理...")
    result = actual_function(*args, **kwargs)
    print("后置处理...")
    return result</pre>
<h2>六、注意事项与最佳实践</h2>
<ul>
<li><strong>参数顺序</strong>:必需参数 → 默认参数 → <code>*args</code> → 关键字-only参数 → <code>**kwargs</code></li>
<li><strong>命名约定</strong>:建议使用<code>args</code>和<code>kwargs</code>保持代码可读性</li>
<li><strong>文档说明</strong>:使用可变参数时,应在文档字符串中说明函数的行为</li>
</ul>
<h2>📝 总结</h2>
<p><code>*args</code>和<code>**kwargs</code>是Python中处理可变参数的利器:</p>
<ul>
<li><code>*args</code>收集多余的位置参数为元组</li>
<li><code>**kwargs</code>收集多余的关键字参数为字典</li>
<li>两者结合可以创建极其灵活的函数接口</li>
<li>在装饰器、函数转发、配置处理等场景中有广泛应用</li>
</ul>
<h2>📚 参考资料</h2>
<ul>
<li>Python官方文档: Arbitrary Argument Lists</li>
<li>《Python Cookbook》第7章: 函数</li>
<li>PEP 3102: Keyword-Only Arguments</li>
</ul><br><br>
来源:https://www.cnblogs.com/cartech/p/19820169
頁: [1]
查看完整版本: 🎯 Python函数参数解包:*args与**kwargs深度解析