Python金融数据挖掘与分析实战
上QQ阅读APP看书,第一时间看更新

2.7 Python模块

Python模块(module)是一个Python文件,以.py结尾,包含Python对象定义和Python语句。模块能够让Python代码段更具逻辑性,把相关的代码分配到一个模块里能让代码更好用、更易懂。模块能定义函数、类和变量,也能包含可执行的代码。下例是一个简单的模块:support.py。


def print_func( par ): 
    print ("Hello : ", par )
    return

1.import函数

模块定义好后,我们可以使用import语句引入模块,语法如下:


import module1[,module2[,…,moduleN]]

比如要引用模块math,就可以在文件最开始的地方用import math来引入。在调用math模块中的函数时,必须使用如下格式:


模块名, 函数名

在导入时,解释器会先按照搜索路径搜索所有目录的列表,如想要导入模块support.py,需要把命令放在脚本的顶端:


# 导入模块 
import support 
# 现在可以调用模块里包含的函数了 
support.print_func("Runoob")

输出结果为:


Hello: Runoob

不管你执行了多少次import语句,一个模块只会被导入一次,这样可以防止导入模块被一遍又一遍地执行。

2.from...import语句

Python的from语句可以将模块中某个指定的部分导入当前命名空间中。语法格式如下:


from modname import name1[, name2[, ... ,nameN]]

例如,要导入模块fib的fibonacci函数,使用如下语句:


from fib import fibonacci

这个声明不会把整个fib模块导入当前的命名空间中,而是只会将fib的fibonacci函数单独导入执行这个声明的模块的全局符号表。

3.from...import*语句

把一个模块的所有内容全都导入当前的命名空间也是可行的,只需使用如下声明:


from modname import *

例如我们想一次性引入math模块中所有的东西,语句如下:


from math import *

虽然该声明能够导入一个模块中的所有项目,但是它不该被过多地使用。

4.dir()函数

dir()函数是一个排好序的字符串列表,内容是一个模块里定义的所有模块、变量和函数。一个简单的实例如下:


# 导入内置math模块
import math
content = dir(math)
print (content;)

输出结果为:


[ '__doc__', '__file__', '__name__' , 'acos' , 'asin' , 'atan','atan2', 'ceil', 
    'cos', 'cosh', 'degrees', 'e', 'exp','fabs', 'floor', 'fmod', 'frexp', 'hypot', 
    'ldexp', 'log','log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 
    'tan', 'tanh' ]

在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块导入的文件名。

5.globals()和locals()函数

根据调用位置的不同,globals()和locals()函数可用于返回全局和局部命名空间中的名字。如果在函数内部调用locals(),返回的是所有能在该函数内访问的局部命名;如果在函数内部调用globals(),返回的是所有能在该函数内访问的全局名字。两个函数的返回类型都是字典,所以名字能用keys()函数获取。

6.reload()函数

当一个模块被导入一个脚本,模块顶层部分的代码只会被执行一次。因此,如果想重新执行模块中顶层部分的代码,可以用reload()函数。该函数会重新导入之前已导入的模块。语法如下:


reload(module_name)

在这里,module_name表示模块的名字,而不是一个字符串形式。比如想重新导入hello模块,语句如下:


reload(hello)

7.Python中的包

包是一个分层次的文件目录结构,它定义了一个由模块、子包和子包下的子包等组成的Python的应用环境。简单来说,包就是文件夹,但该文件夹下必须存在__init__.py文件,该文件的内容可以为空。__init__.py用于标识当前文件夹是一个包。考虑一个在package_runoob目录下的runoob1.py、runoob2.py、__init__.py文件,test.py为测试调用包的代码,目录结构如下:


test.py
package_runoob
|----__init__.py
|----runoob1.py
|----runoob2.py

源代码如下:


def runoob1(): 
    print ("I'm in runoob1")
def runoob2(): 
    print ("I'm in runoob2")

现在,在package_runoob目录下创建__init__.py:


if __name__ == '__main__': 
    print ('作为主程序运行')
else: 
    print ('package_runoob 初始化')

然后在package_runoob同级目录下创建test.py来调用package_runoob包。


# 导入Phone包 
from package_runoob.runoob1 import runoob1 
from package_runoob.runoob2 import runoob2 
runoob1() 
runoob2()

输出结果为:


package_runoob 初始化
I'm in runoob1
I'm in runoob2

为了举例,这里只在每个文件里放置了一个函数,在实际应用中,可以放置多个函数,也可以在这些文件中定义Python的类,然后为这些类建一个包。