模块简介
1.什么是模块
模块就是以 .py 结尾的文件里面定义好功能的函数和对象看成一个结合体,当用户调用模块就相当于拥有了这个模块里面的所有功能。
2.模块的分类
内置模块:
解释器内自带的模块 可以直接调用 如:time、random
自定义模块:
自己写的模块可以自己定义功能 如:登陆功能、删除功能、修改功能
第三方模块:
别人写好的模块需要用这个功能时得提前从网上下载好 如:numpy、install
3.模块的表现形式
1.以.py文件结尾(py文件也可以称之为是模块文件)
2.含有多个py文件的文件夹(按照每个模块都功能不同划分不同的文件夹)
3.已被编译为共享库或DLL的C或C++扩展(了解)
4.使用C编写并链接到python解释器的内置模块(了解)
模块的导入句势
1.导入模块句式1:
import 模块名1,模块名2,模块名3.......
import time import time import time '''一个程序中重复导入同一个模块 导入语句只会执行一次'''
执行导入流程:
第一步:会产生执行文件的名称空间
第二步:产生被导入文件的名称空间并运行该文件内所有的代码 存储名字
第三步:在执行文件中会获取一个模块的名字 通过该名字点的方式就可以使用到被导入文件名称空间中的名字ps:在项目中所有的py文件名都得是英文,py文件被当做模块导入的时候不需要考虑后缀。
2.导入模块句式2:
from 模块名 import 成员1,成员2,成员3........
from time import sleep
执行导入流程:
第一步:创建执行文件的名称空间
第二步:创建被导入文件的名称空间
第三步:执行被导入文件中的代码 将产生的名字存储到被导入文件的名称空间中
第四步:在执行文件中获取到指定的名字 指向被导入文件的名称空间3.两种导入句式的优缺点
import:
优点:导入的模块可以调用到模块内的所有名字不会发生冲突
缺点:会导入模块内所有的名字但有时候不想让所有名字被使用
from 模块名 import 成员名:
优点:能指名道姓的导入指定的名字 调用时不需要加模块名前缀
缺点:名字容易发生冲突导致绑定关系被修改
4.导入句势小知识
1.用as起别名
在导入句势中可以通过as来给带入的模块文件名起一个自定义名字
import numpy as np '''将模块名简写,方便在代码中的调用''' from numpy import array as np_ar '''将numpy中的array名起一个别名 np_ar'''
2.导入多个名字
import time import numpy import torch '''导入多个功能不相似的模块, 相似模块可直接 import 模块名1,模块名2,模块名3 导入''' from torch import nn,optim '''从一个模块文件中导入多个名字'''
3.*全导入
当只能用from...import句式导入模块中所有名字时需要用*符号
from numpy import * '''表示将numpy内的所有名字都导入'''
ps:可以使用__all__=[字符串的名字]控制*能够获取的名字
循环导入
1.举例循环导入报错现象:
代码执行流程:
ps:因为还未定义就被调用发生报错所以只需要在调用前先定义就可以解决。
2.解决方式
ps:所以在循环导入前就要把所有名字提前定义好,这里要注意的点是会重复打印两次。
判断文件类型
1.__name__内置名:
在程序运行中有时候需要用到的文件会有很多,每个文件中自带__name__因此我们可以用__name__来进行判断。
当 __name__的结果是__main__时 py文件是执行文件
当 __name__的结果是模块名(文件名)时 py文件是导入文件
2.测试自己的代码:
if __name__ == '__main__': '''当被测试文件是执行文件时才会执行if当子代码''' '''此方法一般只出现在整个程序的启动文件中'''
小知识:在pycharm中写入main后按tab键会自动补全
模块的查找顺序
1.先在内存中查找
eg:导入一个文件过程中删除该文件后依然可以运行,但是再次重新运行时就会报错
import aa import time time.sleep(20) print(aa.n) ''' 当在运行时删除aa.py文件程序依旧打印,但是再次运行则报错 '''
2.再到内置中查找
eg:当定义了一个和内置模块名相同的文件名时,导入模块优先导内置模块的
'''先定义一个time.py文件 里面有一个time = '我是自定义的' ''' import time print(time.time()) '''打印结果依然是时间栓 1657711806.7256792 '''
ps:所以在创建模块文件的时候不要和内置模块名冲突
3.最后去sys.path中查找(程序系统环境变量)
eg:导入模块的时候一定要知道谁是执行文件, 执行文件默认只能找到导入同级的模块文件,如果要导入不同级的模块文件,需要添加模块文件的路径。
import sys sys.path.append(r'/Users/huyufeng/Desktop/每日总结/11') import a print(a.n) '''当导入某个模块时,Python会使用sys.path中指定目录, 按顺序搜索导入的模块。如果没有找到,则汇报模块找不到错误'''
迭代取值与索引取值的差异
1.迭代取值
优点:迭代取值可以对任意数据类型取值,不依赖于索引
缺点:迭代取值只能硬着头皮往前取,要是突然想重新取前面的数据值时却不行了
2.索引取值
优点:可以随意取值想取哪个位置的数据值就取哪个灵活性大
缺点:对无序的容器类型无法取值有局限性
ps:两种取值方式没有谁好谁差一分,各有利弊在编写程序时可以给予实际情况分析哪一种更适用于当下的情况。
流程图
步骤流程:先运行执行文件创建文件全局名称空间,import导入模块a,运行a.py文件创建a.py的全局名称空间,然后执行文件内的代码体,再返回b.py文件内的下面代码print(a.n),调用了模块a内的n名字对应的值。