模块导入方式、循环导入问题、判断文件类型(__name__)、模块查找顺序
迭代取值与索引取值的差异
# 索引取值
l1 = [11, 22, 33, 44, 55]
print(l1[0])
print(l1[1])
print(l1[0])
'''
优势:可以随意反复的获取任意数据值
劣势:针对无序的容器类型无法取值
'''
# 迭代取值
l1 = [11, 22, 33, 44, 55]
res = l1.__iter__()
print(res.__next__())
print(res.__next__())
print(res.__next__())
'''
优势:提供了一种通用的取值方式
劣势:取值一旦开始只能往前不能回退
'''
模块
1.什么是模块
模块就是一系列功能的结合体 可以直接使用
使用模块就相当于拥有了这个结合体所有的功能
2.为什么要用模块?
极大地提升开发效率
3.模块的来源
3.1.内置模块
无需下载 解释器自带 直接导入使用即可
3.2.自定义模块
自己写的代码 分装成模块 自己用或者发布到网上
3.3.第三方模块
别人写的发布到网上 可以下载使用的模块
4.模块的四种表现形式
1.使用python代码编写的py文件
2.多个py文件组成的文件夹(按照模块功能的不同划分不同的文件夹)
3.已被编译为共享库或DLL的c或C++扩展
4.使用C编写并链接到python解释器的内置模块
模块的俩种导入方式
1.模块文件注意事项:
以后真正的项目中 所有的py文件名称都是英文;
学习模块的时候 模块文件的名称就得用英文;
py文件被当做模块导入的时候不需要考虑后缀
2.导入方式
方式一:import....句式
eg:import md
![](https://s2.loli.net/2022/07/13/XCJSnAjMD3x1OPf.png)
过程流程:
1.会产生执行文件的名称空间
2.产生被导入文件的名称空间并运行该文件内所有的代码 存储名字
3.在执行文件中会获取一个模块的名字 通过该名字点的方式就可以使用到被导入文件名称空间中的名字
小知识:
同一个程序反复导入相同的模块 导入语句只会执行一次
import md 有效
import md 无效
import md 无效
方式二:from....import....句式
from md import money (指名道姓的导入)
from md import money, read1
read1()
eg:from md import money, read1
![](https://s2.loli.net/2022/07/13/PhuvjVJrZwURq9m.png)
过程流程:
1.创建执行文件的名称空间
2.创建被导入文件的名称空间
3.执行被导入文件中的代码 将产生的名字存储到被导入文件的名称空间中
4.在执行文件中获取到指定的名字 指向被导入文件的名称空间
3.两种导入句式的优缺点
import md
优点:通过md点的方式可以使用到模块内所有的名字 并且不会冲突
缺点:md什么都可以点 有时候并不想让所有的名字都能被使用
from md import money, read1
优点:指名道姓的使用指定的名字 并且不需要加模块名前缀
缺点:名字及其容易产生冲突(绑定关系被修改)
导入模块句式的其他用法
1.起别名
情况1:多个模块文件名相同(多个人写)
from md import money as md_my
from md1 import money as md1_my
print(md_my)
print(md1_my)
情况2:原有的模块文件名复杂
import mdddddddddd as md
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__ = [字符串的名字]控制*能够获取的名字
循环导入问题
1.怎么理解循环导入
循环导入就是俩个py文件相互导入使用
2.容易出现的报错现象
使用彼此的名字可能是在没有准备好的情况下就使用了
![image-20220713164441276](https://s2.loli.net/2022/07/13/tXPy2mLlvnprAOz.png)
![](https://s2.loli.net/2022/07/13/hIPRxUOmT3HuiFv.png)
3.避免循环导入
循环导入要尽量避免出现,如果真的无法避免的话,那就在所有名字使用之前提前准备好
name = 'from a.py'
import b
print(b.name)
name = 'from b.py'
import a
print(a.name)
判断文件类型
1.简要
以后程序运行起来可能涉及到的不止一个文件,而针对不同文件是分不同类型的
2.关于__
name__
所有的py文件中都自带一个__
name__
内置名
当py文件是执行文件的时候 __
name__
的结果是__
main__
当py文件是被导入文件的时候__
name__
的结果是模块名(文件名)
3.__
name__
的用途
主要用于开发模块的作者测试自己的代码使用
if__name__ == __main__:
"开发者写入的代码" # 自己更改代码的时候不影响别人使用代码
当文件是执行文件的时候才会执行if的子代码
上述判断一般只出现整个程序的启动文件中
ps:在pycharm中可以直接编写main按tab键自动补全
模块查找顺序
1.查找顺序
内存---->内置---->sys.path(程序系统环境变量)
2.验证
# 1.导入一个文件 然后在导入过程中删除该文件 发现还可以使用
import md
import time
time.sleep(15)
print(md.money)
# 2.创建一个跟内置模块名相同的文件名
import time
print(time.time())
from time import name
print(name)
# ps:创建模块文件的时候尽量不要与内置模块名冲突
# 3.导入模块的时候一定要知道谁是执行文件
import sys
print(sys.path)
'''
所有的路径都是参照执行文件来的
内存和内置里都没有的时候,就会来这里找
['D:\\pythonProject\\homeworkCollection',
'D:\\pythonProject\\homeworkCollection',
'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_display',
'D:\\Python38\\python38.zip', 'D:\\Python38\\DLLs',
'D:\\Python38\\lib', 'D:\\Python38', 'D:\\Python38\\lib\\site-packages',
'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
'''
# 解决方案
import sys
# 将mdd的路劲添加到sys中
sys.path.append(r'D:\pythonProject\homeworkCollection\aaa')
import mdd
print(mdd.name)
3.通用的方式
sys.path.append(目标文件所在的路径)
4.利用from...import句式
起始位置一定是执行文件所在的路径 from xxx import mdd
ps:路劲的问题全部以执行文件为主