1. 参数的可变类型和不可变类型
可变类型:列表,字典,集合不可变类型:数值,字符串,元组,frozenset集合
传递不可变类型参数
执行结果是:
如果想要通过函数修改不可变变量时,可以通过return 语句将结果返回,重新赋值
运行结果:
传递可变类型参数
执行结果是:
2. 参数的分类:
函数声明时,参数设置了默认的表达式,函数调用时,则该参数可以不传值。2.1必需参数(位置参数)
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样
运行结果:
如果缺少必须的参数,运行将会报错
报错信息
2.2默认参数
运行结果:
默认参数的注意点:
1. 默认参数必须在所有必需参数之后
2. 默认参数要使用不可变变量(不可变变量一旦生成,则不能修改,因此函数内部无法对其进行修改,因此当函数再次被调用时,默认值没有被改变)
2.3不定长参数
有时,函数定义的时候不能确定参数的个数,因此可以通过不定长变变量来实现。不定长变量分为两种,
*args:接收N个位置参数,转换成元组形式
因为函数会将多余的参数转换为元组,因此可以直接传递元组,元组之前添加 *
运行结果:
当通过变量传递元组时,需要在元组变量之前添加 *
运行结果
2.4 关键字参数:
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
**kwargs:接收N个关键字参数,转换成字典方式
运行结果:
因为关键字变量将传化成一个字典,因此,我们可以直接传递字典变量,字典之前添加 **,且字典键为字符串类型
运行结果:
通过字典变量传递参数,需要在变量之前添加**,并且字典的键只能是字符类型
运行结果:
当字典中的键不是字符串时
运行结果
关键字参数的另一个用法,可以打乱参数的传递顺序
运行结果:
可以通过指定关键字的名称,打乱原有的传递顺序,但是一定要注意,只有参数列表中定义的参数才可以打乱,其他参数,都传递给了**args变量
2.5 命名关键字参数:
关键参数可以接收任意(包括名称和个数)的包含参数名的参数,如果希望输入的关键字参数能够在我们指定的范围内,此时需要明确指出,这些参数则称为 命名关键字参数(命名关键字参数就是用来限制可以传递的关键字参数的范围)
语法
2.5.1 def function(arg1, arg2, *, 命名关键字参数1, 命名关键字参数2...)
示例
运行结果
当不通过关键字传递参数时,系统则会报错
运行结果
2.5.2 当关键字参数之前存在可变参数时:
def function(arg1, arg2, *arg3, 关键字参数1,关键字参数2)
运行结果
2.6 各种参数的传递顺序
规则:def function(必须参数, 默认参数, 不定长参数, 命名关键字参数, 关键字参数)
示例 1
运行结果
示例 2
运行结果
2.7 通过关键字传递参数
函数在定义的时候,大部分参数都有自己的名字,因此,在传递值的时候,我们可以使用“变量名=xx”的方式传递参数。
示例
示例通过变量名更改参数传递顺序
运行结果
复杂的示例
运行结果:
当函数参数中包含不定长参数时,通过变量名传递参数会提示错误
如果没有可变参数的传入,是可以运行的
运行结果
因此:通过变量名传递参数,要避免函数中包括不定长参数