金融商业数据分析:基于Python和SAS
上QQ阅读APP看书,第一时间看更新

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