python-第20天:关键字参数与不定长参数

Python 函数进阶指南:彻底掌握关键字参数与不定长参数

在学习 Python 的过程中,定义和调用函数是每个开发者的必经之路。你可能已经学会了如何定义一个简单的函数,例如 def add(a, b): return a + b。但在实际的项目开发中,为了让代码更具灵活性和可读性,我们需要掌握更高级的参数传递方式。

本篇文章将带你深入浅出地理解 关键字参数不定长参数,助你编写出更专业、更优雅的 Python 代码。


1. 前置准备

在开始本文之前,建议你已经掌握了以下基础知识:

  • Python 的基本语法(变量、缩进)。
  • 如何定义一个最简单的函数(使用 def 关键字)。
  • 了解位置参数(Positional Arguments)的概念:即参数的位置决定了它们的值。

2. 关键字参数 (Keyword Arguments)

2.1 什么是关键字参数?

在调用函数时,我们通常按照定义的顺序传入参数。而关键字参数允许我们通过"键-值"对的形式指定参数。

2.2 语法示例

python 复制代码
def greet(name, message):
    print(f"你好 {name}, {message}")

# 传统的位置参数调用
greet("小明", "早安")

# 使用关键字参数调用
greet(message="早安", name="小明")

2.3 为什么使用它?

  1. 不限顺序:你不再需要死记硬背参数的顺序。
  2. 代码可读性:在调用时直接看到参数名,代码意图一目了然。
  3. 结合默认参数:关键字参数常与默认参数(Default Arguments)配合使用,只修改你需要变动的那个参数。

3. 不定长参数 (Variable-length Arguments)

有时,你在定义函数时并不确定用户会传入多少个参数。这时,Python 提供了两种强大的工具:*args**kwargs

3.1 *args:接收任意数量的位置参数

*args 用于接收一个元组(Tuple)。当你希望函数能处理不确定个数的数值时,它非常有用。

  • 语法 :在参数名前加一个星号 *
  • 代码示例
python 复制代码
def sum_numbers(*args):
    print(f"接收到的参数类型: {type(args)}")
    return sum(args)

print(sum_numbers(1, 2, 3))       # 输出 6
print(sum_numbers(10, 20, 30, 40)) # 输出 100

3.2 **kwargs:接收任意数量的关键字参数

**kwargs 用于接收一个字典(Dictionary)。它允许你传入任意多个带有名称的参数。

  • 语法 :在参数名前加两个星号 **
  • 代码示例
python 复制代码
def build_profile(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

build_profile(name="张三", age=25, city="北京", job="工程师")

4. 混合使用的黄金法则

在一个函数中,你可以同时使用位置参数、默认参数、*args**kwargs。但必须遵守严格的定义顺序,否则 Python 会报错:

  1. 位置参数 (Standard arguments)
  2. *args
  3. 关键字参数/默认参数 (Default arguments)
  4. **kwargs

综合示例:

python 复制代码
def complex_function(a, b, *args, coach="Unknown", **kwargs):
    print(f"a: {a}, b: {b}")
    print(f"args: {args}")
    print(f"coach: {coach}")
    print(f"kwargs: {kwargs}")

complex_function(1, 2, 3, 4, 5, coach="Python大师", task="学习", level="高级")

5. 易错点与避坑指南

5.1 关键字参数必须在位置参数之后

在调用函数时,如果你混合使用位置参数和关键字参数,位置参数必须放在前面

  • ❌ 错误:greet(name="小明", "早安")
  • ✅ 正确:greet("小明", message="早安")

5.2 默认参数的陷阱

永远不要使用可变类型(如列表 [] 或字典 {})作为默认参数。

  • 现象:由于默认参数在函数定义时只求值一次,多次调用会共享同一个对象。
  • 对策 :使用 None 作为默认值,在函数内部进行初始化。
python 复制代码
# 推荐做法
def add_item(item, item_list=None):
    if item_list is None:
        item_list = []
    item_list.append(item)
    return item_list

6. 总结

通过本文的学习,我们掌握了:

  • 关键字参数:提高代码可读性,打破顺序限制。
  • *args:用元组接收不限数量的位置参数。
  • **kwargs:用字典接收不限数量的关键字参数。
  • 参数顺序 :位置参数 > *args > 默认参数 > **kwargs

掌握这些技巧后,你将能够理解 Python 中许多第三方库(如 Django, Pandas)中复杂的函数调用方式。


进阶练习 :尝试编写一个函数 make_pizza(size, *toppings, **details),模拟订购披萨的过程,并打印出披萨的尺寸、配料以及其他特殊要求(如加辣、外送地址等)。

希望这篇指南能帮你打下坚实的 Python 函数基础!如果你有任何疑问,欢迎在评论区交流。

相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!1 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
默_笙1 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
俊昭喜喜里1 天前
java中的继承和多态的区别
java
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
qq_426003961 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
譕痕1 天前
JSONObject与JSONArray封装数据格式区别
java·json