绝对导入与相对导入
绝对导入
# 其实就是以执行文件所在的sys.path为起始路径,往下一层层查找
from ccc import b
from ccc.ddd.eee import b
"""
1. 由于pycharm会自动将项目根目录添加到sys.path中所以查找模块肯定不报错的方法就是从根目录往下一层层找
2. 如果不是用pycharm,则需要将项目根目录添加到sys.path(针对项目根目录的绝对目录有模块可以帮我们获取>>>:os模块)
"""
相对导入
# 储备知识
'''
. 在路径中的意思是当前路径
.. 在路径中意思是上一层路径
../.. 在路径中意思是上上一层路径
'''
# 相对导入可以不参考执行文件所在的路径,直接以当前模块文件路径为准
1.只能在模块文件中使用,不能在执行文件中使用
2.相对导入在项目比较复杂的情况下,可能会出错
'相对导入尽量少用,推荐使用绝对导入'
包的概念
如何理解包
1.专业的角度:内部含有__init__.py的文件夹
2.直观的角度:就是一个文件夹
包的作用
内部存放多个py文件(模块文件),仅仅是为了更加方便的管理模块文件
具体使用
import 包名
# 导入包名其实导入的是里面的__init__.py文件,该文件里面有什么你才能用什么
#其实也可以跨过__init__.py直接导入包里面的模块文件
"""
针对python3解释器,其实文件夹里面有没有__init__.py已经无所谓了,都是包
但是针对python2解释器,文件夹下面必须要有__init__.py才能被当作包
"""
编程思想的演变
1.小白阶段
按照需求从上往下堆叠代码(面条版) 单文件
2.函数阶段
将代码按照功能的不同封装成不同的函数 单文件
3.模块阶段
根据功能的不同拆分不同的模块文件 多文件
"""
1. 小白阶段相当于将所有的文件全部存储在c盘并且不分类
2. 函数阶段相当于将所有的文件在c盘下分类存储
3. 模块阶段相当于将所有的文件按照功能的不同将文件分类存储到不同的盘中
目的:为了更加方便快捷高效的管理资源
"""
软件开发目录规范
文件类别 |
功能 |
文件名 |
bin文件夹 |
存储程序启动文件 |
start.py |
conf文件夹 |
存储程序的配置文件 |
setting.py |
core文件夹 |
存储程序的核心逻辑 |
src.py |
lib文件夹 |
存储程序的公共功能 |
common.py |
db文件夹 |
存储程序的数据文件 |
userinfo.txt |
log文件夹 |
存储程序的日志文件 |
log.log |
interface文件夹 |
存储程序的接口文件 |
user.py,order.py,goods.py |
readme文件 |
编写说明文档 |
|
requirements.txt文件 |
存储程序所需版本和第三方模块名 |
|
"""
我们在编写程序的时候,可以不完全遵循上面的文件名
start.py可以放在bin文件夹下也可以直接放在项目根目录
db文件夹等我们学到真正的项目会被数据库软件替代
log文件夹等我们学到真正的项目会被专门的日志服务替代
"""
常见内置模块collections
namedtuple(具名元组)
# namedtuple:可以生成名字来访问元素的内容
from collections import namedtuple
Point = namedtuple('三维坐标',['x','y','z']) # 第二个参数中的x,y,z可以通过点的形式访问
position1 = Point(100,200,144)
position2 = Point(120,180,124)
position3 = Point(130,190,104)
print(position1,position2,position3)
# 三维坐标(x=100, y=200, z=144) 三维坐标(x=120, y=180, z=124) 三维坐标(x=130, y=190, z=104)
print(position1.x) # 100
p = namedtuple('扑克牌','花色 点数')
res1 = p('♥️','K')
res2 = p('♠️️','K')
res3 = p('♣️️','K')
print(res1,res2,res3)
# 扑克牌(花色='♥️', 点数='K') 扑克牌(花色='♠️️', 点数='K') 扑克牌(花色='♣️️', 点数='K')
deque(双端队列)
# 双端队列
# 双向添加或删除元素,提高效率
from collections import deque
q = deque()
q.append(11)
q.append(22)
q.appendleft(66)
print(q,type(q)) # deque([66, 11, 22]) <class 'collections.deque'>
OrderedDict(有序字典)
# OrderedDict的key会按照插入的顺序排列,不是key本身排序
from collections import OrderedDict
d = dict([('a',100),('b',1111),('c',2000)])
print(d) # 在pycharm中看起来好像位置是固定的,其实3.x解释器的优化,在2.xpython解释器就没有这个优化
od = OrderedDict(d)
print(od)
defaultDict(默认值字典)
"""
如集合[11,22,33,44,55,66,77,88,99]
将所有大与66的值保存至字典的第一个key中,将小于66的值保存到第二个key中
"""
# 正常写法
s1 = [11,22,33,44,55,66,77,88,99]
s_left = []
s_right = []
for i in s1:
if i <=66:
s_left.append(i)
else:
s_right.append(i)
d1 = {'k1':s_left,'k2':s_right}
print(d1) # {'k1': [11, 22, 33, 44, 55, 66], 'k2': [77, 88, 99]}
# 用collections模块
from collections import defaultdict
res = defaultdict(k1=s_left,k2=s_right)
print(res) # defaultdict(None, {'k1': [11, 22, 33, 44, 55, 66], 'k2': [77, 88, 99]})
Counter(计数器)
# 正常写法
res = 'abcdeabcdabcaba'
new_dict = {}
for i in res:
if i not in new_dict:
new_dict[i] = 1
else:
new_dict[i] += 1
print(new_dict)
# 用collections模块
from collections import Counter
res1 = Counter(res)
print(res1) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
时间模块之time模块
时间戳
# 返回一个时间戳
import time
time.time()
结构化时间
time.gmtime()
time.localtime()
格式化时间
time.strftime('%Y %d %m %X')
time.strftime('%Y %d %m %H-%M-%S')
三者之间的格式转换
# 结构化时间转变为格式化时间
print(time.strftime('%Y %d %m %X')) # 2022 14 07 16:22:51
# 格式化时间转化为结构化时间
time1 = time.strptime('2022 14 07 16:09:13','%Y %d %m %X')
print(time1) # time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=16, tm_min=9, tm_sec=13, tm_wday=3, tm_yday=195, tm_isdst=-1)
# 时间戳转化为结构化时间
print(time.localtime()) # time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=16, tm_min=22, tm_sec=51, tm_wday=3, tm_yday=195, tm_isdst=0)
# 结构化时间转化为时间错戳
time2 =time.mktime((2022, 7,14, 16, 9,13, 3,195,-1))
print(time2) # 1657786153.0