模块的介绍
什么是模块
模块就是一系列功能的集合体
模块大致分为四个类别:
一个py文件就是一个模块,文件名叫test.py,模块名叫test
一个包含了_init_.py文件的文件夹称之为包,包也是模块
使用c编写并链接到python解释器的内置模块
已被编译为共享库或DLL的C或C++扩展
模块的三种来源:
自带的模块
第三方模块
自定义模块
为何要用模块
(自带的模块,第三方模块)->拿来注意,提升开发效率
自定义模块是为了解决代码冗余问题
如何用模块
模块都是用来被导入使用的,不是直接使用的
首次导入模块发生的事情
1.运行spam.py,创建一个模块的名称空间,将spam.py运行过程中产生的名字都丢到模块的名称空间中
2.在当前名称空间中得到一个名字,改名字指向模块的名称空间
后续的导入直接引用首次导入成功的,不会重复执行spam.py,不会重复创建名称空间
导入规范
通常情况下,所有的导入语句都应该写入文件的开头,然后分为三步:
第一部分,先导入内置的模块
第二部分,导入第三方
第三部分,导入自定义的
import的其他用法
import os,sys,re
import spam as sm #模块名换别名
print(sm.m)
import spam as a
print(a.h)
print(a.m)
m = 85
print(m)
首次导入模块发生的事情
1.运行spam.py,创建一个模块的名称空间,将spam.py运行过程中产生的名字都丢到模块的名称空间中
from spam import h
print(h)
2.在当前名称空间中得到一个名字,改名字指向模块的名称空间
后续的导入直接引用首次导入成功的,不会重复执行spam.py,不会重复创建名称空间
from spam import m
print(m)
from spam import read
read()
m = 2000
print(m)
其他用法
from spam import * # *号会把spam所有的变量名都导入到内存里面
read()
print(h)
print(m)
循环导入问题
在一个模块里面调用另外一个模块,最好是不要这样调用。如果非要这样调用,可以利用函数定义时只监测语法,不执行代码的特性。
把需要调用的模块用函数用改成函数的形式
案例:
m1模块代码
print("========m1.py")
def f1():
from m2 import y
print(y)
x = 1111
m2模块代码
print("========m2.py")
def f2():
from m1 import x
print(x)
y = 2222
import m1
m1.f1()
import m2
m2.f2()
模块的搜索路径和优先级
- 内存中已经导入好的
- 内置 #python自带的模块
- sys.path #sys.path是一个环境变量,环境级别的变量是只整个位置,内置的更外层空间。临时加文件路径,文件运行结束会释放
优先级:内存中已经导入好的—>内置—>sys.path
内置
import time, os
print(time) # <module ‘time’ (built-in)> time 就是一个内置文件
print(os) # <module ‘os’ from ‘D:\Python38\lib\os.py’> os是一个文件夹
import sys
print(sys.path) #导入一个出一个当前执行的文件夹的文件路径
环境变量以当前执行文件为准,当前文件夹默认加入sys.path里面
sys.path里面加文件,属于临时加文件,程序运行结束就直接还原了
设置sys.path文件路径案例
import a1 a1在同一个文件夹下直接调用就可以
a1.f1()
import aaa.a1 as m a1在同一个文件夹下的子文件夹aaa,aaa.a1代表路径分隔符的意思
m.f1()
import sys
sys.path.append(r"D:\pycharm文件\模块导入2") a2在不同的文件夹下面,且a2的文件上面还有另一个名称为a2的一个子文件夹,需要把路径添加到sys.path里面
print(sys.path)
import a2.a2 as m
m.f2()