一、形参和实参
函数参数的作用是传递数据给函数使用
在使用的过程中,参数有两种形式:形式参数和实际参数
形参:
定义函数的参数
实参:
调用函数时的参数
根据实际参数类型不同,将实际参数传递给形参的方式有两种:值传递和引用传递
值传递:
实参为不可变对象,传递给形参后,形参的值改变,实参值不变。(如 fun(a),传递的只是 a 的值,没有影响 a 对象本身,比如在 fun(a) 内部修改 a 的值,只是修改另外一个赋值的对象,不会影响 a 本身)
引用传递:
实参为可变对象,传递给形参后,形参的值改变,实参值也会改变(如( fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会收影响)
# 值传递和引用传递 def fun(obj): print(obj) obj += 1 obj1 = "123456" demo(obj1) print("函数调用后 obj1:" + obj1) obj2 = [1 ,2,3] demo(obj2) print("函数调用后:"+ obj2) # 结果 123456 函数调用后obj1:123456 [1, 2, 3] 函数调用后obj2:[1, 2, 3, 1, 2, 3]
二、位置参数、关键字参数、默认参数、可变参数
1、位置参数(必备参数)
函数调用时的数量,位置,参数类型必须和定义的一样
2、关键字参数
函数调用时,使用形参的名字 = 输入的参数值,此时位置可与定义时不一致
3、默认参数
函数定义时,为参数设置一个默认的值,当函数调用时,没有传入这个参数值,直接使用这个默认值,
注意:定义函数时,默认参数必须指向不可变参数,如果指向可变对象,多次调用,可能时得到的不是意料之内的结果。
# 默认参数必须值相不可变对象,如果指向可变对象,结果不对 def demo1(obj = []): print( obj ) obj.append(1) def demo2(obj = None): if obj == None: obj = [] print(obj) obj,append(1) demo1() demo1() demo1() demo2() demo2() demo2() #结果 [] [1] [1, 1] [] [] []
4、可变参数(不定长参数)
可变参数有两种形式:一种时 *arg, 一种时 ** kwargs
*args :
这种形式表示接受任意多个实际参数将其放到一个与那组中
**kwargs:
这种形式表示接受任意多个实际参数将其放到一个字典中,类似关键字参数
#可变参数 #*args形式 def demo3(*args): print " I like coffee:" for i in args: print i, #调用形式:可直接传一个tuple demo3('巴西','土耳其') #也可以通过list或者tuple的变量传 obj1=['蓝山','摩卡','卡布奇诺'] demo3(*obj1) #**kwargs形式 def person(name, age, **kw): print' name:', name, 'age:', age, 'other:', kw def demo4(**kwargs): print " name:age" for i,j in kwargs.items(): print i,':',j #调用:可直接传一个字典 person("Paul",77,sex="male",job="teacher") #也可以通过字典变量传 obj2={'Mary':23,'HanMeiMei':34,'Lily':12} demo4(**obj2) #结果 I like coffee: 巴西 土耳其 I like coffee: 蓝山 摩卡 卡布奇诺 name: Paul age: 77 other: {'job': 'teacher', 'sex': 'male'} name:age Lily : 12 Mary : 23 HanMeiMei : 34
三、参数组合
在 Python 中定义函数,可以用必选参数,默认参数,可变参数,关键字参数组合使用,但是注意,参数定义的顺序必须是:
必选参数、默认参数、可变参数、关键字参数