位置参数
位置参数是指定了多少参数,就必须输入多少参数,否则就会报错。也可以把位置参数理解为必须参数,如果没有输入同等的参数,就会报错,比如下面的代码,计算两个数的乘积。
def power(x,y):
return x * y
power(2,5)
# 10
power(2)
#报错
默认参数
默认参数指的是可以给一个参数设置一个默认值,如果用户没有输入这个参数,那么在函数内部就会用这个参数设置的默认值进行计算,比如说下面的函数是返回两个数的乘积,如果用户没有输入第二个数,就默认为数值'2'。
def power(x,y=2):
return x * y
power(2,5)
# 10
power(2)
# 4
可变参数
可变参数是定义函数的时候不确定函数有多少个值,但是都会去接收进行计算,在函数内部是把所有的参数组合成一个不可变的元组数列。
可以把可变参数理解为函数参数的个数是可以不固定的,比如计算用户输入的所有数值之和,此时的参数是不可控的,这种情况就可以使用可变参数,比如下面的代码是计算用户输入的所有数值之和。
# 可变参数通过参数名前输入一个'*'号,标记为这是一个可变参数
def power(*num):
sum = 0
for x in num:
sum += x
return sum
power(2,5)
# 7
power(2)
# 2
power(2,5,6,7,8,9,10,22)
# 69
关键字参数
关键字参数允许传入任意个含参数名的参数与值,并在内部自动组成一个dict类型的数据,比如我需要处理一些注册的信息,但是只有名字是必须的,其他的都是可选的,你可以把关键字参数理解为以name=value形式的这样的参数的个数是不固定的参数。
比如下面的代码就是处理一个注册的信息,如果有人填了选填的部分,就把参数传入到函数进行处理。
# 可变参数通过参数名前输入一个'**'号,标记为这是一个关键字参数,并传入name=value形式的参数
def power(name,**other):
print('name:{}, other:{}'.format(name,other))
power('trick', a=1,b=2)
# name:trick, other:{'a': 1, 'b': 2}
命名关键字参数
命名关键字参数是对于关键字参数的补充,当定义关键字参数的时候我们是没有办法对关键字参数可控的,而命名关键字参数就可以控制关键字参数的名字以及接收关键字的个数,比如下面的代码只接收'city'和'email'两个关键字参数。
#命名关键字参数需要在可控关键字参数前面加一个逗号和一个*号
def power(name, *, city, email):
print('name:{}, city:{}, email:{}'.format(name, city, email))
power('trick', city='bj', email='xx@gmail.com')
# name:trick, city:bj, email:xx@gmail.com
函数参数的一些注意点
在函数中可以组合使用上面5种参数,但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
除此之外在定义默认参数的时候需要注意,如果你定义的是一个引用型对象,比如列表,就会出现类似下面的这样的问题:
def power(a=[]):
a.append('qwe')
return a
print(power([1,2,3,4]))
# [1, 2, 3, 4, 'qwe'] 返回正确
print(power([]))
# ['qwe'] 返回正确
print(power([]))
# ['qwe','qwe'] 在执行一次就出现了问题
上面代码执行无参数调用的第二次就出现了问题,这是因为当我们定义函数的时候,Python解释器执行到这里的时候就为参数a创建一个列表,然后每次我们不输入参数的时候,实际上是返回这个默认参数的列表,所以我们每次不输入参数的时候就会忘默认参数的列表里面添加一个'qwe'。
要解决这样的问题我们需要换一个方法来进行,可以设定一个默认值(None),然后在函数体内部判断是否是None,如果是就创建一个新列表并返回。
def power(a=None):
if a is None:
a = []
a.append('qwe')
return a
print(power([1,2,3]))
# [1, 2, 3, 'qwe']
print(power())
# ['qwe']
print(power())
# ['qwe'] 多次执行没有问题
《Python函数参数》留言数:0