函数(一)

一、函数概述   Python语言中使用函数分为两个步骤:定义函数和调用函数。   例:函数定义和调用示例
1 def CalCircleArea(): #定义名字为CalCircleArea的函数
2   s=3.14*3*3 #计算半径为3的圆的面积
3   print('半径为3的圆的面积为:%.2f'%s) #将计算结果输出
4 CalCircleArea() #调用函数CalCircleArea

提示:Python语言中,开发者在程序中定义的变量名、函数名、类名等都是Python语言的自定义标识符,它们的命名规则完全相同。

二、形参与实参   1、形参的全称是形式参数,即定义函数时函数名后面的一对小括号中给出的参数列表。      形参只能在函数中使用,其作用是接收函数调用时传入的参数值(即后面要介绍的实参),并在函数中参与运算。   2、实参的全称是实际参数,即在调用函数时函数名后面的一对小括号中给出的参数列表。      当调用函数时,会将实参的值传递给对应的形参,函数中再利用形参做运算、得到结果。 提示:实参名和形参名不需要相同,在传递时根据位置一一对应。当有多个实参时,各实参之间用逗号分隔。   3、当实参传递给形参后,如果在函数体中对形参值做修改,则该修改并不会影响实参,即实参值不会改变。      但如果实参是列表等对象时,可在函数体中通过形参修改实参列表中对应元素的值。   例:形参值的修改对实参值的影响示例。
1 def ModifyVal(x,y): #ModifyVal函数定义
2     x=y #将y的值赋给形参x
3 def ModifyListElement(ls,idx,val): #ModifyListElement函数定义
4     ls[idx]=val #将ls中下标为idx的元素值赋为val
5 a,b=5,10 #a和b的值分别赋为5和10
6 print(a,b) #输出5和10
7 ModifyVal(a,10) #调用ModifyVal函数试图将a赋为10,但实际不会修改a的值
8 print(a,b) #仍输出5和10
9 c=[1,2,3] #c的值赋为[1,2,3]
10 print(c) #输出[1,2,3]
11 ModifyVal(c,[4,5,6]) #调用ModifyVal函数试图将c赋为[4,5,6],但实际不会修改
12 print(c) #仍输出[1,2,3]
13 ModifyListElement(c,1,5) #调用ModifyListElement函数将下标为1的元素赋为5
14 print(c) #输出[1,5,3]
三、默认参数和关键字参数   (1)、函数的默认参数就是缺省参数,即当调用函数时,如果没有为某些形参传递对应的实参,则这些形参会自动使用默认参数值。   例:带默认参数的函数的定义和调用方法示例。
1 def StudentInfo(name,country='中国'): #参数country的默认参数值为'中国’
2   print('姓名:%s,国家:%s'%(name,country))
3 StudentInfo('李晓明') #这里没有给country传实参值,但因为有默认参数所以不会出错
4 StudentInfo('大卫','美国') #给country传了实参,则不再使用默认参数
注意:name并没有默认参数,所以在调用函数时必须为其指定实参,否则运行程序会报错。 例如,当执行StudentInfo()时,系统会给出如下报错信息:TypeError: StudentInfo() missing 1 required positional argument: 'name'   (2)、关键字参数:在调用函数时,除了前面那种通过位置来体现实参和形参的对应关系的方法(即位置参数),还有一种使用关键字参数的方法,其形式为“形参=实参”。 例:关键字参数使用方法示例。
1 def StudentInfo(name, chineselevel='良好', country='中国'):
2   print('姓名:%s,中文水平:%s,国家:%s'%(name,chineselevel,country))
3 StudentInfo('李晓明')
4 StudentInfo('大卫', country='美国')
5 StudentInfo(country='美国', chineselevel='一般', name='约翰')
提示:位置参数和关键字参数可以混合使用,但位置参数必须在前、关键字参数在后,如第4行代码所示。如果将第4行代码改为:StudentInfo(name='大卫', '良好', '美国'),即第一个参数使用了关键字参数形式、后两个参数使用了位置参数形式,则系统会给出如下错误提示:SyntaxError: positional argument follows keyword argument 四、不定长参数   1、概述:不定长参数,即在调用函数时可以接收任意数量的实参,这些实参在传递给函数时会被封装成元组(位置参数)或字典(关键字参数)形式。一般情况下,不定长参数是放在形参列表的最后,前面传入的实参与普通形参一一对应,而后面剩余的实参会被封装成元组或字典后传给不定长参数。   2、语法格式:带不定长参数的函数定义方法如下所示:   def 函数名([普通形参列表,] *不定长参数名 [,普通形参列表]):   函数体   或   def 函数名([普通形参列表,] **不定长参数名):   函数体 提示:“*不定长参数名” 表示这个不定长参数对应的是一组位置参数;而 “**不定长参数名” 表示这个不定长参数对应的是一组关键字参数。   3、示例:
1 def StudentInfo1(name, *args): #定义函数StudentInfo1
2 print('姓名:', name, ',其他:', args)
3 def StudentInfo2(name, **args): #定义函数StudentInfo2
4 print('姓名:', name, ',其他:', args)
5 def StudentInfo3(name, *args, country='中国'): #定义函数StudentInfo3
6 print('姓名:', name, ',国家:', country, ',其他:', args)
7 StudentInfo1('李晓明', '良好', '中国')
8 StudentInfo2('李晓明', 中文水平='良好', 国家='中国')
9 StudentInfo3('李晓明', 19, '良好')
10 StudentInfo3('大卫', 19, '良好', country='美国')
  输出:姓名: 李晓明 ,其他: ('良好', '中国')   姓名: 李晓明 ,其他: {'中文水平': '良好', '国家': '中国'}   姓名: 李晓明 ,国家: 中国 ,其他: (19, '良好')   姓名: 大卫 ,国家: 美国 ,其他: (19, '良好')   注意:如果调用StudentInfo1和StudentInfo2这两个函数的形式改为:      StudentInfo1('李晓明', 中文水平='良好', 国家='中国’)      StudentInfo2('李晓明', '良好', '中国') 则运行程序时系统会给出报错信息。这是由于StudentInfo1的args只能接收一组位置参数,如果传入关键字参数就会出错;而StudentInfo2的args只能接收一组关键字参数,如果传入位置参数也会报错。 五、拆分参数列表   1、概述:如果一个函数所需要的参数已经存储在了列表、元组或字典中,则可以直接从列表、元组或字典中拆分出来函数所需要的这些参数。其中列表、元组拆分出来的结果作为位置参数,而字典拆分出来的结果作为关键字参数。   2、例:不通过拆分方法传递参数示例
1 def SumVal(*args): #定义函数SumVal
2     sum=0
3     for i in args:
4         sum+=i
5     print('求和结果为:',sum)
6 ls=[3,5.2,7,1]
7 SumVal(ls[0],ls[1],ls[2],ls[3])    
  例:通过拆分方法传递参数示例
1 def SumVal(*args): #定义函数SumVal
2     sum=0
3     for i in args:
4         sum+=i
5     print('求和结果为:',sum)
6 ls=[3,5.2,7,1]
7 SumVal(*ls)    
提示:*ls的作用是把列表ls中的所有元素拆分出来作为SumVal的实参,即等价于SumVal(3, 5.2, 7, 1)   例:字典拆分结果作为函数关键字参数示例
1 def StudentInfo(name, chineselevel, country): #定义函StudentInfo
2   print('姓名:%s,中文水平:%s,国家:%s'%(name,chineselevel,country))
3 d={'country': '中国', 'chineselevel':'良好', 'name':'李晓明'}
4 StudentInfo(**d)
提示:**d的作用是把字典d中的所有元素拆分出来作为StudentInfo的实参,即等价于StudentInfo(country='中国',chineselevel='良好', name='李晓明')。 六、返回值   1、概述:我们在前面的很多例子中都是利用print函数将计算结果输出到屏幕上,但这些显示在屏幕上的结果没有办法再获取到以参与其他运算。如果希望能够将一个函数的运算结果返回到调用函数的位置,以使得可以继续用该运算结果再去参与其他运算,此时则应使用return语句。我们在前面写的函数中虽然都没有显式地写return语句,但实际上这些函数都有一个隐式的什么数据都不返回的return语句,即return None(或直接写为return)。   2、例:通过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())
输出:通过return返回字符串、列表、元组等数据 <class 'list'> [1, 2, 3] <class 'tuple'> (1, 2, 3) <class 'tuple'> (1, 2, 3)          

上一篇:简单的JavaScript类封装实现类操作


下一篇:MATH2070/2970: