索引取值与迭代取值的差异
* 索引取值:可以任意位置任意次数取值 不支持无序类型的数据取直
* 迭代取值:只能从前往后依次取值无法后退 支持所有类型的数据取直(无序有序)
模块简介
* 模块的本质:内部具有一定的功能(代码)的py文件
* python模块的表现形式
1py文件(py文件也可以称之为模块文件)
2含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
3已被编译为共享库或DLL的C或C++扩展
4使用C编写并链接到python解释器的内置模块
模块的分类
* 自定义模块:我们自己写的模块文件
* 内置模块:python解释器提供的模块
* 第三方模块:别人写的模块文件(python背后真正的大佬)
导入模块的两种句式
强调注意:
1.一定要搞清楚谁是执行文件 谁是被导入文件
2.以后开发项目的时候py文件的名称一般是纯英文
不会含有中文甚至空格
01 作业讲解.py 不会出现
test.py views.py 出现
3.导入模块文件不需要填写后缀名
1.import句式:以import a为例研究底层原理
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生一个模块的名字
4.在执行文件中使用该模块名点的方式使用模块名称空间中所有的名字
2.from...import...句式
以from a import name,func1为例研究底层原理
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生对应的名字绑定模块名称空间中对应的名字
4.在执行文件中直接使用名字就可以访问名称空间中对应的名字
模块导入补充说明
import与from...import...两者优缺点
import句式:由于使用模块名称空间中的名字都需要模块名点的方式才可以用,所以不会轻易的被执行文件中的名字替换掉
但是每次使用模块名称空间中的名字都必须使用模块名点才可以
from...import...句式:指名道姓的导入模块名称空间中需要使用的名字 不需要模块名点,但是容易跟执行文件中名字冲突
重复导入模块
解释器只会导入一次 后续重复的导入语句并不会执行
起别名
import huanyingguanglin as hy
from wuyongerciyuan import xiexieguanglin as xx
from a import name as n,func1 as f1
涉及到多个模块导入
import a
import wuyongerciyuan
如果模块功能相似度不高 推荐使用第一种 相似度高可以使用第二种
import a, wuyongerciyuan
循环导入问题
* 循环导入:两个文件之间彼此导入彼此并且相互使用各自名称空间中的名字 极易报错
* 如何解决循环导入问题
1.确保名字在使用之前就已经准备完毕
2.我们以后在编写代码的过程中应该尽可能避免出现循环导入
判断文件类型
所有的py文件都可以直接打印__name__对应的值
当py文件是执行文件的时候__name__对应的值是__main__
当py文件是被导入文件的时候__name__对应的值是模块名
if __name__ == '__main__':
print('哈哈哈 我是执行文件 我可以运行这里的子代码')
上述脚本可以用来区分所在py文件内python代码的执行
使用场景
1.模块开发阶段
2.项目启动文件
from a import * *默认是将模块名称空间中所有的名字导入
__all__ = ['名字1', '名字2'] 针对*可以限制拿的名字
模块的查找顺序
可以先去内存中查找
再去内置中查找
再去sys.path中查找(程序系统环境变量)
导入一个文件然后在导入过程中删除该文件 还是可以使用
import md
import time
time.sleep(15)
print(md.money)
在这个过程中让利用时间戳让电脑休息了15秒将py文件删除后还是可以运行并且不会报错 如果不利用时间戳则会报错
创建一个跟内置模块相同的文件名
import time
print(time.time())
from time import name
print(name)
这个过程中使用了与内置模块相同的名字导致报错
导入模块时要知道谁是执行文件
import sys
sys path.append(py文件路径)
import mdd
print(mdd.name)
要看清文件所在上一级的文件的路径 如果上一级还有一级那就要把路径写到目标文件那里
通用的方式:sys.append(目标文件所在的路径)
利用from...import句式 最开始的位置一定是执行文件所在的路径
from xxx import mdd
绝对导入与相对导入
绝对导入
from mymd.aaa.bbb.ccc.ddd import name
from mymd.aaa.bbb.ccc import ddd
套路就是按照项目根目录一层层往下查找
相对导入
.在路径中表示当前目录
..在路径中表示上一层目录
..\..在路径中表示上上一层目录
不在依据执行文件所在的sys.path 而是以模块自身路径为准
from . import b
相对导入只能用于模块文件中 不能在执行文件中使用
相对导入使用频率较低 一般用绝对导入即可 结构更加清晰


包
大白话:多个py文件的集合>>>:文件夹
专业:内部含有__init__.py文件的文件夹(python2必须要求 python3无所谓)
虽然python3对包的要求降低了 不需要__init__.py也可以识别 但是为了兼容性考虑最好还是加上__init__.py
1.如果只想用包中某几个模块 那么还是按照之前的导入方式即可
from aaa import md1, md2
2.如果直接导入包名
import aaa
导入包名其实就是导包下面的__init__.py文件,该文件内有什么名字就可以通过包名点什么名字