1. 位置参数

位置参数是最简单的传入参数的方式

def func(a,b):
    print(a+b)
func(1,3) #3

2. 默认参数

默认参数是在调用函数的时候使用一些包含默认值的参数

def power(x,n=2):
    s = 1
    while(n>0)
        n -= 1
        s *= n
    return s

3. 可变参数

可变参数允许在调用参数的时候传入多个参数,这些参数在调用时被自动组装为一个tuple

def calc(*nums):
    sum = 0
    for n in nums:
        sum += n
    return sum

此时有两种调用方式:

calc(1,2,3) # return 6
calc(*[1,2,3]) # return 6

其中第一种方法等价于:

>>>ls= [1,2,3]
>>>calc(ls[0],ls[1],ls[2])

在第二种方法中,*nums表示把这个list中的所有元素作为可变参数传进函数。

4. 关键字参数

可变参数允许传入0个~多个参数,而关键字参数允许在调用时以字典形式传入多个参数,在传递参数时,需要使用=连接键和值

#使用两个*表示关键字参数
def person_info(name,age,**kw):
    print("name",name,"age",age,"other",kw)

>>>person("Huang",35,city = 'Karlsruhe')
>>>name Huang age 35 other {'city': 'Karlsruhe'}

关键字参数有效的扩展了函数的功能。试想场景,在某网站用户注册的过程中,除了姓名年龄时必选项,而住址等内容为可选项。
当可选项内容过多时,我们可以使用相应的简化写法:

>>>extra = {'city':'Karlsruhe','Job':'Student'}
>>>person('Huang',24,**extra)

**extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数。

5. 命名关键字参数

命名关键字在关键字的基础上限制了传入关键字的变量名。
和普通关键字参数不同,命名关键字参数需要一个用来区分的分隔符*,他后面的参数被认为是命名关键字参数。

def person_info(name,age,*,city,job):
    print(name,age,city,job)

>>>person_info("Huang",24,city = "Karlsruhe",job = "Student")

有以下注意事项:

  • 命名关键字必须传入参数名
  • 数量一致

6. 参数组合

上述五种不同类型的参数传递方式,除了可变参数和命名关键字参数不能混合使用,其余均可组合使用。但需要注意的是,参数定义的顺序必须是:位置参数-默认参数-可变参数-关键字参数-命名关键字参数
由于python的函数的灵活性,上述的物种传参形式可以归结为通过类似于func(*args,**kw)的形式调用。其中,*args对用的是可变参数,接收的是一个tuple**kw对应的是关键字参数,接收到的是一个dict

def f1(a,b,c=0,*args,**kw):
    print("a=",a,"b=",b,"c=",c,"args=",args,"kw=",kw)
>>>args = (1,2,3,4)
>>>kw = {'d':99,'x':"xxx"} 
>>>f1(*args,**kw)
return: 
>>>a= 1 b= 2 c= 3 args= (4,) kw= {'d': 99, 'x': 'xxx'}

7.小结

  1. 参数的传递时通过自动将对象赋值给本地变量名来实现的
  2. 改变函数的可变参数的值也许会对调用者有影响