模块(二)
模块(二)
循环导入问题
# 加入a.py中导入了b.py,b.py中也导入了a.py,运行起来会怎样?
'''
可能会报错,因为当a执行到import语句时,b也会被执行,这时如果b中调用了a空间中的名字,这时a还没执行到创建该名字,所以b就会出现找不到该名字的错误
'''
# 解决方法
'''
思路:确保名字在被调用前已创建
方式1:将导入模块的句式写在定义名字的下面
方式2:将导入模块的句式写在函数体代码里
(一错再错的不就办法,平时要尽量避免出现循环导入问题)
'''
判断文件类型
# py文件可以被分成两类
1. 执行文件
2.被导入文件
# 如何判断一个文件是执行文件还是被导入文件?
1. 土方法(鄙人自己总结的,不一定适用多有文件)
右键运行的是执行文件
import后面跟的是被导入文件
2. 通过__name__判断
当__name__所在的文件是执行文件的时候 结果是__main__
当__name__所在的文件是被导入文件时候 结果是文件名(模块名)
'''
可以借助__name__却分被导入代码和执行代码
if __name__ == '__main__':
当前文件是执行文件的时候才会执行的代码
由于此方法在很多启动脚本中经常使用,故有简写方式
直接输入main后按tab间即可自动生成上述判断语句
'''
模块的查找顺序
"""
1.先从内存空间中查找
2.再从内置模块中查找
3.最后去sys.path查找(类似于我们前面学习的环境变量)
如果上述三个地方都找不到 那么直接报错!!!
"""
# 1.验证先从内存空间中查找
# import md1
# import time
# time.sleep(15) # 睡眠期间将md1文件删除
# print(md1.name)
'''代码不会报错,此时内存中还存有md1的信息'''
# 2.验证再从内置模块中查找
# import time
# print(time)
# print(time.time())
# >>><module 'time' (built-in)> # built-in:内置
# >>>1648195688.939101
"""强调:在创建py文件时候一定不要跟模块名(内置、第三方)冲突!!!"""
# 3.验证sys.path(类似于我们前面学习的环境变量)
eg:
import sys
print(sys.path)
运行结果:
['E:\\python项目\\课前预习草稿',
'E:\\python项目\\课前预习草稿',
'D:\\PyCharm 2021.2.3\\plugins\\python\\helpers\\pycharm_display', 'E:\\python项目\\课前预习草稿\\venv\\Scripts\\python36.zip',
'E:\\python36\\DLLs',
'E:\\python36\\lib',
'E:\\python36',
'E:\\python项目\\课前预习草稿\\venv',
'E:\\python项目\\课前预习草稿\\venv\\lib\\site-packages',
'D:\\PyCharm 2021.2.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
# 这些就是我们py文件执行时的path,调用的文件只能时这些目录里的,如果不是这些目录里的,直接调用会报错
# sys.path有很多路径,重点只需要关注第一个,第一个是执行文件所在路径,在查找模块时,我们需要站在执行文件所在位置去查看
# 加入我们的被导入文件不在sys.path包含的路径中,怎么办?
# 方式一:把被导入文件路径添加到sys.path中(类似于添加环境变量)
# import sys
# sys.path.append(需要导入文件的绝对路径)
'''pycharm会自动将项目目录所在路径添加到sys.path'''
# 方式二:使用from...import...句式直接导入
# from package1 import mk1 # 从文件夹package1中找到mk1导入
# from package1.p1 import mk2 # 从文件夹package1中的文件夹p1中找到mk2导入,通过点的方式进入下一层目录
绝对导入和相对导入
1.在导入模块的时候一切查找模块的句式都是以执行文件为准
无论导入的句式是在执行文件中还是在被导入文件中!!!
# 绝对导入
永远按照执行文件所在的路径一层层往下查找(无脑查找即可)
# 相对导入
相当导入打破了必须参照执行文件的所在路径的要求 只需要考虑当前模块所在的路径然后使用特殊符号.去查找其他模块即可
from . import a
相对导入只能在被导入文件中使用 不能在执行文件中使用
"""
预备知识
.表示当前路径
..表示上一层路径
../..表示上上一层路径
"""
'''以后如果想一劳永逸 那么就只使用绝对导入即可'''
包
# 什么是包?
存放了多个模块文件的文件夹
# 包有什么特征?
内部含有__init__.py文件
# 为什么要有包?
包可以帮助我们管理文件,后面项目越来越大,里面用到的模块文件越来越多,可以把功能相似的文件放到一个包里,方便查找和管理
# 在pycharm中甚至直接提供了创建包的选项
本质就是文件夹里面有一个__init__.py文件
"""
在导入包的时候 索要名字其实是跟包里面的__init__.py要
1.如果想直接通过包的名字使用包里面所有的模块 那么需要在__init__.py中提前导入
上述方式的好处在于__init__可以提前帮你准备好可以使用的名字
2.也可以直接忽略__init__的存在使用绝对导入即可
上述方式的好处在于不需要考虑包的存在 直接当成普通文件夹即可
"""
编程思想的演变
1. 小白阶段
此阶段写代码就是莽,一个文件内不停的往下写
2. 函数阶段
此阶段我们可以通过函数将一些功能进行简单封装,在需要用到的地方可以反复调用
3. 模块阶段
此阶段将功能相似的带差分到不同的py文件中,需要的时候直接调包就可以了
'''
演变规律:越来越简单,越来越清晰,越来越便捷
'''
软件开发目录规范
# 为了更好地管理我们的文件,通常我们会将文件按弄能分存到不同的文件夹,有些特定的文件夹存放特定功能的文件,这个需要牢记
1. bin文件夹
存放启动文件
2. conf文件夹
存放配置文件
3. core文件夹
存放核心业务代码文件
4. lib文件夹
存放公共的功能
5. db文件夹
存放数据相关文件
6. log文件夹
存放日志文件
7. readme文本文件
这个是程序的说明书
8. requirements文本文件
存放程序需要使用的第三方模块及其对应版本
'''
ps:目录的名字可以不一致 但是主要的思想是一致的
就是为了便于管理 解耦合...
拿到启动文件之后直接运行即可 无需考虑程序内部的复杂程度 便于管理
'''
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构