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手机网站吸引移动用户?