模块的简介
背景:
python语言
起源于Linux系统,调包侠(贬义>>>褒义)
1. 什么是模块?
模块:就是一系列功能的结合体(模块里面提前开发好的一堆功能而已)
2. 为什么要用模块?
提高开发效率(别人提前开发好的一些功能,我们直接拿来使用节省了我们自己的时间和精力)
# 站在巨人的肩膀上
3. 模块的来源:
1. 内置的(python解释器自带的直接用,eg:time)
2. 第三方的(别人写好的放在网上的,我们要想用,必须先下载才能用)
3. 自定义的(我们自己写的,以后也可以传到网上去)
4. 模块的存在形式:
# 总共有4种形式,但是,我只需要你知道2种就行
1. 我们自己写的单个py文件(一个py文件就是一个模块)
2. 包:
其实就一系列模块的结合体,其实就是文件夹
# 在python3中的包,一般里面会有一个__init__.py文件
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 # 连续导入
小结:
"""
from...import...句式
首次导入也会执行导入文件
导入多次,也会执行一次
发生了什么事?
1. 运行执行文件,产生执行文件的全局名称空间
2. 运行导入文件md.py, 产生md文件的全局名称空间,然后把md中所有的名字都丢到md的全局名称空间中去
3. 在执行文件中有一个变量money指向导入文件中money的空间地址
4. 我们要想使用导入文件的money,直接用money即可,不再使用md.money了,此时,只是把导入文件的money导入到了执行文件,其他都没有
导入文件之后,就有可能发生执行文件中的名字和导入文件中的名字产生冲突,此时,会使用当前执行文件中的名字
"""
导入模块的扩展用法
1. 起别名
起别名需用关键字as来定义
import testttttttttttttttttttttttttttttttttttttttttttttttttttt as t
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(testttttttttttttttttttttttttttttttttttttttttttttttttttt.name)
# print(t.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')
# index()
if __name__ == '__main__':
index()
循环导入
"""如果在你的程序里面出现了循环导入的问题,说明你的程序设计的不合理!"""
# 我们遇到循环导入的问题必须处理掉,否则代码会报错,不能正常运行
如何解决循环导入的问题
1. 把导入语句放到代码的最下面
# 虽然问题解决了,但是不推荐,我们一般把导入语句都放在文件的开头
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)