函数的参数类型:位置参数、默认参数、可变参数、关键字参数、命名关键字参数。
接下来一一讲解各个参数的特点。
1、位置参数
含义:位置参数是指要根据函数给定位置参数的实际含义来传递参数。
例如:我们要计算a的x次方。代码可以这样写:
def power(x,n):
s=1
while n>0:
s=s*x
n=n-1
return s
# 测试
print(power(5,2))
# 结果
25
在这里x代表底数,n代表次幂,也就是求x的n次幂。因此传递参数时一定要注意参数的位置。如果学过其他的编程语言,c/c++,java等,这里应当很容易理解。
2、默认参数
含义:在传递参数时设定参数的默认值
例如:在录入一位员工注册信息时,需要以下信息:姓名、年龄、性别、居住的国家、城市
在这里,将性别、城市和国家设置为默认参数,这样的话在满足默认参数的条件下,只需要传递两个参数就可以了。
def register(name,age,gender='man',city='beijing',country='China'):
print('name:',name)
print('age:',age)
print('gender:',gender)
print('city:',city)
print('country:',country)
register('xiaoming',18)
如果想要传递指定的默认参数还可以指定参数的名字
def register(name,age,gender='man',city='beijing',country='China'):
print('name:',name)
print('age:',age)
print('gender:',gender)
print('city:',city)
print('country:',country)
register('xiaohong',19,'woman',city='shanghai')#这里指定城市为上海
3、可变参数
含义:可变参数是指参数个数可变,可以是0个,1个,2个甚至更多。
例如:计算a^2+b^2+c^2+….
def calculate(*nums):
s=0
for n in nums:
s=s+n*n
return s
print(calculate(1,2,3,4,5))
#结果
55
在该函数中,nums代表一个tuple类型的数据类型。也就是传入的参数会在函数内部组成一个tuple。如果传入的数据类型为list或者tuple类型,在传入的参数变量前加上*号
def calculate(*nums):
s=0
for n in nums:
s=s+n*n
return s
r = (4,4,4,4)
s = [3,3,3,3]
print(calculate(*r))
print(calculate(*s))
# 结果
64
36
*r和*s代表将r和s这两种数据类型的所有元素传入。
4、关键字参数
含义:可以传入0个或任意个含参数名的参数。
例如:定义一个人的个人信息,至少包含姓名和年龄。我们可以这样写:
def person(name,age):
print('name:',name)
print('age:',age)
person('LiMing',17)
但是如果还想提供性别,城市等扩展信息(这样的扩展信息在一开始或许并不知道),就应当使用关键字参数
def person(name,age,**kw):
print('name:',name)
print('age:',age)
print('kw:',kw)
person('LiMing',17,gender='man',city='beijing')#在传递参数时将这些信息指明
# 结果
name: LiMing
age: 17
kw: {'gender': 'man', 'city': 'beijing'}
传入的关键字参数会在函数中组成一个dict。
还可以将gender='man',city='beijing'
放在dict中作为一个参数传递:
def person(name,age,**kw):
print('name:',name)
print('age:',age)
print('kw:',kw)
d = {'gender':'man','city':'beijing'}
person('LiMing',17,**d)
5、命名关键字参数
含义:限制关键字参数的名字
例如:如果只接受薪水和城市作为关键字参数
def person(name,age,*,job,salary):
print('name:',name)
print('age:',age)
print('job:',job)
print('salary:',salary)
person('ZhangShan',25,job='engineer',salary=10000)
用*来分隔,*后代表命名关键字参数,如果前面有了可变参数,那么后面紧接命名关键字就可以了
def person(name,age,*args,job,salary):
命名关键字参数必须指明参数名,不能这样调用:
person('ZhangShan',25,'engineer',10000)
命名关键字参数可以有缺省值,即可以设置默认值
def person(name,age,*,job='engineer',salary):
注意:
对于任意函数,都可以通过类似func(*args, **kw)的形式调用它