后端开发
·2 天前插播一个题外话🥰:
作为一位做题家,记笔记几乎是刻在学习行为中的。之前一直都是用纸质版,包括刚开始学习Python前几天。后来在一个帖子看到有人说,现在这个时代还在用纸笔写学习笔记太落后了😱,加上我一直有在网上写笔记的打算,(起初是想发在CSDN上的,但是我发现了鱼皮学长的这个网站),所以今天快速整理了这些天的学习笔记(还是比较粗糙的),如果碰巧对你有用,那就两全其美了(感谢鱼皮学长以及其他默默付出的前辈)。😘
下面是对第11天学习笔记的补充(来自鱼皮学长):
1.问题:如果我吧*args放最前面,后面给参数赋值的时候得加具体变量名,感觉麻烦
所以打算放后面,但是我想要前面的形参为默认值,不知道怎么处理
# coupon、score不填,自动用默认值;express用关键字指定;后面是商品元组传给*args
res = calc_rder_cost(express=50, ("商品1", 3000, 2))
print(res)
2.回答:Python 的硬规矩:【调用函数时,不带名字的位置参数必须写在带名字的关键字参数前面】。你写的calc_order_cost(express=50, ("商品1", 3000, 2)),前面是 express=50 这个带名字的,后面又跟了个不带名字的元组,Python 直接给你报 positional argument follows keyword argument,看报错信息也能对上。
还有第二条规矩也得知道:位置参数是【从前往后挨个填坑】的,不能跳。所以就算你换成 calc_order_cost(50, "商品1", 3000, 2) 也不行——50 会填到 coupon 头上,“商品1” 填到 score 头上,全乱套。
所以如果 *args 保持放最后,你想要的效果只有一种写法:把前面的坑手动填上。
python
res = calc_order_cost(0, 0, 50, "商品1", 3000, 2)
# coupon=0, score=0, express=50, args=("商品1", 3000, 2)
前面俩 0 就是你亲手填的默认值,纯粹是为了给 express 腾位置。是不是感觉有点蠢?对,所以大家都不会这么写。
实际开发里更常见的做法反而是把 *args 放最前面,就是你嫌麻烦的那种:
python
def calc_order_cost(*args, coupon: int = 0, score: int = 0, express: float | int = 0.0):
...
res = calc_order_cost(("商品1", 3000, 2), ("商品2", 100, 1), express=50)
是要多打几个字母,但你换个角度看:调用的时候一眼就能看出 50 是快递费,过俩月回来看代码也不用猜。带默认值的参数用关键字传,本来就是 Python 推荐的姿势,这个麻烦是值得的。
一句话总结:位置参数排队填坑,不能插队;关键字参数对号入座,想跳过前面的参数,就只能走关键字传参这一条路。
5
2
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
