自定义函数
1.函数定义
def 函数名(<形参1>,<形参2>,<形参3>...):
函数体
return <表达式>
函数可以有返回值,也可以没有,没有就是返回None。当有返回值时,应该有变量接收函数的返回值。
2.参数传递
2.1不可变类型参数传递和可变类型参数的传递
数值,字符串,元组时不可变类型;
当不可变类型的数据当作参数传递时,实际传递的是值,所以当在函数内发生修改,改的是复制的对象,原值不变(类似C语言的值传递)
列表,集合,字典是可变类型
当可变类型的数据当作参数传递时,实际传递的时数据的地址,所以在函数内发生修改,则原值也被修改了(类似C语言的地址传递)
2.2位置参数
要求实参的数量,顺序必须和形参的数量,顺序一一对应。
>>> def getinfo(name,age,sex):
>>> getinfo("lily",12,"M")
2.3默认值参数
是在函数定义时给参数指定一个值,有默认值的形参必须放在形参列表的最后面。
函数调用时:该形参没有对应的实参传递,则取定义时的值;该形参有对应的实参传递,则取实参值。
>>> def getinfo(name,age,sex='M'):
>>> getinfo("lily",12)
>>> getinfo("tom",13,"F")
2.4关键字参数
是在函数调用时,一一指定形参名的值,这样就不要考虑参数传递的顺序。
>>> def getinfo(name,age):
>>> getinfo(name="tom",age=13)
>>> getinfo(age=13,name="tom")
2.5不定长参数
参数的长度可变,可以根据需要传递任意个实参。主要是元素的个数和字典的键值对。
不定长参数也必须放入位置参数,默认值参数后面。
2.5.1将元组作为不定长参数:定义时参数名前加*
>>> def findfriends(name,*fiends):
a.常量传递:
>>> findfriends("lily",'tom','jerry','lucy','bill','bruth','john') #第一个参数传给形参name,后面的都是不定长参数
b.元组传递:
>>> frs = ('tom','jerry','lucy','bill','bruth','john')
>>> findfriends(name,*frs)
2.5.2将字典作为不定长参数:定义时参数名前加**
>>> def multiargs(arg1,**args):
a.常量传递:
>>> multiargs(1,'name'='lily','age'=12) #关键字参数
>>> multiargs(1,**{'name':'lily','age':12}) #字典,**必须
b.字典传递:
>>> frs = {'name':'lily','age':12}
>>> multiargs(1,**frs)
【差异】
在定义函数时,元组类型的形式参数前是“*”,而字典类型的形式参数前是“**”;
在调用函数时,元组类型的实际参数(变量)前是“*”,而字典类型的实际参数(变量)前是“**”。
1.如果传递的实参是N个普通参数,此时实参不需要有*,则函数会把这些参数收集到一个元组里当作不定长参数处理;
2.如果传递的实参是元组/字典参数,此时实参前应该*,否则函数会把元组/字典当作普通参数处理,不会获取元组/字典里的数据。