Python—函数
一.引言
函数是一段具有特定功能的、可重用的语句组,用函数名来表示并通过函数名进行功能调用。
函数也可以看作是一段具有名字的子程序,可以在需要的地方调用执行,不需要在每个执行地方重复编写这些语句。将可能需要反复执行的代码封装为函数,不仅可以实现代码的复用,更重要的是可以保证代码的一致性,只需要修改该函数代码则所有调用均受到影响。
每次使用函数可以提供不同的参数作为输入,以实现对不同数据的处理;函数执行后,还可以反馈相应的处理结果。
二.定义
1.函数分类:
系统自带函数: Python内嵌的函数(如abs()、eval())、 Python标准库中的函数(如math库中的sqrt())等
自定义函数:用户自己编写的
2.使用函数目的:降低编程的难度,代码重用
3.函数定义:使用def语句
def <函数名>(<参数列表>):
'''注释''' #对函数的说明
<函数体>
return <返回值列表> #仅在需要返回结果时使用
4.函数组成
函数名:可以是任何有效的Python标识符
参数列表:是调用函数时传递给它的值(可以由多个,一个,或者零个参数组成,当有多个参数时,各个参数用逗号分隔)
参数个数大于等于零,多个参数由逗号分隔
函数体:函数被调用时执行的代码,由一个或多个语句组成
形式参数:定义函数时,函数名后面圆括号中的变量,简称“形参”。形参只在函数内部有效。
实际参数:调用函数时,函数名后面圆括号中的变量,简称 “实参”。
函数调用的一般形式:<函数名>([参数列表])
例:
函数功能:将传给它的数值增1,返回增加后的值
return语句:结束函数调用,并将结果返回给调用者
return语句是可选的,可出现在函数体的任意位置
没有return语句,函数在函数体结束位置将控制权返回给调用方
三.实例
例子1:编写一个程序打印“ Happy Birthday” 的歌词
标准的歌词:
Happy Birthday to you!
Happy Birthday to you!
Happy Birthday, dear <insert-name>
Happy Birthday to you!
方法1:使用四个print语句
给Mike唱生日快乐歌的程序代码:
方法2:使用函数来打印歌词的第一、二、四行
定义函数happy()
定义函数实现为Mike打印生日歌的歌词
例子2:写出给Mike和Lily唱生日歌的程序
给Lily唱生日歌的程序
例子3:简化程序,编写通用函数唱生日歌
person参数:此变量在函数被调用时初始化
sing()函数只需在函数调用的时候提供名字作为参数
如:sing(“Mike”)
综合例子:利用sing(),为Mike、 Lily和Elmer三个人唱生日歌。
关于注释:在定义函数时,开头部分的注释并不是必需的,但是如果为函数的定义加上这段注释的话,可以为用户提供友好的提示和使用帮助。
例如,把上述唱生日歌函数改写如下:
关于函数定义的说明:
函数形参不需要声明其类型,也不需要指定函数返回值类型;
即使该函数不需要接收任何参数,也必须保留一对空的圆括号;
括号后面的冒号必不可少;
函数体相对于def关键字必须保持一定的空格缩进。
例如,
编写函数,接收两个整数,并输出其中最大数。
这个程序并不是很好,如果输入的参数不支持比较运算,会出错。 可结合异常处理机制来解决。
例1:编写函数计算圆的面积。
形参与实参
函数定义时括弧内为形参(Parameters),一个函数可以没有形参,但是括弧必须要有,表示该函数不接受参数。
函数调用时向其传递实参(arguments),将实参的值或引用传递给形参。
在函数内直接修改形参的值不影响实参。
绝大多数情况下,在函数内部直接修改形参的值不会影响实参。
def addOne(a):
print(a)
a += 1
print(a)
如果传递给函数的是Python可变序列,并且在函数内部使用下标或其它方式为可变序列增加、删除元素或修改元素值时,修改后的结果是可以反映到函数之外的,即实参也得到了相应的修改。
>>> def modify(v): #修改列表元素值
v[0] = v[0]+1
>>> a = [2]
>>> modify(a)
>>> a
[3]
在Python中,函数参数有很多种:可以为普通参数、默认值参数、关键参数、可变长度参数等等。
Python函数的定义非常灵活,在定义函数时不需要指定形参的类型,也不需要指定函数的返回值类型,由函数中的return语句来决定;
如果函数中没有return语句或者没有执行到return语句而返回或者执行了不带任何值的return语句,则默认返回空值None。
函数编写如果有问题,只有在调用时才能被发现,传递某些参数时执行正确,而传递另一些类型的参数时则出现错误。
默认值参数
def 函数名(形参名=默认值,……)
函数体
默认值参数必须出现在函数参数列表的最右端,且任何一个默认值参数右边不能有非默认值参数。
调用带有默认值参数的函数时,可以不对默认值参数进行赋值,也可以赋值,具有较大的灵活性。
可以使用函数名.__defaults__查看默认参数的当前值
关键参数
关键参数主要指实参,即调用函数时的参数传递方式,与函数定义无关。
通过关键参数传递,实参顺序可以和形参顺序不一致,但不影响传递结果,避免了用户需要牢记位置参数顺序的麻烦。
可变长度的参数
可变长度参数主要有两种形式:*parameter和**parameter,前者用来接受多个实参并将其放在一个元组中,后者接受字典形式的实参。
案例,编写函数,接收任意多个实数,返回一个元组,其中第一个元素为所有参数的平均值,其他元素为所有参数中大于平均值的实数。
参数的序列解包
传递参数时,可以通过在实参序列前加星号将其解包,然后传递给多个单变量形参。
return语句
return语句用来从一个函数中返回,即跳出函数,同时可用return语句从函数中返回一个任意类型的值。
不论return语句出现在函数的什么位置,一旦执行将直接结束函数。
如果函数没有return语句或者执行了不返回任何值的return语句,Python将认为该函数以return None结束。
def fmax ( x, y ):
if x>y:
return x
else:
return y
在调用内置数据类型的方法时,一定要注意该方法有没有返回值。
变量的作用域
变量起作用的范围称为变量的作用域。 一个变量在函数外部定义和在函数内部定义,其作用域是不同的。
函数内部定义的变量一般为局部变量,不属于任何函数的变量一般为全局变量。
局部变量的引用比全局变量速度快。 globals(),locals()
局部变量与全局变量
在函数内定义的变量只在该函数内起作用,称为局部变量
函数结束时,其局部变量被自动删除。
如果想要在函数内部给一个定义在函数外的变量赋值,那么这个变量就不能是局部的,其作用域必须为全局的,
能够同时作用于函数内外,称为全局变量,可以通过global来定义。
全局变量
global定义全局变量:
a,一个变量已在函数外定义,如果在函数内需要为这个变量赋值,并要将这个赋值结果反映到函数外,可以在函数内用global声明这个变量,将其定义为全局变量。
b,在函数内部直接将一个变量声明为全局变量,在函数外没有声明,在调用这个函数之后,将增加为新的全局变量。