迭代器取值与索引取值的差异 模块简介 导入模块的两种句式 两种导入句式的优缺点 补充知识 循环导入问题 判断文件类型 模块的查找顺序
迭代器取值与索引取值的差异
# 索引取值
l1 = ['a', 'b', 'c', 'd', 'e']
print(l1[0]) #a
print(l1[1]) #b
print(l1[0]) #a
#优点可以反复获取任意数值
#缺点针对无序容器无法取值
# 迭代取值
res = l1.__iter__()
print(res.__next__()) #a
print(res.__next__()) #b
print(res.__next__()) #c
#优点是一种通用的取值方式
#缺点取值开始后只能往前不能往后取值
模块简介
什么是python模块
任何python程序都可以是模块 具有一系列功能打包好的python程序就是模块
模块的分类
- 内置模块
* python解释器自带 且可以直接实用的模块
e.g:
import time
time.sleep(3) - 自定义模块
* 自己写的模块 包括注册功能 登陆功能 e.g:注册功能 登陆功能 - 第三方模块
* 在网上查找别人做好的模块 e.g:图形识别 图形可视化 语音识别
模块的表现形式
- py文件(py文件也可以称之为是模块文件)
- 含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
- 已被编译为共享库或DLL的c或C++扩展(了解)
- 使用C编写并链接到python解释器的内置模块(了解)
导入模块的两种句式
注:真正的项目中 所有的py文件为英文 没有所谓的编号和中文
#方式一 import
import time
time.sleep()
#方式二 from...import...
from time import sleep
sleep()
两种导入句式的优缺点
import…
优点 通过导入模块可以使用到模块内所有名字且不会冲突 缺点 不能控制哪些功能不能被获取
from…import…
优点 能指名道姓地使用名字 且不需要加模块名作前缀
缺点 名字容易与当前全局名称空间中的名字产生冲突
补充知识
1.起别名
#在多个模块名字相同 或 模块名较复杂的情况下 可以通过 as 别名 的方式取一个别名
#再通过别名.的形式调用模块内的功能
import TimeMachineIndicator as TMI
TMI.XXXXX
2.导入多个名字
import time, sys, os
建议同一目录下的模块 或 功能相似的模块 采用统一导入不相似尽量分开导入
import time
import os
import sys
from md import money, read1, read2
上述导入方式是推荐使用的 因为多个名字出自于一个模块文件
3.全导入
需求:需要使用模块名称空间中很多名字 并且只能使用from...import句式
from md import * # *表示所有
ps:针对*号的导入还可以控制名字的数量
在模块文件中可以使用__all__ = [字符串的名字]控制*能够获取的名字
循环导入问题
# 以下为a.py的内容
import b
name = 'from a'
print(b.name)
# 以下为b.py的内容
import a
name = 'from b'
print(a.name)
#无论执行任何一个都会报错
#解决措施
name = 'from a'
import b
print(b.name)
# 以下为b.py的内容
name = 'from b'
import a
print(a.name)
#彼此在使用彼此名字前 先准备好
判断文件类型
所有py文件都含有一个内置的名字__name__
当py文件为执行文件时__name__为__main__
当py文件为被导入文件时__name__为文件名(模块名)
# __name__主要用于开发模块的作者测试自己的代码使用
if __name__ == '__main__':
只有文件是执行文件的时候才会执行if的子代码
ps:在pycharm中可以直接编写main按tab键即可自动补全
模块的查找顺序
先在内存中查找>>>再去内置中查找>>>在去环境变量中查找(sys.path)
所有的路径都是参照执行文件的位置
可以通过 sys.path.append() 的方式添加文件的绝对路径
可以通过 from … import … 获取相对路径下的模块 起始位置一定是执行文件所在的位置
先在内存中查找验证:
import md
import time
time.sleep(15)
print(md.money)
# 执行md文件后,会在内存空间里面存一份,哪怕在睡眠期间遭到删除(删除的是硬盘的数据),但还是可以执行出结果。若再执行就报错。
再去内置中查找验证:
如果自己有一个模块、文件与内置模块相同的文件名,会自动先调用内置模块:
import time
print(time.time())
from time import name
print(name)
所以创建模块时 不要与内置模块名重名产生冲突
在去环境变量中查找(sys.path)
一旦sys.path 第一个绝对路径找不到后面几乎也不会有。
所有的路径都是参照执行文件位置为准
想要导出不与执行文件一个路径下的文件只需将其添加(sys.path.append(r’模块路径) 进sys.path里即可导出。
或
绝对导入
利用from…import句式
起始位置一定是执行文件所在的路径
from xxx import mdd