函数的定义与调用
Python语言中使用函数分为两个步骤:定义函数和调用函数。
定义函数
根据函数的输入、输出和数据处理完成函数代码的编写。定义函数只是规定了函数会执行什么操作,但并不是真正去执行。
调用函数
真正去执行函数的代码,是指根据传入的数据完成特定的运算,并将运算结果返回到函数调用位置的过程。
例:
def CalCricleArea():#定义名字为CalCricleArea的函数
s=3.14*3*3#计算半径为3的圆的面积
print('半径为3的圆的面积为: %.2f'%s)#将计算结果输出
CalCricleArea()#调用函数CalCricleArea
注:Python语言中,开发者在程序中定义的变量名、函数名、类名等都是Python语言的自定义标识符,它们的命名规则完全相同。
形参和实参
参数列表
通过函数的参数列表,可以为函数传入待处理的数据,从而使得一个函数更加通用。
形参
形参的全称是形式参数,即定义函数时函数名后面的一对小括号中给出的参数列表。
形参只能在函数中使用,其作用是接收函数调用时传入的参数值(即后面要介绍的实参),并在函数中参与运算。
例:
def CalCricleArea(r):#定义名字为CalCricleArea的函数
s=3.14*r*r#计算半径为3的圆的面积
print('半径为%.2f的圆的面积为: %.2f'%(r,s))#将计算结果输出
def CalRectArea(a,b):#定义名字为CalRectArea的函数
s=a*b#计算边长分别为a和b的长方形的面积
print('边长为%.2f和%.2f的长方形的面积为:%.2f'%(a,b,s))#将计算结果输出
if __name__ == '__main__':
a=eval(input('请输入圆的半径:'))
CalCricleArea(a)
x=eval(input('请输入长方形的一条边长:'))
y=eval(input('请输入长方形的另一条边长:'))
CalRectArea(x,y)
默认参数
函数的默认参数就是缺省参数,即当调用函数时,如果没有为某些形参传递对应的实参,则这些形参会自动使用默认参数值。
例:
def StudentInfo(name,country='中国'):#参数country的默认参数值为'中国'
print('姓名:%s,国家:%s'%(name,country))
StudentInfo('小明')#这里没有给country传参数值,但因为有默认参数所以不会出错
StudentInfo('大卫','美国')#给country传了实参,则不再使用默认参数
注:name并没有默认参数,所以在调用函数时必须为其指定实参,否则运行程序会报错。
关键字参数
在调用函数时,除了前面那种通过位置来体现实参和形参的对应关系的方法(即位置参数),还有一种使用关键字参数的方法,其形式为“形参=实参”。
def StudentInfo(name,chineselevel='良好',country='中国');
print('姓名:%s,中文水平:%s,国家:%s'%(name,chineselevel,country))
StudentInfo('小明')
StudentInfo('大卫',country='美国')
StudentInfo(country='美国',chineselevel='一般',name='约翰')
注:位置参数和关键字参数可以混合使用,但位置参数必须在前、关键字参数在后。
不定长参数
1、不定长参数,即在调用函数时可以接收任意数量的实参,这些实参在传递给函数时会被封装成元组(位置参数)或字典(关键字参数)形式。
2、一般情况下,不定长参数是放在形参列表的最后,前面传入的实参与普通参数一 一对应,而后面剩余的实参会被封装成元组或字典传给不定长参数。
3、对于使用位置参数形式的不定长参数,Python也允许普通形参放在不定长参数后面,但此时要求在调用函数时必须使用关键字参数方式给不定长参数后面的形参传递实参。
4、对于有默认参数的形参,在调用函数时也可以不传入相应实参。
带不定长参数的函数的定义方法如下所示:
def 函数名(普通形参列表, 不定长参数名, 普通形参列表):
函数体
或
def 函数名(普通形参列表,** 不定长参数名):
函数体
注:“不定长参数名”表示这个不定长参数对应的是一组位置参数;而“ **不定长参数名”表示这个不定长参数对应的是一组关键字参数。
例:
def StudentInfo1(name,*args):
print('姓名:',name,',其他:',args)
def StudentInfo2(name,**args):
print('姓名:',name,',其他:',args)
def StudentInfo3(name,*args,country='中国')
print('姓名:',name,'国家:',country,',其他:',args)
StudentInfo1('小明','良好','中国')
StudentInfo2('小明',中文水平='良好',国家='中国')
StudentInfo3('小明',19,'良好')
StudentInfo3('大卫',19,'良好',country='美国')
拆分参数列表
1、如果一个函数所需要的参数已经存储在了列表、元组或字典中,则可以直接从列表、元组或字典中拆分出来函数所需要的这些参数。
2、列表、元组拆分出来的结果作为位置参数,而字典拆分出来的结果作为关键字参数。
例:不通过拆分方法传递参数示例
def SumVal(*args):#定义函数SumVal
sum=0
for i in args:
sum+=i
print('求和结果为:',sum)
ls=[3,5,2,7,1]
SumVal(ls[0],ls[1],ls[2],ls[3])
通过拆分方法传递参数示例
def SumVal(*args):#定义函数SumVal
sum=0
for i in args:
sum+=i
print('求和结果为:',sum)
ls=[3,5,2,7,1]
SumVal(*ls)
注:*ls的作用是把列表ls中的所有元素拆分出来作为SumVal的实参,,即等价与SumVal(3,5,2,7,1)
字典拆分结果作为函数关键字参数示例
def StudentInfo(name,chineselevel,country):#定义函数
StudentInfo
print('姓名:%s,中文水平:%s,国家:%s'%(name,chineselevel,country))
d={'country':'中国','chineselevel':'良好','name':'小明'}
StudentInfo(**d)
注:**d的作用是把字典d中的所有元素拆分出来作为StudentInfo的实参,即等价于StudentInfo(country=‘中国’,chineselevel=‘良好’,name=‘小明’)
返回值
1、在前面的很多例子中都是利用print函数将计算结果输出到屏幕上,但这些显示在屏幕上的结果没有办法在获取到以参与其他运算。
2、如果希望能够将一个函数的运算结果返回到调用函数的位置,以使得可以继续用该运算结果再去参与其他运算,此时则应使用return语句。
3、我们在前面写的函数中虽然都没有显示地写return语句,但实际上这些函数都有一个隐式的什么数据都不返回的return语句,即return None(或直接写为return)。
例:return语句使用示例
def CalCircleArea(r):#定义函数CalcCircleArea
return 3.14*r*r#通过return语句将计算得到的圆面积返回
def CalRectArea(a,b):#定义函数CalRectArea
return a*b#通过return语句将计算得到的长方形面积返回
r1,r2,d11,d12,d21,d22=10,1,4,5,6,5
C1=CalCircleArea(r1)#计算大圆的面积
C2=CalCircleArea(r2)#计算小圆的面积
S1=CalCircleArea(d11,d12)#计算第一个长方形面积
S2=CalCircleArea(d21,d22)#计算第二个长方形面积
A=C1-C2-S1-S2#大圆面积依次减去小圆和两个长方形面积,即得到零件面积
print('零件面积为:%.2f'%A)#将零件面积输出
通过return返回字符串、列表、元组等数据
def GetList():#定义函数GetList
return [1,2,3]#将包含3个元素的列表返回
def GetTuple():#定义函数GetTuple
return (1,2,3)#将包含3个元素的元组返回
def GetElements():#定义函数GetElements
return 1,2,3#返回3个数值数据,实际上会将这3个数据封装成一个元组返回
print(type(GetList())
print(GetList())
print(type(GetTuple()))
print(GetTuple())
print(type(GetElements()))
print(GetElements())