位置参数
最常用的参数方法,通过位置进行匹配把参数值传递给函数头部的参数名称,匹配顺序为从左到右
def func(name, age):
print("my name is %s, i am %s years old"%(name, age))
#参数的顺序从左到右一一对应,不能缺少或增加额外的参数
func('liyitong', 23)
my name is liyitong, i am 23 years old
关键字参数
通过参数名进行匹配,可以忽略位置,使用name=value这种语法
def func(name, age):
print("my name is %s, i am %s years old"%(name, age))
func(name='liyitong',age=23)
my name is liyitong, i am 23 years old
my name is linsiyi, i am 24 years old
注意,关键参数和位置参数混合使用时,位置参数(value)必须先放在匹配的位置,且在关键字参数(name=value)之前,但如果只有关键字参数,则不存在先后顺序
以下是正确的调用方式
func('faka', age=23)
func(name='faka', age=23)
func(age=23, name='faka')
以下是错误的调用方式
func(age=23, 'faka') #SyntaxError: positional argument follows keyword argument
func(23,name='faka') #func() got multiple values for argument 'name'
默认参数
为没有传入值的参数定义参数值,函数调用时可传可不传,注意函数定义或者调用时,位置参数必须出现在默认参数之前
def func(name, age=23): #注意函数定义或者调用时,位置参数必须出现在默认参数之前
print("my name is %s, i am %s years old"%(name, age))
func('faka') #不传age的值,使用默认值23
>>> my name is faka, i am 23 years old
func('faka', 25) #传入age的值为25
>>> my name is faka, i am 25 years old
收集参数 :允许用户提供任意数量的参数,
收集位置参数,使用*args
def func(*args):
print(args)
func('hello') #打印出来是一个元组,也就是说前面有星号的参数会被放在元组中
>>> ('hello',)
func(1, 2, 3)
>>> (1, 2, 3)
与位置参数一起使用时,带星号的参数意味着收集余下的位置参数
def func(title, *args):
print(title)
print(args)
func('hello','world','!')
>>> hello
('world', '!')
如果还有后续参数则需要使用名称指定,因为星号不会收集关键字参数
def func(title, *args, title2):
print(title, args, title2)
func('hello','world',title2='!')
>>> hello ('world',) !
如果需要收集关键字参数,可使用两个星号 **kargs
def func(**args):
print(args)
func(x=1, y=2, z=3) #这样打印出的是一个字典而不是元组
>>> {'x': 1, 'y': 2, 'z': 3}
将不同参数结合使用,基本原则是:先位置参数,默认参数,收集位置参数(*args),收集关键字参数(**kargs)(定义和调用都应遵循)
def func(x, y, z=3, *args, **kargs):
print(x, y, z, args, kargs)
func(1,2,3,4,5,title1='hello',title2='world')
>>> 1 2 3 (4, 5) {'title1': 'hello', 'title2': 'world'}