系列文章目录


文章目录

  • 系列文章目录
  • 一、模块的概念
  • 二、模块导入
  • 1. `import`导入
  • 2. `from...import...`导入
  • 三、模块相关的补充
  • 四、模块编写规范


一、模块的概念

  • 模块的概念:
    在Python中,一个.py文件就是一个模块,模块是比类更高一级的封装。文件名就是模块的名字,模块里面包含了一些有特定功能的代码,一般是给其他程序使用的。

就像是工具箱或一堆零件,要什么工具或零件从里面拿就是了。

  • 模块的分类:
  • 内置模块:python自带的模块,如time模块;
  • 第三方模块:由其他大佬程序员写的,我们安装后就可以使用;
  • 自定义模块:由我们自己写的模块,命名风格与变量的一致;
  • 模块的三种形式:
  • 使用python编写的.py文件。
  • 被编译为共享库或DLL的C或C++扩展。(了解)
  • 使用C语言编写并连接到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解释器执行的操作:
  1. 创建一个该模块的命名空间;
  2. 执行该模块内的代码;
  3. 将执行过程中产生的名称放进,模块的命名空间;
  4. 在当前程序的命名空间中放入模块的名称,该名称指向模块的命名空间。
  • __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()