函数的参数类型:位置参数、默认参数、可变参数、关键字参数、命名关键字参数。
接下来一一讲解各个参数的特点。
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)的形式调用它