20 分钟
Python 进阶

*args 和 **kwargs

掌握可变参数和关键字参数

  • 理解 *args 收集位置参数
  • 理解 **kwargs 收集关键字参数
  • 掌握参数解包

*args 可变位置参数

就这么简单。不确定要传多少个参数时,用 *args 收集成元组。

示例代码(可运行)

**kwargs 可变关键字参数

示例代码(可运行)

参数解包

示例代码(可运行)
ℹ️参数顺序

参数顺序必须是:普通参数 → *args → 默认参数 → **kwargs。

预测输出
def f(*args):
    return len(args)
print(f(1,2,3,4))
找 Bugf需要2个位置参数a和b,但只传了1个。
def f(a, b, **kwargs): pass f(1, x=2, y=3)
填空题填写空白处的代码
def f(args): print(sum(args)) f(1,2,3) # 6
选择题

**kwargs 收集的参数类型是?

选择题

def f(x, items=[]) 这种可变默认参数为什么是经典陷阱?

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

list 底层是一段连续的指针数组,容量不够时整体扩容(CPython 约按 1.125 倍)。因此按下标取元素是 O(1),末尾 append 均摊 O(1),但在头部 insert(0,…) 或 pop(0) 要搬动全部元素、是 O(n)。dict/set 基于哈希表,平均查找 O(1) 但更耗内存。选对数据结构,往往比抠语法更影响性能。

挑战任务

可变参数挑战

简单+50 XP

写一个函数计算任意个数字的平均值。

可变参数挑战
2 个测试用例

课后作业

万能打印

中等+20 XP

写函数接受任意参数并格式化打印。

万能打印
1 个测试用例