news 2026/6/30 1:32:52

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
位置参数、关键字参数和默认参数的规则

先定义一个简单的函数:

def introduce(name, age, city='广州'): print(f'{name},{age}岁,来自{city}')

1. 位置参数(Positional Arguments)

规则:按位置顺序一一对应传入,缺一不可,多一不可。

  • 调用时,传入的顺序必须和函数定义的顺序一致。

  • 这是最基础的传参方式。

introduce('小明', 25, '深圳') # 正确:小明->name, 25->age, 深圳->city introduce(25, '小明') # 错误:类型错乱,因为25被赋给了name

2. 默认参数(Default Arguments)

规则:定义时赋值,必须放在所有位置参数之后。

  • 如果调用时不传参数,就使用默认值。

  • 关键规则:默认参数必须排在位置参数的右边(否则语法错误)。

# 正确 def func(a, b=10): pass # 错误(SyntaxError) def func(a=1, b): pass # 默认参数不能出现在位置参数之前

调用示例:

introduce('小红', 22) # 输出:小红,22岁,来自广州(用了默认city) introduce('小红', 22, '上海') # 输出:小红,22岁,来自上海(覆盖默认值)

3. 关键字参数(Keyword Arguments)

规则:调用时用“参数名=值”的方式指定,顺序可以打乱。

  • 让你能明确指定给哪个参数赋值,提高可读性。

  • 必须放在所有位置参数之后(即先位置,后关键字)。

introduce(age=25, name='小刚') # 正确,顺序可颠倒 introduce('小刚', city='北京', age=25) # 正确:先位置'小刚'给name,后面关键字随意 introduce(name='小刚', 25) # 错误:关键字参数不能在位置参数之前

三者混合使用的规则

定义函数时:位置参数 → 默认参数
调用函数时:位置参数 → 关键字参数
并且:同一个参数不能既传位置又传关键字(重复赋值会报错)

综合示例:

def example(a, b, c=10, d=20): print(a, b, c, d) # 正确混合 example(1, 2) # 1 2 10 20 example(1, 2, d=30) # 1 2 10 30 (c用默认,d用关键字) example(1, b=3, c=4) # 1 3 4 20 (a用位置,b/c用关键字) # 错误混合 example(a=1, 2) # 错误:关键字参数不能在位置参数之前 example(1, a=2) # 错误: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, lst=None): if lst is None: lst = [] lst.append(item) return lst

4.*args—— 接收多余的位置参数

  • 作用:把调用时传入的多余位置参数,打包成一个元组(tuple)

  • 名称args只是约定俗成的名字,关键是前面的星号*。你也可以写*numbers

  • 规则:必须放在所有普通位置参数和默认参数之后

def func(a, b, *args): print(f'a={a}, b={b}, args={args}') func(1, 2, 3, 4, 5) # 输出:a=1, b=2, args=(3, 4, 5) ← 多余的3,4,5被收进元组

5.**kwargs—— 接收多余的关键字参数

  • 作用:把调用时传入的多余关键字参数,打包成一个字典(dict)

  • 名称kwargs也是约定俗成,关键是前面的双星号**

  • 规则:必须放在所有参数的最后面(包括*args之后)。

def func(a, b, **kwargs): print(f'a={a}, b={b}, kwargs={kwargs}') func(1, 2, name='小明', city='广州') # 输出:a=1, b=2, kwargs={'name': '小明', 'city': '广州'}

完整排序规则

定义函数时,参数的顺序必须是:

位置参数 →*args→ 默认参数 →**kwargs

示例:

def full_example(a, b, *args, c=10, d=20, **kwargs): print(a, b, args, c, d, kwargs) # 调用 full_example(1, 2, 3, 4, c=30, e=100, f=200) # 输出:1 2 (3, 4) 30 20 {'e': 100, 'f': 200} # 解释: # 1,2 → a,b(位置) # 3,4 → args(多余位置参数) # c=30 → 覆盖默认参数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='小红', age=22)

一个重要的坑(和默认参数一起用)

注意:如果*args和默认参数同时出现,默认参数只能通过关键字方式传入,否则会被*args吞掉。

def test(a, *args, b=10): print(a, args, b) test(1, 2, 3) # 输出:1 (2, 3) 10 ← b只能取默认值 test(1, 2, b=20) # 输出:1 (2,) 20 ← 正确给b赋值 test(1, 2, 3, 20) # 20被当成位置参数吞进args,b还是10
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 1:25:03

【单片机毕业设计】基于 STM32 的超重声光报警电子秤设计与实现,基于 STM32 的阈值式重量监测报警系统设计(013701)

文章目录20 个相关毕业设计备选题目项目研究背景摘要总体方案核心功能一、基础数据处理功能二、数据可视化功能三、参数设置功能四、模式切换功能五、超限报警核心功能技术路线项目演示关于我们项目案例源码获取博主介绍:✌️码农一枚 ,专注于大学生项目…

作者头像 李华
网站建设 2026/6/30 1:22:24

[特殊字符] RPA + AI,成年人不做选择 [特殊字符]

先说个真事。去年11月的一个周三,凌晨两点,手机炸了。客户——深圳一家跨境电商,日订单 3000。我给他们搭了一套RPA:Shopify自动抓订单 → 录ERP → 生成发货单。上线第一周稳如老狗,客户群里连发三天红包。&#x1f9…

作者头像 李华
网站建设 2026/6/30 1:21:26

阿里系cookie加密(acw_sc__v2)

作者声明:本文仅供参考学习,请勿用于其他用途,违者后果自负!!!! 案例:壹心理 一.目标分析 进入页面打开控制面板会发现有个无限debugger。 解决无限debugger有两种方式&#xff1…

作者头像 李华
网站建设 2026/6/30 1:18:51

PilotGo-plugin-llmops API全解析:轻松集成与二次开发

PilotGo-plugin-llmops API全解析:轻松集成与二次开发 【免费下载链接】PilotGo-plugin-llmops LLM-assisted cluster fault analysis, inspection, and operation and maintenance management. 项目地址: https://gitcode.com/openeuler/PilotGo-plugin-llmops …

作者头像 李华
网站建设 2026/6/30 1:17:49

LLM系列:4.transformer算法:3.Jieba

Jieba 一.认识Jieba Jieba 是目前表现较为不错的、立志于做最好的 Python 中文分词组件。 它不仅支持多种分词模式,还支持自定义词典和繁体分词,且采用 MIT 授权协议。 安装与导入 Jieba:可以直接通过 pip 进行安装,支持 Python 2…

作者头像 李华