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.小结
- 参数的传递时通过自动将对象赋值给本地变量名来实现的
- 改变函数的可变参数的值也许会对调用者有影响