• 作者:
  • 最后编辑:2019年06月02日
  • 标签:

python函数定义的灵活性非常大,除了正常定义的必选参数外,还可以使用默认参数,可变参数和关键参数。

位置参数

这是最普通的参数,调用函数时,位置参数要按照位置顺序依次赋值。

默认参数

默认参数不能在位置参数的前面。

有多个默认参数的时候,可以按顺序提供默认参数,也可以不按顺序提供部分默认参数,这是需要不提供部分默认参数的参数名写上

默认参数有一个坑,当默认参数为[]的时候,默认参数就一直指向[]这个对象,当改变[]的内容的时候,下次调用就会发现默认参数的内容变量。不过默认参数[]可以用来实现静态变量

可变参数

可变参数是传入参数的个数是可变的(可为0),在参数名前面加上一个*号就定义了一个可变参数,调用可变参数可以一个一个的传进去,也可以把list或者tuple传进去

nums=[1,2,3]
# 一个一个传
calc(nums[0],nums[1],nums[2])
# 整个传进去
calc(*nums)

关键字参数

关键字参数允许你传入0个或者任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。在参数名前面加**就定义了一个关键字参数。

def person(name,age,**kw):
  print('name:',name,'age:',age,'other:',kw)
# 传入0个关键字
person('Moilk',30)	# name: Moilk age: 30 other: {}
# 传入任意个数关键字
person('Bob',35,city='Beijing')	# name: Bob gae: 35 other: {'city': 'Beijing'}
extra={'city':'Beijing','job':'Engineer'}
# 传入一个dict
person('Jack',24,**extra)

命名关键字参数

对于关键字参数,函数调用者可以传入任意不受限制的关键字参数,而至于传入了哪些,我们就要在函数内部进行检查。如果要限制关键字参数的名字,就可以使用命名关键字参数。

比如说,只接收city和job作为关键字参数,这种方式定义函数如下:

def person(name,age,*,city,job):
  pass
person('Jack',24,city='Bejing',job='Engineer')

命名关键字参数需要一个*号作为分割符,*后面的参数将被视为命名关键字参数。调用函数的时候,命名关键字参数必须传入参数名。

命名关键字参数可以有缺省值,从而简化调用

# 这是有默认值的就可以在没有默认值的前面
def person(name, age,*,city='Bejing',job)

参数组合

在Python中定义函数的时候,可以位置参数、默认参数、可变参数、关键字参数和命名关键字参数组合使用。但是可变参数无法与命名关键字参数混合。参数定义的顺序必须是:位置参数、默认参数、可变参数/命名关键字参数、关键字参数

对于任意函数,都可以通过类似func(*args,**kw)的形式调用它