Python中函数的参数-arguments
归纳起来,Python中函数的定义形式和调用形式主要有如下几种形式:
# 函数的定义形式 def func(name) # 匹配positional参数或者keyword参数 def func(name=value) # 如果不传,有默认参数 def func(*name) # 将额外的positional参数转换成一个tuple,然后赋给name def func(**name) # 将额外的keyword参数转换成一个dictionary,然后赋给name def func(*other, name) # Python 3.X中定义keyword-only参数的形式,Python 2.X中不支持,此时,name一定要以keyword的形式传递 def func(*, name) # Python 3.X中定义keyword-only参数的形式, Python 2.X中不支持,此时, name一定要以keyword的形式传递 # 函数的调用 func(name) # 以positional参数调用 func(name=value) # 以keyword参数调用 func(*iterable) # 将iterable对象转换成一连串单个positional参数进行调用 func(**dictionary) # 将dictionary转换成keywrod参数进行调用
这里需要注意3点:
1 在Python 2.X中(在Python 3.X中,这种形式已经不允许了),还有一种定义函数的方式,就是将函数的参数定义成一个tuple,那么,当调用函数的时候,传递一个结构一样的tuple参数,这个tuple参数就会被unpack:
# 定义 def func((a, (b, c)) # 调用 func((1, (2, 3)) # a=1, b=2, c=3 func((1, [2, 3])) # a=1, b=2, c=3,这样调用也是可以的 func((1, 'mn')) # a=1, b='m', c='n', 这样也可以,也就是说调用的时候只要是序列都可以 # 但是定义的时候只能是tuple,不能出现其他序列,比如数组,下面的情形是不对的 def func((a, [b, c]))
2 对于调用形式func(*name)和func(**name),也可以使用apply函数达到同样的效果,但是apply函数只能在Python 2.X中使用,在Python 3.X中被移除了,使用形式为:
def func(*a, **b) a=(1, 2) b={'c':3, 'd':4} func(*a, **b) # Python 2.X和Python 3.X均支持 apply(func, a, b) # 仅Python 2.X支持,效果一样
3 对于默认参数,尤其要注意可变对象,每一次以默认形式象调用函数,这个默认的参数会被重用,而不会重置:
def func(a=[]): a += [1] print(a) >>>func() [1] >>>func() # 此时a的值是[1] [1, 1] >>>func() # 此时a的值是[1, 1] [1, 1, 1]
函数定义时参数的顺序以及函数调用时参数的顺序
Python中,定义函数和调用函数时,参数的顺序有一定的规则,如果不符合规则,Python会报错:
1 在定义函数时,参数的顺序为:positional参数(name),默认参数(name=value),*name形式(或者只有一个*,但是只在Python 3.X中支持),name或者name=value形式(都只在Python 3.X中支持,叫keyword-only参数,后面name=value是赋默认值),**name形式;
2 在调用函数时,参数的顺序为:positional参数(name),keyword参数(name=value)或者*name形式,**name形式
总之,**name无论在定义函数时,还是在调用函数时,都只应出现在最后。
函数参数的匹配步骤
Python内部,对于函数参数的匹配大致分为5步:
1 首先匹配positional参数(name)
2 匹配keywrod参数(name=value)
3 将额外的非keyword参数匹配给*name形式
4 将额外的keyword参数匹配给**name形式
5 如果有默认值,给未传递的参数赋默认值
经过上述步骤之后,Python还需要确保,每一个参数,只匹配了一个值,否则,就会报错。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2013-06-23 从汇编看c++中指向成员变量的指针(一)