刚开始学习Python,看了一些资料,总结记录一下基本的Python函数参数。
Python中函数定义,有五种参数分类,分别为:位置参数、默认参数、可变参数、关键字参数、命名关键字参数。
(1)位置参数
也称必选参数,也就是函数调用时,必须传递实参值。这类参数很简单,如下,调用add函数时必须传值给参数x,y,否则报错。
def add(x, y): print("x+y=", x+y) add(3,5)
(2)默认参数
默认参数,顾名思义,参数有默认值,调用函数时,可不传值给默认参数。如下:
def add(x, y=5): print("x+y=", x+y) add(3)
注:(1)默认参数必须在必选参数之后;(2)默认参数必须指向不变对象。
例如,
def addTest(L=[]): L.append("test") print(L) addTest() addTest()
运行结果:
这是由于参数L指向了列表,每次调用都会改变L的值,每次调用L值都不相同,都会多一个字符串“test”。
修改:
def addTest(L=None): if L is None: L = [] L.append("test") print(L) addTest() addTest()
(3)可变参数
可变参数是指传入函数的参数个数是可变的,可以是0个或者任意多个。在函数内部,可变参数接收到的是一个元组tuple。
如,求和计算sum=1+2+3+4+......
def _sum(*numbers): s = 0 for n in numbers: s=s+n print("结果为:", s) _sum(1, 2, 3) _sum(1, 2, 3, 4, 5)
当然,以上_sum函数的参数也可以是列表或者元组,运行结果是一样的,如果是列表或者元组的话,就是普通的位置参数。
此外,对于已构建的列表,可以加“*”号,将列表元素作为可变参数传递给函数。
def _sum(*numbers): s = 0 for n in numbers: s=s+n print("结果为:", s) _sum(1, 2, 3) _sum(1, 2, 3, 4, 5) #定义列表,*numbers将list的所有元素作为可变参数传进去 numbers=[1,2,3,4,5] _sum(*numbers)
(4)关键字参数
可变参数可以传递0或任意多个实参,在函数内部自动组装成元组。关键字参数允许传递0或任意多个含参数名的参数,这些关键字参数在函数内部组装成字典。
def student(name, age, **keywords): print("name:",name,",age:",age,",keywrods:",keywords) student("guangyi",16) student("guangyi", 16, city="hang",gender="M")
对于已构建的字典,可以加“**”,将字典的所有key-value用关键字参数传递到函数的**keywords中,keywords将获得一个字典,它是传入字典的拷贝
def student(name, age, **keywords): print("name:",name,",age:",age,",keywrods:",keywords) student("guangyi",16) student("guangyi", 16, city="hang",gender="M") information={"city" : "hang", "gender":"M","other":"nothing"} # 将字典information的所有key-value用关键字参数传递到函数的**keywords中,keywords将获得一个字典,它是传information的拷贝 student("guangyi", 16, **information)注:对字典keywrods的更改不会影响原字典information
(5)命名关键字参数
它与关键字参数的不同在于,关键字参数是命名的,必须且只能传入指定名字的参数,如下,只能传入参数名为“city”和“job”的关键字参数。(命名关键字参数需要一个分隔符“*”,“*”后面的为命名关键字参数)
def student(name,age,*,city,job): print("name:", name, ",age:", age, ",city:", city,"job:",job) student("guangyi",16,city="hang",job="IT engineer")
另,如果关键字参数前面有可变参数,可不加分隔符“*”
def student(name,age,*args,city,job): print("name:", name, ",age:", age,"args:",args ,",city:", city,"job:",job) student("guangyi",16,1,2,"test",city="hang",job="IT engineer")
总结:命名关键字参数前必须有分隔符“*”,或者可变参数,否则无法识别命名关键字参数
命名关键字参数可以有默认值,如下,参数“city”给定默认值“hang zhou”,函数调用时,该参数可以使用缺省值。
def student(name,age,*args,city="hang zhou ",job): print("name:", name, ",age:", age,"args:",args ,",city:", city,"job:",job) student("guangyi", 16, 1, 2, "test", job="IT engineer")
最后,参数可以组合使用,但是定义的顺序必须为位置参数、默认参数、可变参数、命名关键字参数、关键字参数。