函数的参数
实参和形参
- 定义函数时,圆括号内是使用逗号分隔的形式参数列表(简称形参),调用函数时向其传递实参,根据不同的参数类型,将实参的值或引用传递给形参。
例如:
def add(x,y): # x,y是形参
return x+y
add(1,2) # 1,2分别对应形参的x和y,为实参
结果为:3。
- 在Python中,参数的类型可分为固定数据类型(如整数、浮点数、字符串、元组等)和可变数据类型(如列表】字典、集合等)。当参数类型为固定数据类型时,在函数内部直接修改形参的值不会影响实参。
例如:
def ChangeInt(b): # 定义了一个ChangeInt函数
b = 10 # 令形参b等于10
a=2
ChangeInt(a) # 将实参a传给形参b
print('a=',a)
结果为:a=2
- 但当参数类型为可变数据类型时,在函数内部使用下标或其他方式为其增加、删除元素或修改元素值时,修改后的结果是可以反映到函数之外的,即实参也会得到相应的修改。
例如:
def changeme(mylist1): # 形参为mylist1
mylist1.append([1,2,3,4]) # 在形参mylist1列表中添加列表元素[1,2,3,4]
print('函数内取值:',mylist1)
return
mylist2 = [10,20,30]
changeme(mylist2) # 将mylist2作为实参传递给函数changeme
print('函数外取值:',mylist2)
结果为:
函数内取值:[10,20,30,[1,2,3,4]]
函数外取值:[10,20,30,[1,2,3,4]]
从运行结果可以看出,在函数内部修改了形参mylist1的值,当函数运行结束后,实参mylist2的值也被修改了。
参数类型
在Python中,有多种参数类型,包括位置参数、默认值参数、关键字参数和不定长参数。
位置参数
位置参数是比较常用的形式。调用函数时,实参和形参的顺序必须严格一致,并且实参和形参的数量必须相同。
默认值参数
在定义函数时,可以为函数的参数设置默认值,这个参数被称为默认值参数。在调用带有默认值参数的函数时,可以不用为设置了默认值的形参进行传值,此时函数将会直接使用函数定义时设置的默认值,也可以通过显式赋值来替换其默认值。
带有默认值参数的函数定义语法如下:
def 函数名(...,形参名=默认值):
函数体
tips:可以使用函数名.__defaults__
(注意这里是两个下划线)随时查看函数所有默认值函数的当前值,其返回值为一个元组,其中的元素依次表示每个默认值参数的当前值。
def printinfo(name,age=35): # 定义函数,打印任何传入的字符串
print('名字:',name)
print('年龄:',age)
return
# 调用printinfo函数
print(printinfo.__defaults__) # 输出函数默认值参数
printinfo('root',50) # 显式赋值
print('-------------------')
printinfo('root') # 使用默认值参数
运行结果:
(35,)
名字:root
年龄:50
-------------------
名字:root
年龄:35
tips:在定义带有默认值参数的函数时,默认值必须出现在函数形参列表的最右端,否则会提示语法错误。例如,以下函数的定义是错误的:
def f(a=1,b,c=3):
print(a,b,c)
多次调用函数并不为默认值参数传递值时,默认值参数只在定义时进行一次解释和初始化,对于列表、字典这样可变类型的默认值参数,这一点可能会导致逻辑错误。因此,一般来说,要避免使用列表、字典、集合或其他可变数据类型作为函数参数的默认值。
例如:
def demo(newitem,old_list=[]):
old_list.append(newitem)
return old_list
print(demo('5',[1,2,3,4]))
print(demo('a'))
print(demo('b'))
运行结果:
[1,2,3,4,'5']
['a']
['a','b'] # 这里出现了逻辑错误,本应该是['b']变成了['a','b']
程序说明:使用列表作为默认值参数,连续多次调用该函数而不给该参数传值时,再次调用将保留上一次调用结果。因此,执行语句”print(demo('b'))“时,输出为”['a','b']“,即在上一次调用结果['a']的基础上增加了元素‘b’。
另外,如果在定义函数时某个参数的默认值为一个变量,那么参数的默认值只依赖于函数定义是该变量的值。
关键字参数
关键字参数是指调用函数时的参数传递方式,是一种按参数名字传递值的方式。使用关键字参数允许函数调用时参数的顺序与定义时不一致,Python解释器能够用参数名匹配参数值。
例如:
def f(name,age):
print(name)
print(age)
return
# 调用f函数
f(age=50,name='runoob')
运行结果:
runoob
50
不定长参数
通常在定义一个函数时,若希望函数能够处理比定义更多的参数,此时可以在函数中使用不定长参数。
其基本语法格式如下:
def 函数名([形参列表,]*args,**kwargs):
函数体
其中,*args
和**kwargs
为不定长参数,前者用来接收任意多个实参并将其放在一个元组中,后者用来接收类似于关键字参数一样显式赋值形式的多个实参并将其放入字典中。
例如:
def f(a,b,*args,**kwargs):
print(a)
print(b)
print(args)
print(kwargs)
f(1,2,3,4,x=6,z=7)
运行结果为:
1
2
(3,4,5)
{'x':6,'z':7}