Python函数参数高级教程_默认参数与可变参数
发布时间 - 2026-01-06 00:00:00 点击率:次Python函数参数设计需理解“参数何时被创建”“值如何传递”“对象是否可变”三大逻辑:默认参数在定义时求值,可变对象作默认值易出错,应以None代替并在函数内初始化;args收集剩余位置参数为元组;kwargs收集剩余关键字参数为字典;参数顺序应为普通参数→args→默认参数→kwargs,兼顾灵活性与可读性。
Python函数的参数设计灵活而强大,默认参数和可变参数是日常开发中最常用也最容易出错的两个特性。掌握它们的关键,不在于死记语法,而在于理解“参数何时被创建”“值如何被传递”“对象是否可变”这三个底层逻辑。
默认参数:只在定义时计算一次
默认参数的值在函数定义时就被求值并绑定,而不是每次调用时重新生成。这对不可变对象(如数字、字符串、None)影响不大,但对可变对象(如列表、字典)可能引发意外行为。
常见陷阱示例:
def add_item(item, lst=[]): # 危险!默认列表在定义时创建
lst.append(item)
return lst
print(add_item(1)) # [1]
print(add_item(2)) # [1, 2] ← 意外!复用了上次的列表
正确写法是用 None 作占位符,在函数体内初始化:
- 始终用 None 作为可变默认参数的占位值
- 在函数开头显式判断并创建新对象:
if lst is None: lst = [] - 避免在默认值中调用会改变状态的函数(如
datetime.now())
*args:收集位置参数为元组
*args 把所有未匹配的位置参数打包成一个 tuple,它必须放在普通参数之后、**kwargs 之前。
典型用途:
- 封装或转发参数:比如写一个日志装饰器,需要原样传入被装饰函数
的所有参数 - 实现类似内置函数的接口:如
sum(*numbers)或自定义的max_by_key(key_func, *items) - 与解包配合使用:
func(*[1,2,3])等价于func(1,2,3)
注意:*args 不捕获关键字参数,也不会影响参数名匹配;它只是“剩下的位置参数”。如果调用时混用位置和关键字,已命名的参数仍需满足签名要求。
**kwargs:收集关键字参数为字典
**kwargs 将所有未被显式声明的关键字参数收集成一个 dict。它必须是参数列表中的最后一个。
实用技巧:
- 用于配置类或函数的“灵活选项”:
def create_plot(data, **plot_opts): plt.plot(data, **plot_opts) - 安全地传递子组件参数:父函数只处理自己关心的参数,其余通过 **kwargs 透传
- 检查非法关键字:
allowed = {'color', 'linewidth', 'alpha'}; invalid = set(kwargs) - allowed
提醒:不要在函数内部直接修改 kwargs 字典(如 kwargs.pop('debug')),除非你明确知道后续代码不再依赖它;更推荐用 kwargs.get('debug', False) 安全读取。
组合使用:顺序与可读性优先
合法的完整参数顺序是:普通参数 → *args → 默认参数 → **kwargs(Python 3.8+ 支持仅限位置参数 /,但此处不展开)。
例如:
def send_request(url, *args, timeout=30, verify=True, **headers):
...
这样调用都合法:
send_request("https://api.com")-
send_request("https://api.com", "POST", json={"x":1})("POST"进 args,json 进 headers) send_request("https://api.com", timeout=5, Authorization="Bearer...")
关键原则:参数顺序要让人一眼看出哪些是必填、哪些是扩展、哪些是配置;避免过度堆砌 *args/**kwargs,必要时拆分成多个明确命名的参数提升可维护性。
# python
# js
# json
# app
# python函数
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
如何快速完成中国万网建站详细流程?
个人摄影网站制作流程,摄影爱好者都去什么网站?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
Laravel中的withCount方法怎么高效统计关联模型数量
javascript读取文本节点方法小结
javascript中的try catch异常捕获机制用法分析
Laravel怎么在Controller之外的地方验证数据
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
Laravel如何实现API速率限制?(Rate Limiting教程)
如何在宝塔面板中创建新站点?
长沙企业网站制作哪家好,长沙水业集团官方网站?
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
如何在Windows服务器上快速搭建网站?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Laravel怎么连接多个数据库_Laravel多数据库连接配置
如何在阿里云虚拟服务器快速搭建网站?
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Laravel如何使用Telescope进行调试?(安装和使用教程)
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
如何将凡科建站内容保存为本地文件?
网页设计与网站制作内容,怎样注册网站?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel观察者模式如何使用_Laravel Model Observer配置
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Python文本处理实践_日志清洗解析【指导】
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
bootstrap日历插件datetimepicker使用方法
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
高端建站如何打造兼具美学与转化的品牌官网?
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
Laravel PHP版本要求一览_Laravel各版本环境要求对照
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
浅谈Javascript中的Label语句
Laravel怎么清理缓存_Laravel optimize clear命令详解
微信小程序 五星评分(包括半颗星评分)实例代码
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
如何在IIS中新建站点并解决端口绑定冲突?
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel distinct去重查询_Laravel Eloquent去重方法
zabbix利用python脚本发送报警邮件的方法
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何快速搭建高效WAP手机网站吸引移动用户?


的所有参数