WithCoderWithCoderWithCoder

Python 模块

    在前面学习Python的基础语法时,我们编写的程序都是用 Python 解释器(shell )来进行编程的。如果从Python解释器 中退出再进入,我们之前定义的所有方法和变量都会丢失。这在其他语言中都会碰到相同的问题。因此,如果要编写较长的程序,最好是利用文本编辑器,将程序定义存放在文件中,然后将文件作为解释器的输入来运行,创建的文件就被称为模块。

    随着程序的不断完善,功能会越来越多,这时通常需要将其拆分成好多个文件,以便使程序的结构清晰、易于维护。除此之外,我们通常会在多个程序中使用(共享)已编写过的一些函数,而无需将其定义复制到每个程序中…。 为此,可以将定义放在一个文件中,并在解释器的交互模式下或者脚本中使用它,这样的文件被称为模块。

    一、Python 中的模块

    在Pytho中,模块是一个包含 Python 代码的 .py 文件。模块既可以被导入到 Python 的交互式解释器中,也可以被导入到其他模块中,除此之外,模块还可以作为独立的脚本来执行。

    导入模块的动作由 import 语句完成,通常(非必需)将所有的 import 语句放在一个模块(或脚本)的开头处,被导入的模块名被放置在导入模块的全局符号表中。

    一个模块可以包含可执行语句和函数定义,这些语句用于初始化模块,它们仅在 import 语句中第一次遇到模块名时执行(如果文件作为脚本执行,它们也会运行)。

    Python 本身提供了大量的标准模块(例如:math、os),完整的列表可以在 Python Module Index 中找到,这些文件位于 Python 安装位置的 Lib 目录中。

    注意:标准模块的导入方式与用户自定义模块的导入方式相同

    二、模块导入

    2.1 import 语句

        可以使用 import 语句导入一个模块,想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下:

import module1[, module2[,... moduleN]

        当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。

        2.1.1 单个模块导入

        模块被导入后,我们可以使用点(.)运算符来访问其中的名称(定义)。

        例如,我们编写了一个计算圆面积的 area.py 模块,在模块中访问标准模块 math:

import math

r = 2
print('面积为:', math.pi * r * r)

        其中,pi 是 math 的属性(在大多数编程语言中,都会提供同样的功能),也就是数学中的圆周率  π。执行脚本,输出结果如下:

面积为: 12.566370614359172

        2.1.2 根据上面的语法,如果要导入多个模块,可以在多个模块名之间用逗号(,)进行分隔,如:

import math,sys

        2.1.3 也可以使用多个 import 语句,如:

import math
import sys

        2.1.4 给模块设置别名

        我们也可以使用下面的语法,给模块设置别名,这种方式的可读性更好,但便于理解:

import ... as ...

        一旦模块名称过长,便可以在导入时进行重命名,帮助记忆。

        例如,将 math 重命名为 m:

import math as m

r = 2
print('面积为:', m.pi * r * r)

        以上代码,和2.1.1的输出结果一样。

        注意: 模块重命名后,原有的名字不会被识别,它是无效的。

    2.2 from ... import ... 语句

        可以从模块导入特定的名称,而无需导入整个模块。Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:

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

        例如,从 math 模块仅导入属性 pi:

from math import pi

r = 2
print('面积为:', pi * r * r)

        这时,要访问 pi,不需要使用点运算符。

        注意: 在这种情况下,由于只导入了 pi 而没有导入其他名称,所以无法访问 math 模块中的其他属性和方法。

    2.3 from ... import * 语句

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

from modname import *

        可以使用星号(*)从模块中导入所有的名称。

from math import *

r = 2
print('面积为:', pi * r * r)

        这样,math 模块中的所有定义都会被导入,这使得除了以下划线(_)开始的所有名字在范围内都是可见的。

        注意: 这种用法并不好,因为会引入一组未知的名称,而且有可能导致标识符的重复定义,可读性很差,所以不建议使用。

欢迎分享交流,转载请注明出处:WithCoder » Python 模块