Python函数参数高级用法_默认值与可变参数解析【教程】
技术百科
舞夢輝影
发布时间:2026-01-01
浏览: 次 Python函数参数的默认值和可变参数不是语法糖,而是影响函数行为和调用安全的关键设计:默认值陷阱在于可变对象作默认值会被多次调用共享;args接收任意位置参数并打包为元组;kwargs捕获未匹配关键字参数并存为字典;参数顺序必须是普通参数→args→命名关键字参数→kwargs。
Python函数参数的默认值和可变参数不是语法糖,而是影响函数行为和调用安全的关键设计。用错默认值可能引发隐蔽的bug,乱用*和**会让调用逻辑难以追踪。
默认值陷阱:别让列表或字典当默认参数
函数定义时,默认参数只被计算一次。如果用可变对象(如[]或{})作默认值,多次调用会共享同一个对象。
错误写法:
def add_item(item, lst=[]): # 危险!
lst.append(item)
return lst
print(add_item('a')) # ['a']
print(add_item('b')) # ['a', 'b'] ← 意外!
正确做法:用None占位,内部初始化:
def add_item(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
*args:接收任意位置参数,本质是元组
*args把多余的位置参数打包成一个tuple,不改变原有参数顺序,也不影响命名参数使用。
- 必须写在普通参数之后、
**kwargs之前 - 名字
args只是惯例,写成*rest也合法 - 适合封装“不确定有几个输入”的场景,比如日志记录、数值统计
示例:
def sum_all(a, b, *numbers):
return a + b + sum(numbers)
sum_all(1, 2, 3, 4, 5) # a=1, b=2,
numbers=(3,4,5)
**kwargs:捕获关键字参数,本质是字典
**kwargs把未匹配的关键字参数收集为dict,常用于配置透传或兼容性扩展。
- 必须放在参数列表最后
- 不能和同名关键字参数冲突(比如已有
name参数,就不能再传name=xxx进**kwargs) - 适合做装饰器、API封装、类初始化参数转发
示例:
def connect(host, port, **options):
print(f"Connecting to {host}:{port}")
print("Options:", options)
connect('localhost', 8080, timeout=5, ssl=True)
Options: {'timeout': 5, 'ssl': True}
组合使用:顺序不可乱,语义要清晰
完整参数顺序是:普通参数 → *args → 命名关键字参数 → **kwargs。Python 3 引入了命名关键字参数(用*隔开),强制某些参数只能以关键字形式传入,提升可读性与健壮性。
示例:
def send_email(to, *ccs, subject, priority='normal', **headers):
print(f"To: {to}, CC: {ccs}")
print(f"Subject: {subject}, Priority: {priority}")
print(f"Headers: {headers}")
send_email('a@x.com', 'b@x.com', 'c@x.com',
subject='Hello', priority='high',
Content_Type='text/plain')
这里subject和priority是命名关键字参数,调用时必须显式写出名字,避免误传顺序。
# ai
# python
# app
# ssl
# python函数
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在 Go 中判断变量是否为函数类型
- Win11屏幕亮度突然变暗怎么解决_自动变暗问题处
- Win11如何连接Xbox手柄 Win11蓝牙连接
- 使用类变量定义字符串常量时如何实现类型安全的 Li
- Win11怎么关闭粘滞键_彻底禁用Windows
- Win10怎么关闭自动更新错误重启 Win10策略
- MAC怎么截图并快速编辑_MAC自带截图快捷键与标
- Mac怎么设置登录项_Mac管理开机自启动程序【教
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- 如何使用Golang配置安全开发环境_防止敏感信息
- MAC如何隐藏文件夹及文件_MAC终端命令隐藏与第
- php怎么操作Redis_Redis扩展连接与基本
- 如何使用Golang捕获并记录协程panic_保证
- Windows11如何设置专注助手_Windows
- 如何在Golang中修改数组元素_通过指针实现原地
- Linux怎么设置磁盘配额_Linux系统Quot
- c++怎么编写动态链接库dll_c++ __dec
- Go 语言标准库为何不提供泛型切片的 Contai
- Python面向对象实战讲解_类与设计模式深入理解
- Win11如何隐藏桌面图标 Win11一键隐藏/显
- Go 中的 := 运算符:类型推导机制与使用边界详
- 如何提升Golang程序I/O性能_Golang
- Win10怎么设置开机密码_Windows10账户
- Windows10如何更改系统字体大小_Win10
- 如何使用Golang实现容器健康检查_监控和自动重
- Windows怎样拦截QQ浏览器广告_Window
- c++ unordered_map怎么用 c++哈
- How to Properly Use NumPy
- 如何使用Golang实现容器安全扫描_Golang
- c# Task.Yield 的作用是什么 它和Ta
- PHP主流架构怎么处理表单验证_规则与自定义【技巧
- 如何使用Golang管理模块版本_Golanggo
- 如何使用Golang sync.Map实现并发安全
- Python类装饰器使用_元编程解析【教程】
- 如何使用Golang反射创建map对象_动态生成键
- Win11系统占用空间大怎么办 Win11深度瘦身
- Python生成器表达式内存优化_惰性计算说明【指
- Mac系统更新下载慢或失败怎么办_解决macOS升
- 如何使用Golang实现路由参数绑定_使用Mux和
- Go 中实现 Python urllib.quot
- 如何在Golang中理解指针比较_Golang地址
- Win11怎样安装网易云音乐_Win11安装网易云
- c# 如何深拷贝和浅拷贝
- 如何使用Golang理解结构体指针方法接收者_Go
- 如何使用Golang读取日志文件_Golang b
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- 如何在 Laravel 中通过嵌套关联关系进行 o
- Win11怎么激活Windows10_Win11激
- Windows10如何彻底关闭自动更新_Win10
- 如何在Golang中实现基础配置管理功能_Gola

numbers=(3,4,5)
QQ客服