
3.6 Python的函数与模块
3.6.1 Python的函数
函数是用来封装特定功能的实体,可以对不同类型和结构的数据进行操作,以达到预定目标。比如数据类型转换函数str、float等就属于内置函数。当然,除了Python的内置函数与第三方库函数外,我们还可以自定义函数,从而完成指定任务。
1. 函数示例
例如,求一个列表对象均值的函数avg:
>def avg(x): > mean_x = sum(x)/len(x) > return(mean_x)
sum函数与len函数是Python内置函数,分别表示求和与长度。
运行完毕后,调用avg函数进行运算:
>avg([23,34,12,34,56,23]) 30
2. 函数参数
函数参数可以分为形式参数与实际参数。形式参数作用于函数的内部,不是一个实际存在的变量,当接收到一个具体值时(实际参数),将具体值传递到函数内部进行运算。例如对于上例中的函数avg,其形式参数为x(加粗部分)。
>def avg(<b>x</b>): > mean_x = sum(<b>x</b>)/len(<b>x</b>) > return(mean_x)
实际参数即具体值,通过形式参数传递到函数内部参与运算。上述例子中,实际参数为一个列表(加粗部分)。
>avg([<b>23,34,12,34,56,23</b>])
函数参数的传递有两种方式:按位置和按关键字。当函数的形式参数过多时,一般采用按关键字传递的方式,通过形式参数名=实际参数的方式传递参数,如下所示。函数age中的4个参数,我们可以通过指定名称的方式使用它们,也可按位置顺序进行匹配:
>def age(a,b,c,d): > print (a) > print (b) > print (c) > print (d) > >age(a = 'young',b = 'teenager',c = 'median',d = 'old') #按关键字指定名称 young teenager median old >age('young','teenager','median','old') #按位置顺序匹配 young teenager median old
在函数参数中,我们也可以指定形式参数的默认值。此时,该参数称为可选参数,表示使用时可以不定义实际参数。例如,函数f中有两个参数,其中参数L指定了默认值None:
>def f(a, L=None): if L is None: L = [] L.append(a) return L
使用该函数时,只需指定参数a的值。该函数返回一个列表对象,若不给定初始列表L,则创建一个列表,再将a加入列表:
>f(3) [3]
3. 匿名函数lambda
Python提供了匿名函数lambda,其简化了自定义函数定义的书写形式,使得代码更为简洁。例如通过lambda函数定义函数g:
>g = lambda x:x+1 >g(1) 2
该函数相当于如下自定义函数:
>def g(x): > return(x+1) >g(1) 2
3.6.2 Python的模块
为了编写可维护的代码,我们可以把很多函数分组放到不同的文件里。这样,每个文件包含的代码相对较少。很多编程语言采用这种组织代码的方式。在Python中,一个py文件称为一个模块。其内容形式是文本,可以在IDE或者常用的文本编辑器中编辑。
下面介绍一下自定义模块。
使用文本编辑器创建一个mod.py文件,其中包含一个函数,如下所示:
# module def mean(x): return(sum(x)/len(x))
使用自定义模块时,将mod.py文件放置在工作目录下,通过“import文件名”命令载入,如下所示:
>import mod
在使用该模块中的函数时,需要加入模块名信息,如下所示:
>mod.mean([1,2,3]) 2
载入模块还有很多方式,如下所示(注意别名的使用):
>import mod as m # as后表示别名 >m.mean([1,2,3]) 2 >from mod import mean >mean([1,2,3]) 2 >from mod import * >mean([1,2,3]) 2
import命令还可以用于载入已经下载好的第三方库,使用方式与上面所展示的一致。例如,载入numpy模块:
>import numpy as np
此时,我们就可以使用numpy模块中的函数,例如基本统计函数:
>x = [1,2,3,4,5] >np.mean(x) #均值 3.0 >np.max(x) #最大值 5 >np.min(x) #最小值 1 >np.std(x) #标准差 1.41421356237 >np.median(x) #中位数 3.0