要点概括:

Module-contents

1.模块

在使用 Python 解释器来编程时,如果从 Python 解释器退出再进入,那么之前定义的所有的方法和变量就都消失了。

Python 提供了一种方法,它可以把这些定义存放在文件中,为一些脚本或者交互式的解释器使用,这个文件被称为模块。

模块是一个包含所有定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。

这里有一个使用 Python 标准库中模块的例子,如下所示:

1
2
3
4
5
6
7
import sys

print('命令行参数如下:')
for i in sys.argv:
    print(i)

print('\n路径为:', sys.path)

命令行运行,如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ python test_20180715.py
参数1 参数2
命令行参数如下
test_20180715.py
参数1
参数2

路径为 ['F:\\Python_test\\BasicKnowledge', 'F:\\Python_test\
\venv\\Scripts\\python36.zip', 'G:\\Python\\DLLs', 'G:\\Python
\\lib', 'G:\\Python', 'F:\\Python_test\\venv', 'F:\\Python_tes
t\\venv\\lib\\site-packages', 'F:\\Python_test\\venv\\lib\\sit
e-packages\\setuptools-28.8.0-py3.6.egg', 'F:\\Python_test\\ve
nv\\lib\\site-packages\\pip-9.0.1-py3.6.egg']

说明:

  • import sys用于引入Python标准库中的sys.py模块,这是引入某一模块的方法。
  • sys.argv是一个包含命令行参数的列表。
  • sys.path包含了一个Python解释器自动查找所需模块的路径的列表。

2.import语句

语法格式如下:

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

当解释器遇到import语句时,如果模块在当前的搜索路径就会被导入。搜索路径是一个解释器会先进行搜索的所有目录的列表。

现在我们创建一个support.py文件,键入代码:

1
2
3
def fun(a):
    print('Hello:', a)
    return 

再创建一个test.py文件,键入如下代码:

1
2
3
import support  # 导入模块

support.fun('10')  # 调用模块里面的函数

运行test.py文件,输出结果如下:

1
Hello: 10

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

但是,当我们使用import语句的时候,Python 解释器是怎样找到对应的文件的呢?

这就涉及到 Python 的搜索路径,搜索路径是由一系列目录名组成的,Python 解释器就依次从这些目录中去寻找所引入的模块。

3.from…import语句

Python 的from语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:

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

首先新建fibo.py文件,键入如下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def fib(n):   # 定义到n的斐波那契数列
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a + b
    print()


def fib2(n):  # 返回到n的斐波那契数列
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a + b
    return result

再创建test.py文件,键入如下代码:

1
2
3
from fibo import fib,fib2

fib(100)

运行test.py文件,输出结果如下所示:

1
1 1 2 3 5 8 13 21 34 55 89 

注意:因为我们只使用了fib函数,所以导入的模块不会把所有内容全部导入到当前的命名空间,只会将fib函数引入进来。

4.from…import * 语句

把一个模块的所有内容全都导入到当前的命名空间也是可行的,语法格式如下:

1
from modname import *

这种声明不该被过多地使用。因为如果将一个模块的所有函数名导入当前命名空间中,假如不同模块包含了相同的函数名,或者是与自己编写得函数名相同,在调用的过程中将会导致混乱,而且在debug时还不容易发现。所以不推荐使用这种方法,它会引入其他来源的命名,很可能覆盖已有的定义。

5.__name__属性

一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。

新建using_name.py文件,键入如下代码:

1
2
3
4
if __name__ == '__main__':
    print('程序自身在运行')
else:
    print('来自另一模块')

运行该文件,输出结果如下:

1
程序自身在运行

然后创建test.py文件,键入如下代码:

1
import using_name

然后运行此文件,输出结果如下:

1
来自另一模块

可见,每个模块都有一个__name__属性,当其值是__main__时,表明该模块自身在运行,否则是被引入。