使用函数可以极大方便地完成重复的任务。

定义函数

与其他编程语言一样,Python也能定义自己的函数,定义一个新的函数的格式如下:def [函数名]([参数]):

[函数内容...]

return [返回内容]

其中return可以忽略,则为不返回数据。

现在,我们可以创建一个用于计算一个数列平均数的函数。

def average(l):
sum = 0
for i in l:
sum += i
avg = sum / len(l)
return avg

第一行我们定义了函数的名字和需要输入的参数l(一个数列),第二行设置一个为0的统计变量用于计算数列的和。

再使用for循环求出数列的和,定义一个avg变量来存放平均数,等于和除数量(用到了len()函数获取数列元素的个数)。

最后使用return返回计算出的平均数。

此处为了展示将函数内容展开来写,实际情况中可以写的更加简单方便(return [表达式]):

def average(l):
return sum(l)/len(l)

这里直接用到了Python内置的sum()函数来求数列的和,与上面的函数是完全一致的。

函数的使用

要使用函数,只需要按照如下格式书写:[函数名]([参数])

例如使用上面定义的平均数函数计算一个平均数:

def average(l):
return sum(l)/len(l)
a = [2,5,9,13,15,26]
print(average(a))
运行返回11.666666666666666

其实,在这个例子里,我们还用到了print()函数,这是Python自带的函数,我们输入的average(a)就是它的参数。

参数

Python中函数的参数可以分为:必备参数

关键字参数

默认参数

不定长参数

必备参数

必备参数是使用函数时必须传入的参数,如果没有输入参数,则会出现错误。

定义一个必备参数只需要在定义函数时,写上变量名即可,例如上面我们定义的平均数函数中的l即是。

必备参数是指运行这个函数一定要有的输入,如计算平均数就一定要有一组数据才能计算。

当有多个必备参数时,需要按照顺序传入参数。

例如定义和使用一个计算两点坐标距离的函数:

def distance(x1,y1,x2,y2):
return ((x1-x2)**2+(y1-y2)**2)**0.5
print(distance(1,1,2,2))

运行返回1.4142135623730951

关键字参数

关键字参数是指传入参数时指定变量传入,使用[变量名]=[传入值]的格式,这样可以不用按照顺序输入,如使用上面的distance()函数就可以这样使用:

distance(y2=2,x1=1,y1=1,x2=2)

这样传入参数的效果与上面的例子中一致。

默认参数

默认参数可以理解为可选参数,即可以传入这个参数,也可以不传入,若不传入则使用默认值。

定义默认参数时需要按照[变量名]=[默认值]的格式定义,且所有默认参数都要写在必备参数后面。

例如我们现在在上面平均数函数的基础上,增加一个对返回值四舍五入的功能,需要定义一个变量来传入需要四舍五入的小数位数。

def average(l, r=False):
if r:
return round(sum(l)/len(l),r)
else:
return sum(l)/len(l)
a = [2,5,9,13,15,26]
print(average(a))
print(average(a,r=3))

运行返回11.666666666666666

11.667

在这里定义函数时,我们定义了一个r=False的变量来传入四舍五入的位数。

当我们在第9行调用函数而不给r传入参数时,r就会使用定义时候给的值False,那么就会返回没有四舍五入处理的结果。

而在第10行时,使用与关键字变量形式相同的格式,给r传入了参数3,那么if r:就会通过,从而返回四舍五入r位小数后的结果了。

由此可见,默认参数可以作为一些额外功能来使用,也可以为大多数情况定义一个默认值,当有额外情况出现时,再传入参数即可,大大简化了函数的使用。

不定长参数

不定长参数指的是可以输入无限个未声明的参数。

例如Python自带的print()函数的参数就是一个不定长参数。print()函数可以传入无限个参数,而且他们都会一个个显示出来。

print(2, 4.33, "hi", {"year":2020,"month":3})

返回2 4.33 hi {'year': 2020, 'month': 3}

定义不定长参数为*[变量名],加了星号的变量名会形成一个元组,存放所有未命名的变量参数,不定长变量要写在以上三种类型的变量之后,即最后。

以下是一个展示不定长参数性质的例子

def who_in_classroom(teacher,*student):
print("Teacher: " + teacher)
number = 1
for i in student:
print("NO." + str(number) + " student: " + i)
number += 1
print(who_in_classroom("Jame","Mike","Tony"))
print("-"*20)
print(who_in_classroom("Jame","Mike","Tony","Jack","Lily"))

运行返回:

Teacher: Jame
NO.1 student: Mike
NO.2 student: Tony
--------------------
Teacher: Jame
NO.1 student: Mike
NO.2 student: Tony
NO.3 student: Jack
NO.4 student: Lily

return 语句

return语句用于给函数返回值,运行到return语句并返回值后,函数就会结束运行。如同循环中的break,遇到则结束。

return可以返回多个表达式(见下面例子)

全局变量与局部变量

在函数内定义的变量为局部变量,在函数外定义的变量为全局变量。两者独立存在,即使变量名相同也不影响。

函数内的局部变量只能在函数里使用,如果想在函数外部获得则需要使用return返回。

同理要在函数内使用全局变量,需要通过函数参数的方式传入。

def func(a):
b = "我是局部变量"
return a,b
a = "我是全局变量"
b = "我也是全局变量"
print(a,b,func(a))

运行返回我是全局变量 我也是全局变量 ('我是全局变量', '我是局部变量')