python基础day19 模块
模块的简介
python语言
起源于Linux系统,调包侠(贬义>>>褒义)
什么是模块
模块:就是一系列功能的结合体(模块里面提前开发好的一堆功能而已)
为什么要用模块
提高开发效率(别人提前开发好的一些功能,我们直接拿来使用节省了我们自己的时间和精力):站在巨人的肩膀上
模块的来源
1. 内置的(python解释器自带的,直接用,eg:time)
2. 第三方的(别人写好的放在网上的,我们要先用需要先下载)
3. 自定义的(我们自己写的,以后也可以上床到网上去)
模块的存在形式
ps:总共有4种形式,但是目前只需要知道2种即可
1. 我们自己写的单个py文件(一个py文件就是一个模板)
2. 包:
其实就是一系列模块的结合体,其实就是文件夹
在python3种的包,一般里面会有一个__iter__.py文件
ps:
以后在编写一些复杂项目的复杂功能的时候,我们可以先想想看有没有可以使用的模块,有就直接拿来用,没有就只能自己写了。
import句式
学习模块的导入必须先搞清的一个问题:谁是执行文件,谁是导入文件?
import md # import 模块名字(文件名),一定不要加文件的后缀,只写文件名字即可
首次导入文件,会执行导入文件的代码
导入文件不管你导入几次,都只执行一次
导入文件的过程发生了什么事?
1. 运行执行文件,产生执行文件的全局名称空间
2. 运行md.py文件,会产生md文件的全局名称空间,把md文件里的名字都丢到md的全局名称空间去
3. 再执行文件中有一个md的变量,指向导入文件的空间地址
4. 以后我们再执行文件中就可以用md来点出导入文件中的名字
导入文件之后,以后再导入文件中的名字,只需要使用md点语法的形式点出来就可以
不会与执行文件中的名字发生冲突,因为我们是指名道姓的取值。
# print(md.name) money = 999 # print(money) # print(md.money) # 指名道姓的取值 # def read1(): # print('read1') # md.read1() # read1() md.change() print(money)
from...import...句式
from md import money from md import read1 from md import change from md import money,read1,read2 # 连续导入
首次导入也会执行导入文件
导入多次,也只会执行一次
发生了什么事?
1. 运行执行文件,产生执行文件的全局名称空间
2. 运行导入文件md.py,产生md文件的全局名称空间,然后把md中所有的名字都丢到md的全局名称空间中去
3. 再执行文件中有一个变量money指向导入文件中money的空间地址
4. 我们想要使用导入文件的money,直接用money即可,不再使用md.money了,此时,只是把导入文件的money导入到了执行文件,其他都没有
导入文件之后,就有可能发生执行文件中的名字和导入文件中的名字产生冲突,此时,会使用当前执行文件中的名字
导入模块的扩展用法
# 1. 起别名 import testttttttttttttttttttttttttttttttttttttttttttttttttttt as t # print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name) # print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name) from testttttttttttttttttttttttttttttttttttttttttttttttttttt import name as n print(n) # 2. 连续导入 # import md # from md import money,read1,read2 # from md import money # from md import read1 import md, time, os, sys import md import time import sys import os # 3. 通用导入 # from md import money, read1, read2, change, # from md import * __all__=['money', 'read1']
判断文件的类型
学习模块的时候,必须要清楚执行文件和导入文件
区分执行文件和导入文件
__name__:'__main__' print(__name__) # 该文件只想让他做执行文件,不让被导入使用,怎么办? def index(): print('from index') if __name__=='__main__' index()
循环导入
如果在你的程序里面出现了循环导入的问题,说明你的程序设计的不合理
我们遇到循环导入的问题必须处理掉,否则代码会报错,不能正常运行
如何解决循环导入的问题
1. 把导入语句放到代码的最下面
ps:虽然问题解决了,但是不推荐这样用,我们一般把导入语句都放在文件的开头
2. 函数式
模块的查找顺序(重要)
1. 先从内存中查找
2. 再从内置模块中查找
3. 从环境变量sys.path中查找(重要)
4. 如果以上都找不到,直接报错
sys.path列表中的第一个元素永远是:当前文件所在的路径
sys.path列表中的第二个元素是:项目的路径,它是pycharm给加上的
如何解决自定义的模块查找不到的问题:
# 1. 把路径添加到sys.path中去 sys.path.append(r'D:\python26\day19\aaa') import m3 print(m3.name) # 2. from 模块1.模块2.模块3 import...句式 # from aaa.bbb import m3 from aaa.bbb.ddd import m3 print(m3.name)

浙公网安备 33010602011771号