今日内容
索引取值与迭代取值的差异
1.索引取值
可以在任意位置任意次数取值
不支持无序类型数据取值
2.迭代取值
只能从前往后依次取值并且无法退后
支持所有类型数据取值(无序有序都可以)
模块
-
模块简介
1.模块的本质
内部具有一定功能代码的py文件
2.python模块的历史
python刚开始的时候所有其他语言程序员都看不起
还给python取了个调包侠的外号,随着时间的发展项目的复杂程度越来越高也使用了python,发现了真香定律
3.python模块的表现形式
1.py文件(也可以称之为模块文件)
2.含有多个py文件的文件夹(按照模块功能的不同划分为不同的文件夹储存)
3.已经被编译为共享库或DLL的c或C++
4.使用c编写并且链接到python解释器的内置模块
-
模块的分类
1.自定义模块
我们自己写的模块文件
2.内置模块
python解释器提供的模块
3.第三方模块
别人写的模块文件
-
导入模块的两种方式
1.import + 模块名
以import a为例研究底层原理
'''
1.先产生执行文件的名称空间
2.执行被导入的代码产生的名字放入被导入文件的名称空间
3.在执行文件的名称空间产生一个模块的名字
4.在执行文件中使用该模块名点的方式使用模块名称空间中所有的名字
'''
2.from + 模块名 + import + 函数名
以from a import name,func1为例
'''
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生对应名字绑定模块名称空间中对应的名字
4.在执行文件中直接使用名字就可以访问名称空间中对应的名字
'''
-
导入模块的补充说明
1.import + 模块名与from + 模块名 + import + 函数名 两者优缺点
import + 模块名
由于使用模块名称空间中的名字都需要模块名点的方式才可以使用 所以不会轻易的被执行文件中的名字替换掉 但是每次使用模块名称空间中的名字都必须使用模块名点才可以
from + 模块名 + import + 函数名
指名道姓的导入模块名称空间需要使用的名字 不需要模块名点
但是容易跟执行文件中的文件名冲突
2.重复导入模块
解释器指挥导入一次 后续重复导入的语句并不会执行
3.起别名
结构:
import 模块名 as 别名 # 关键字as
我们在导入模块时,有时模块名字很长,使用的时候很不方便,这时我们就可以使用别名,来简化模块名称
关键字as,然后在后面写 别名
使用时:在导入的模块后面写 as 别名
后续使用模块就可以用别名加上函数名了
别名.函数名()
4.涉入到多个模块导入
import a
import shanlin
如果模块功能相似度不高 推荐使用第一种 相似度高可以使用第二种
import a,shanling
-
模块查找顺序
1.先从内存中查找
2.在从内置模块当中查找
3.最后从sys.path中查找
'如果上述三个都没有找到会直接报错'
1.验证先从内存空间中查找
import md1
import time
time.sleep(15) # 睡眠15秒期间将md1文件删除
print(md1.name)
2.验证再从内置模块中查找
import time
print(time)
print(time.time())
"""强调:在创建py文件时候一定不要跟模块名(内置、第三方)冲突!!!"""
3.验证sys.path(类似于我们前面学习的环境变量)
import sys
print(sys.path) # 结果是一个列表 里面存放了很多路径
"""
当内存中和内置中都没有要查找的模块时 就会去下面的路径中挨个查找
['/Users/jiboyuan/PycharmProjects/day18',
'/Users/jiboyuan/PycharmProjects/day18',
'/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_display',
'/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip'
...
]
"""
# sys.path中虽然有很多路径 但是只需要重点关注第一个
# 第一个其实就是执行文件所在的路径
如何解决 # import mddd
方式1:主动添加sys.path路径(类似于添加环境变量)
import sys
sys.path.append(r'/Users/jiboyuan/PycharmProjects/day18/aaa')
import mddd
print(mddd.name)
"""
pycharm会自动将项目目录所在的路径添加到sys.path中
"""
方式2:利用from...import...句式指名道姓的查找
from aaa import mddd # 从文件夹aaa中导入mddd模块
print(mddd.name)
from aaa.bbb.ccc import mm # 通过点的方式进入下一层目录
print(mm.name)
# 查找模块的时候只需要站在执行文件所在的路径查看即可
循环导入问题
1.循环导入
两个文件之间彼此导入并且互相使用各自名称空间中的名字 容易报错
2.如何解决循环导入问题
确保名字在使用前就已经准备完毕
我们在编写代码的过程中尽量可能避免出现循环导入
判断文件类型
1.所有的py文件都可以直接打印__name__对应的值
2.当py文件是执行文件的时候__name__对应的值是__mein__
3.当py文件是被导入文件的时候__name__对应的值是模块名
if __name__ =='__mein__'
print('我是执行文件 我可以运行这里的子代码')
# 上述脚本可以用来区别所在py文件内python代码执行
# 使用场景:
1.模块开发阶段
2.项目启动文件
from a import * # *是默认将模块名称空间中所有名字导入
__all__ = ['名字1', '名字2'] # 针对*可以限制拿的名字
绝对导入和相对导入
'一定要分清楚谁是执行文件 模块的导入全部以执行文件为准'
绝对导入:
from 文件名...... 模块名 import 变量名(函数名)
# 可以精确到变量名
from 文件名...... import 模块名
# 也可以精确到模块名
'其实总结来说就是依靠着目录一层层往下查找'
相对导入:
.在路径中表示当前目录
..在路径中表示上一层目录
..\..在路径中表示上上一层目录
不在依据执行文件所在的sys.path 而是以模块自生路径为准
相对导入只能用于模块文件中 不能在执行文件中使用
'相对导入一般不使用 一般用绝对导入 结构更清晰'
包
说人话的意思就是说:多个py文件集合到的文件夹
专业点就是说:内部含有__init__.py文件的文件夹(python2必须要求python3无所谓)