系列文章目录
一、模块的概念
-
模块的概念:
在Python中,一个
.py
文件就是一个模块,模块是比类更高一级的封装。文件名就是模块的名字,模块里面包含了一些有特定功能的代码,一般是给其他程序使用的。就像是工具箱或一堆零件,要什么工具或零件从里面拿就是了。
-
模块的分类:
- 内置模块:python自带的模块,如time模块;
- 第三方模块:由其他大佬程序员写的,我们安装后就可以使用;
- 自定义模块:由我们自己写的模块,命名风格与变量的一致;
-
模块的三种形式:
- 使用python编写的
.py
文件。 - 被编译为共享库或DLL的C或C++扩展。(了解)
- 使用C语言编写并连接到python解释器的内置模块。(了解)
- 使用python编写的
-
模块的作用:
-
内置模块与第三方模块需要哪个就用哪个,拿过来就能用,不需要自己写,省时省力;
-
自定义模块需要自己写,通常将一些经常要用的代码写在模块中,在有需要的地方使用,提高了代码的重用率。
-
二、模块导入
在使用模块里面的东西前,需要先导入模块!
1. import
导入
-
用法:
-
使用import关键字,导入模块;
-
导入时因遵守内置、第三方、自定义的导入顺序,且应该用空行隔开;
-
一行可以导入多个,但尽量一行一个的导入;
-
使用时以
模块名.xxx
的形式调用;
import time, random, …… # 一行多个 import 第三方1 import 第三方2 import 自定义1 import 自定义2 time.time() # 返回时间戳
-
-
使用as关键字可以给模块起别名:
import numpy as np np.array()
-
import
导入模块时,python解释器执行的操作:-
创建一个该模块的命名空间;
-
执行该模块内的代码;
-
将执行过程中产生的名称放进,模块的命名空间;
-
在当前程序的命名空间中放入模块的名称,该名称指向模块的命名空间。
-
-
__name__
属性:这是每个python文件都有的属性,
- 当
foo.py
被执行时,__name__
的值为__main__
; - 当
foo.py
被当作模块导入时,__name__
的值为模块名foo
;
使用if判断,可以避免模块内不应该在导入时执行的代码被执行:
def foo(): pass def bar(): pass foo() # 被导入时,foo()会执行 if __name__ == '__main__': bar() # 被导入时,bar()不会执行
- 当
2. from...import...
导入
-
用法:
from...import...
的用法与import
基本相同,不同之处在于可以按照需要取出模块中的一部分。
假设我们只需要foo
模块下的bar
函数,不需要其他的,可以这样写:from foo import bar from time import * # 导入全部 bar() # 不需要加模块名前缀
from...import...
导入后,调用时不需要加模块名前缀;可以和as关键字连用。
可以使用
*
导入模块内的全部名称。
三、模块相关的补充
-
__all__
变量的作用:__all__
是一个列表,里面写入该模块内的名称,使用*
来导入的时候,其实就是导入列表中指出的所有名称。__all__ = ['foo', 'bar', 'baz']
一旦定义,则只能导入
__all__
中的名称! -
sys.path
的作用:sys.path
是一个列表,保存着一些文件夹路径,python搜索模块的时候,会按照顺序在这些文件夹里面找。手动添加路径,以便python查找:
sys.path.append(r'/user/python/foo.py')
-
模块搜索优先级:
- 先内存
- 后外存(按照
sys.path
中,存放的文件夹的顺序查找)
-
查看已导入的模块:
sys.modules
是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules
都将记录这些模块。sys.module
对加载模块起到了缓存作用。当某个模块第一次被导入时,sys.modules
将自动记录该模块。当第二次再导入时,python会直接到sys.modules
中查找,从而加快了程序运行的速度。
四、模块编写规范
我们编写的代码,不仅是给自己用,还有可能会被别人拿去用。因此,代码的可读性与可维护性十分重要,这就需要我们按照一定的规范去书写程序。
注意以下程序的写法和定义顺序:
#!/usr/bin/python # 指定解释器路径,通常只在unix环境有效
"""
模块的文档描述
"""
import sys 导入模块
x = 1 # 定义全局变量
class Foo:
"""类的文档说明"""
pass
def bar():
"""函数的文档说明"""
pass
if __name__ == '__main__':
bar()