今日总结
一、循环导入
二、判断文件类型
三、模块的查找顺序
四、绝对导入与相对导入
五、包
六、编程思想的演变
七、软件开发目录规范
一、循环导入
当两个文件彼此导入彼此时:
循环导入的时候很有可能会出现某个名字还没有被创建就被使用的情况,这样就会发生报错
如果需要循环导入,那么需要确定两个文件使用的名字都已经被'定义好'
方式一:将导入模块的句式写在定义名字的下方
方式二:将导入模块的句式写在函数体代码里面
二、判断文件类型
py文件分为两种:
1、执行文件
2、被导入文件
有一个内置变量__name__
当__name__所在的文件是执行文件时,运行结果为__mian__
当__name__所在的文件是被导入的文件时,运行结果为文件名
我们也可以借助__name__区分被导入的代码和测试代码
if __name__ == '__name__':
# 如果文件是执行文件,它就会执行它的子代码
我们也可以直接输入main之后按tab键执行


三、模块的查找顺序
1、先从内存空间查找
2、再从内置模块查找
3、最后去sys.path查找(类似于环境变量)
1、验证先从内存中寻找
import abab
import time
time.sleep(10) # 停留十秒
print(abab.name) # owen

2、从内置模块查找
import time
print(time)
print(time.time())

3、从sys.path查找(类似环境变量)
import sys
print(sys.path)
"""
sys.path中有很多路径 但我们只需要重点关注第一个,第一个就是执行文件所在的路径
查找模块的时候只需要站在执行文件所在的路径查看即可
"""
解决方法
方式1:主动添加sys.path路径(类似于添加环境变量)
import sys
sys.path.append(r'F:\PycharmProjects\pythonProject4')
import md
print(md.name)
方式2:利用from...import...句式指名道姓的查找
from md import 123 # 从文件夹md中导入123模块
print(123.name)
from aaa.bbb.ccc import 111 # 通过点的方式进入下一层目录
print(111.name)

四、绝对导入与相对导入
在导入模块的时候一切查找模块的句式都是以执行文件为准,无论导入的句式是在执行文件中还是在被导入文件中.
# 绝对导入
永远按照执行文件所在的路径一层层往下查找
# 相对导入
相当导入打破了必须参照执行文件的所在路径的要求 只需要考虑当前模块所在的路径然后使用特殊符号.去查找其他模块即可
from . import a
相对导入只能在被导入文件中使用 不能在执行文件中使用
"""
.表示当前路径
..表示上一层路径
../..表示上上一层路径
"""
'''如果想偷懒 ,那么就只使用绝对导入即可'''
五、包
# 专业角度
包的含义就是含有__init__.py的文件夹
# 实际角度
包就是多个模块的结合体(内部存放了多个模块文件)
娱乐功能
阿巴阿巴
学习视频
li老师视频
liu老师视频
# 在pycharm中甚至直接提供了创建包的选项
本质就是文件夹里面有一个__init__.py文件
"""
在导入包的时候,索要名字其实是跟包里面__init__.py要
1.如果想直接通过包的名字使用包里面所有的模块 那么需要在__init__.py中提前导入
2.也可以直接忽略__init__的存在使用绝对导入即可
上述方式的好处在于不需要考虑包的存在 直接当成普通文件夹即可
"""
六、编程思想演变
1、小白阶段
此阶段写代码就是在一个文件内不停地堆叠代码的行数
2、函数阶段
此阶段写代码将一些特定功能的代码封装到函数中供后续反复调用
3、模块阶段
此阶段不单单是将功能代码封装成函数,并且将相似的代码功能拆分到不同的py文件中便于后续的管理
# 就是越来越精准,越来越方便
七、软件开发目录规范
我们实际工作中编写的程序软件都是有很多文件夹和文件
1.bin文件夹
存放程序的启动文件——start.py
2.conf文件夹
存放程序的配置文件——settings.py
3.core文件夹
存放程序的核心业务——src.py
就是最为重要的代码 能够实现具体需求
4.lib文件夹
存放程序公共的功能——common.py
5.db文件夹
存放程序的数据——userinfo.txt
6.log文件夹
存放程序的日志记录——log.log
7.readme文本文件
存放程序的说明、广告等额外的信息
8.requirements.txt文本文件
存放程序需要使用的第三方模块及对应的版本
