位置参数、关键字参数和默认参数的规则

📅 2026/6/30 1:32:55
位置参数、关键字参数和默认参数的规则
先定义一个简单的函数def introduce(name, age, city广州): print(f{name}{age}岁来自{city})1. 位置参数Positional Arguments规则按位置顺序一一对应传入缺一不可多一不可。调用时传入的顺序必须和函数定义的顺序一致。这是最基础的传参方式。introduce(小明, 25, 深圳) # 正确小明-name, 25-age, 深圳-city introduce(25, 小明) # 错误类型错乱因为25被赋给了name2. 默认参数Default Arguments规则定义时赋值必须放在所有位置参数之后。如果调用时不传参数就使用默认值。关键规则默认参数必须排在位置参数的右边否则语法错误。# 正确 def func(a, b10): pass # 错误SyntaxError def func(a1, b): pass # 默认参数不能出现在位置参数之前调用示例introduce(小红, 22) # 输出小红22岁来自广州用了默认city introduce(小红, 22, 上海) # 输出小红22岁来自上海覆盖默认值3. 关键字参数Keyword Arguments规则调用时用“参数名值”的方式指定顺序可以打乱。让你能明确指定给哪个参数赋值提高可读性。必须放在所有位置参数之后即先位置后关键字。introduce(age25, name小刚) # 正确顺序可颠倒 introduce(小刚, city北京, age25) # 正确先位置小刚给name后面关键字随意 introduce(name小刚, 25) # 错误关键字参数不能在位置参数之前三者混合使用的规则定义函数时位置参数 → 默认参数调用函数时位置参数 → 关键字参数并且同一个参数不能既传位置又传关键字重复赋值会报错综合示例def example(a, b, c10, d20): print(a, b, c, d) # 正确混合 example(1, 2) # 1 2 10 20 example(1, 2, d30) # 1 2 10 30 c用默认d用关键字 example(1, b3, c4) # 1 3 4 20 a用位置b/c用关键字 # 错误混合 example(a1, 2) # 错误关键字参数不能在位置参数之前 example(1, a2) # 错误a被重复赋值位置给了1关键字又给2一个容易忽略的重要提醒坑点默认参数的值只在函数定义时计算一次。如果默认值是可变对象如列表、字典会有共享问题。def add_item(item, lst[]): lst.append(item) return lst print(add_item(1)) # [1] print(add_item(2)) # [1, 2] —— 不是你预期的 [2]解决办法默认值用None内部再创建新列表。def add_item(item, lstNone): if lst is None: lst [] lst.append(item) return lst4.*args—— 接收多余的位置参数作用把调用时传入的多余位置参数打包成一个元组tuple。名称args只是约定俗成的名字关键是前面的星号*。你也可以写*numbers。规则必须放在所有普通位置参数和默认参数之后。def func(a, b, *args): print(fa{a}, b{b}, args{args}) func(1, 2, 3, 4, 5) # 输出a1, b2, args(3, 4, 5) ← 多余的3,4,5被收进元组5.**kwargs—— 接收多余的关键字参数作用把调用时传入的多余关键字参数打包成一个字典dict。名称kwargs也是约定俗成关键是前面的双星号**。规则必须放在所有参数的最后面包括*args之后。def func(a, b, **kwargs): print(fa{a}, b{b}, kwargs{kwargs}) func(1, 2, name小明, city广州) # 输出a1, b2, kwargs{name: 小明, city: 广州}完整排序规则定义函数时参数的顺序必须是位置参数 →*args→ 默认参数 →**kwargs示例def full_example(a, b, *args, c10, d20, **kwargs): print(a, b, args, c, d, kwargs) # 调用 full_example(1, 2, 3, 4, c30, e100, f200) # 输出1 2 (3, 4) 30 20 {e: 100, f: 200} # 解释 # 1,2 → a,b位置 # 3,4 → args多余位置参数 # c30 → 覆盖默认参数c # d 没传 → 用默认值20 # e,f → kwargs多余关键字参数调用时的“解包”用法反向操作除了在定义时用星号还可以在调用时用把列表/字典拆开传参# 把列表拆成位置参数 nums [1, 2, 3] def add(a, b, c): return a b c print(add(*nums)) # 输出 6 相当于 add(1,2,3) # 把字典拆成关键字参数 info {name: 小红, age: 22} def introduce(name, age): print(f{name} {age}岁) introduce(**info) # 相当于 introduce(name小红, age22)一个重要的坑和默认参数一起用注意如果*args和默认参数同时出现默认参数只能通过关键字方式传入否则会被*args吞掉。def test(a, *args, b10): print(a, args, b) test(1, 2, 3) # 输出1 (2, 3) 10 ← b只能取默认值 test(1, 2, b20) # 输出1 (2,) 20 ← 正确给b赋值 test(1, 2, 3, 20) # 20被当成位置参数吞进argsb还是10