参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888
在 python 中,类型属于对象,变量是没有类型的:
a=[1,2,3]
a="Runoob"
以上代码中,[1,2,3] 是 List 类型,”Runoob” 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 List 类型对象,也可以指向 String 类型对象。
可变对象与不可变对象
不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象
位置参数Positional Arguments(必选参数)
默认参数
定义时指定默认值的参数
定义默认参数要牢记一点:默认参数必须指向不变对象!
不定长参数(可变参数)(*)
函数定义时,*代表允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
函数调用时,_代表把已经组装好的列表或元组传递进去。_nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。
不定长关键字参数(可变关键字参数)(**)
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
调用时也可用**直接把组装好的dict传进去,此时函数内的参数是组装好的dict的拷贝,函数内对参数的修改不影响外面的dict。
命名关键字参数
限制关键字参数的名字,*后面的参数调用时必须传入参数名,且必须传入参数,除非已有默认值
def person(name, age, *, city, job):
print(name, age, city, job)
person("Tom", 17, city="BeiJing", job="teacher")
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
print(args)
person("Tom", 17, *[1,2,3], city="BeiJing", job="Pro")
person("Tom", 17, city="BeiJing", job="Pro")
# 传入0个可变参数,args为空的元组,args=()
参数顺序
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和可变关键字参数。