Python高级:模块和包

  1.1模块

         如果你从Python解释器退出并再次进入,之前的定义(函数和变量)都会丢失。因此,如果你想编写一个稍长些的程序,最好使用文本编辑器为解释器准备输入并将该文件作为输入运行。这被称作编写 脚本 。随着程序变得越来越长,你或许会想把它拆分成几个文件,以方便维护。你亦或想在不同的程序中使用一个便捷的函数, 而不必把这个函数复制到每一个程序中去。

        为支持这些,Python有一种方法可以把定义放在一个文件里,并在脚本或解释器的交互式实例中使用它们。这样的文件被称作 模块 ;模块中的定义可以 导入 到其它模块或者  模块。模块是一个包含Python定义和语句的文件。 一个.py文件就是一个模块。

模块使用:

        模块可以包含可执行语句以及函数定义。语句用于初始化模块,只在模块第一次被导入时才执行

1.1.1最基本的模块调用

1.1.1.1使用三种方式调用外部文件

        代码如下:

import math                #导入math模块
from  math import sqrt   #从math模块中导入sqrt()函数
import math as shuxue      #导入math模块,并将此模块命名为shuxue

print("调用math.sqrt:\t", math.sqrt(3))           #调用math模块中的sqrt()函数     输出:调用math.sqrt:	 1.7320508075688772
print("直接调用sqrt:",sqrt(4))                      #直接调用sqrt()函数           输出:直接调用sqrt: 2.0
print("调用shuxue.sqrt:",shuxue.sqrt(5))          #等价于调用math模块中的sqrt函数    输出:调用shuxue.sqrt: 2.23606797749979

1.1.2“__name__”属性

        当一个程序第一次导入一个模块时,将会运行主程序。如果想在导入模块时不执行模块中的某一个程序块,可以使用“__name__”属性使该程序块仅在该某块自身运行时执行。

        在运行每一个Python程序时,通过对这个“__name__”属性值的判断,可以让作为导入模块和独立运行时的程序都可以运行。在Python程序中,如果程序作为一个模块导入,则其“__name__”属性设置为模块名。如果程序独立运行,则将其“__name__”属性设置为“__main__”。由此可见,可以通过属性“__name__”来判断程序的运行状态。

        案例文件 using_name.py具体代码如下。

if __name__ == '__main__':              #将“__name__”属性与“__main__”属性进行比较
    print("程序自生在运行")                #仅在该模块运行时执行
else:                                   #如果程序作为一个模块导入
    print("我来自另一个模块")               

1.1.3模块的搜索路径

        当一个名为 spam 的模块被导入的时候,解释器首先寻找具有该名称的内置模块。如果没有找到,然后解释器从 sys.path 变量给出的目录列表里寻找名为 spam.py 的文件。

        部分内置模块:             

                        os, operating system 操作系统

                        sys, system: 系统

                        random, 随机数

                        re, 正则表达式

                        math:和数字相关的

注意:在模块起名时,不要和Python解释器内部的昵称重复

1.2包

        包是一种通过用“带点号的模块名”来构造 Python 模块命名空间的方法。 例如,模块名 A.B 表示 A 包中名为 B 的子模块。

1.2.1表示包

        在Python程序中,包其实就是一个文件夹或者目录,但其中必须包含一个名为“__init__.py”(init的前后均有两条下划线)的文件。“__init__.py”可以是一个空文件,表示这个目录是一个包。另外,还可以使用包的嵌套用法,即在某个包中继续创建子包。

        在编程过程中,可以将包处于同一目录中的模块。当在Python程序中使用包时,需要首先使用目录名,然后再模块名导入所需要的模块。如果需要导入子包,则必须按照包的顺序(目录顺序)使用点运算符“.”进行分割,并使用import语句进行导入。

        在Python语言中,包是一种管理程序模块的形式,采用上面讲解的“.模块名”方式来表示。如果一个模块的名称为“A.B”,则表示这是A包中的一个子模块B。在使用包时,就像在使用模块时不用担心不同模块之间的全局变量相互影响一样。在使用“.模块名”这种形式时,无须担心不同库之间模块重名的问题。

        常见导入包的3种方法:

        如果package包的modele模块有函数ad(),并想调用它:

import package.module                       #导入后使用package.module.ad()调用
from package import module                  #导入后使用module.ad()调用
from package.module import ad               #导入后使用ad()调用     

        在Python程序中导入一个包时,Python会根据sys,path中的目录来寻找这个包中包含的子目录。当目录中包含名为“__init__.py”的文件时,才认为这是一个包,这样做的目的主要是避免一些滥用的名字(比如叫做String)影响搜索路径中的有效模块。

1.2.2创建并使用包

        在Python中创建最简单的方法就是在一个文件夹中放一个“__init__.py”文件。当然在这个文件中也可以可以包含一些初始代码或者为变量“__all__”赋值。

        在使用包时,开发者可以每次这导入一个包里面的特定模块,比如下面的代码:

imoort soud.effects.echo

        这样会导入子模块sound.efffects.echo,此时必须使用全名进行访问。

sound.effects.echofilter(input, output, delay=0.7, atten=4)

        除此之外,还有一种导入模块的方法,如下:

from sound.effects import echo

        双数方法同样会导入子模块echo,并且不需要那些冗长的前缀,所以也可以这样使用。

echo.echofilter(input, output, delay=0.7, atten=4)

        除此之外,还可以直接导入一个函数或者变量。

from sound.effects.echo import echofilter

        同样的道理,这种方法会导入模块echo,并且可以直接使用里面的echofilter()函数。

echofilter(input, output, delay=0.7, atten=4)

        注意:当使用“from package import item”这种形式时,对应的item既可以是包里面的子模块,也可以是包里面定义的其他名称,比如函数、类或变量。通常使用import语句,会首先把item当作一个包定义的名称。如果没有找到,就会抛出异常。如果形如“impot item.subitem.subsubitem”这种导入方式,除了最后外,都必须是包,而最后最后一项可以是模块或者包,但是不可以是类、函数或变量的名字。

上一篇:小红帽的回文数


下一篇:CF1254D