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”这种导入方式,除了最后外,都必须是包,而最后最后一项可以是模块或者包,但是不可以是类、函数或变量的名字。