在 Python 里,*args**kwargs 都是用于接收不定数量参数 的语法,但它们接收的参数类型不同。

一、*args 的含义
*args 用来接收 任意数量的位置参数,在函数内部会变成一个 tuple(元组)

示例1:接收多个参数

def add(*args):
    print(args)

add(1, 2, 3, 4)

输出:

(1, 2, 3, 4)

示例2:求和

def add(*args):
    total = 0
    for num in args:
        total += num
    return total

print(add(1, 2, 3))
print(add(10, 20, 30, 40))

示例3:遍历参数

def show_args(*args):
    for arg in args:
        print(arg)

show_args("apple", "banana", "orange")

二、**kwargs 的含义
**kwargs 用来接收任意数量的关键字参数(key=value),在函数内部会变成一个dict(字典)

示例1:接收多个 key-value

def show_info(**kwargs):
    print(kwargs)

show_info(name="Tom", age=18, city="Beijing")

输出:

{'name': 'Tom', 'age': 18, 'city': 'Beijing'}

示例2:遍历字典

def show_info(**kwargs):
    for key, value in kwargs.items():
        print(key, value)

show_info(name="Alice", age=20)

示例3:构造对象信息

def create_user(**kwargs):
    return kwargs

user = create_user(name="Jack", age=25)
print(user)

三、*args**kwargs 的区别

*args

  • 接收 位置参数
  • 数据类型是 tuple

示例调用:

func(1, 2, 3)

**kwargs

  • 接收 关键字参数
  • 数据类型是 dict

示例调用:

func(name="Tom", age=18)

四、函数中同时使用 *args**kwargs

语法顺序必须是:

普通参数 -> *args -> **kwargs

示例1:

def demo(a, *args, **kwargs):
    print("a:", a)
    print("args:", args)
    print("kwargs:", kwargs)

demo(1, 2, 3, 4, name="Tom", age=18)

输出:

a: 1
args: (2, 3, 4)
kwargs: {'name': 'Tom', 'age': 18}

示例2:更真实一点的函数

def create_order(user, *items, **options):
    print("用户:", user)
    print("商品:", items)
    print("其他信息:", options)

create_order(
    "张三",
    "手机",
    "耳机",
    price=3000,
    address="上海"
)

输出:

用户: 张三
商品: ('手机', '耳机')
其他信息: {'price': 3000, 'address': '上海'}

五、补充:参数解包(常见用法)

*** 还可以用于调用函数时解包

示例:

def add(a, b, c):
    print(a + b + c)

nums = [1, 2, 3]

add(*nums)

等价于:

add(1, 2, 3)

字典解包:

def show(name, age):
    print(name, age)

data = {"name": "Tom", "age": 18}

show(**data)

一句话总结:

  • *args:收集 多余的位置参数 → tuple
  • **kwargs:收集多余的关键字参数 → dict

特殊说明:

下面一段代码会报错,原因是:*args 只能接收 位置参数,而传入的是 关键字参数

def show_info(*args):
    print(args)

show_info(name="Tom", age=18, city="Beijing")

运行结果会报错:

TypeError: show_info() got an unexpected keyword argument 'name'

因为:

  • name="Tom"
  • age=18
  • city="Beijing"

这些都是 kwargs(关键字参数),而函数只定义了 *args,没有 **kwargs


如果你想接收这些参数,需要这样写:

def show_info(**kwargs):
    print(kwargs)

show_info(name="Tom", age=18, city="Beijing")

输出:

{'name': 'Tom', 'age': 18, 'city': 'Beijing'}

如果你同时支持两种参数:

def show_info(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)

show_info(1, 2, name="Tom", age=18)

输出:

args: (1, 2)
kwargs: {'name': 'Tom', 'age': 18}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐