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 函数基础!如果你有任何疑问,欢迎在评论区交流。

相关推荐
张小姐的猫14 分钟前
【C++开发脚手架】 —— Jsoncpp上手
java·linux·开发语言·网络·c++·tcp/ip·udp
小灰灰搞电子15 分钟前
Rust+Slint 实现蜂巢菜单源码分享
开发语言·rust·蜂巢菜单.
我命由我1234516 分钟前
JS Mock(Mock 拦截请求的前提、Mock 使用、关闭 Mock)
开发语言·前端·javascript·前端框架·html·html5·js
Metaphor69217 分钟前
如何在 Python 环境中裁剪 PDF 页面
python·pdf
开开心心就好22 分钟前
手机精确倒计时工具悬浮窗口秒数实时显示
android·前端·javascript·jupyter·智能手机·pdf·html
半亩码田23 分钟前
C#转Python第4.4篇:JSON 处理:json 模块 vs System.Text.Json
python·c#·json
OPEN-F23 分钟前
C++并发编程:异步任务与线程池实战
开发语言·c++·算法
南大白25 分钟前
IDEA Maven+JDK 全局配置 日志记录
java·maven·intellij-idea