python23-包-内置模块
今日学习
绝对导入和相对导入
包的概念
编程思想的转变
软件开发目录规范
常见内置模块
绝对导入和相对导入
相对导入尽量少用 推荐使用绝对导入
##############################################
只要涉及到模块的导入 那么sys.path永远以执行文件为准
#############################################
例子:
project项目中,有一个md1.py文件 有一个ccc文件夹,ccc文件夹中有a.py,b.py
文件内容如下
-------------md1文件内容-----------
from ccc import a
-------------a.py---------------
print('from a.py')
def index():
from ccc import b #
b.index()
index()
-------------b.py-----------
print('from b.py')
def index():
print('from b.py index')
流程1.执行md1文件;发现图片中以下报错。执行调用完a.py,发现并不能执行b.py
绝对路径导入:当md1执行时,会以当前执行文件所在的sys.path 为起始路径,往下一层层导入,所以找到a的时候,b在当前path下找不到。需要在a.py中绝对路径导入b.py,此
-
绝对导入
其实就是以执行文件所在的sys.path为起始路径 往下一层层查找a.py,b.py
from ccc import a
from ccc.ddd.eee import b
ps:由于pycharm会自动将项目根目录添加到sys.path中所以查找模块肯定不报错的方法就是永远从根路径往下一层层找
如果不是用pycharm运行 则需要将项目跟目录添加到sys.path(针对项目根目录的绝对路径有模块可以帮助我们获取>>>:os模块)
-
相对导入
.在路径中意思是当前路径
..在路径中意思是上一层路径
../..在路径中意思是上上一层路径
相对导入可以不参考执行文件所在的路径 直接以当前模块文件路径为准
1.只能在模块文件中使用 不能在执行文件中使用
2.相对导入在项目比较复杂的情况下 可能会出错
包的概念
-
概念
内部含有__init__.py的文件夹 针对python3解释器 其实文件夹里面有没有__init__.py已经无所谓了 都是包 但是针对Python2解释器 文件夹下面必须要有__init__.py才能被当做包
-
作用
存放多个py文件,仅仅是为了更加方便的管理模块文件
-
具体使用
import 包名 导入包名其实导入的是里面的__init__.py文件(该文件里面有什么你才能用什么) 其实也可以跨过__init__.py直接导入包里面的模块文件
编程思想的转变
1.小白阶段
按照需求从上往下堆叠代码(面条版) 单文件
2.函数阶段
将代码按照功能的不同封装成不同的函数 单文件
3.模块阶段
根据功能的不同拆分不同的模块文件 多文件
"""
小白阶段相当于将所有的文件全部存储在C盘并且不分类
函数阶段相当于将所有的文件在C盘下分类存储
模块阶段相当于将所有的文件按照功能的不同分门别类到不同的盘中
目的为了更加方便快捷高效的管理资源
"""
软件开发目录规范
文件夹 | 用处 |
---|---|
bin | 用于存储程序的启动文件 |
conf/config | 存储程序的配置文件 |
core | 存储程序的核心逻辑 |
lib | 存储程序的公共功能 |
db | 存储程序的数据文件 |
log | 日志文件 |
interface | 用于存储程序的接口文件 |
readme(文本) | 用于编写程序的说明 |
requirements.txt | 用于存储程序所需的第三方模块名称和版本 |
常见的内置模块
-
collections模块
-
功能:给我们提供更多的数据类型!!![除了基本数据类型]
-
namedtuple :具名元组
-
功能:namedtuple是继承自tuple的子类。namedtuple创建一个和tuple类似的对象,而且对象拥有可访问的属性
----------namedtuple例子------------------- from collections import namedtuple Point = namedtuple('二维坐标系',['x','y']) res1 = Point(1,3) res2 = Point(10,49) print(res1,res2) print(res1.x) print(res2.y) --------执行结果--------------------------- 二维坐标系(x=1, y=3) 二维坐标系(x=10, y=49) 1 49
-
deque: 双端队列;
是为了高效实现插入和删除操作的双向列表,适用于队列和栈 使用list 存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候插入和删除效率很低
--------------deque例子-------------------- from collections import deque q = deque() q.append(111) q.append(222) q.append(333) q.append(444) q.appendleft(555) print(q) --------执行结果--------------- deque([555, 111, 222, 333, 444])
-
OrderedDict : 有序字典
dict的字典是无序的,key是无序的,在对dict做迭代时,我们无法确定key的顺序。 有序字典可以保持key的顺序,需要注意的是,有序字典的排序是按照插入顺序排序,不是key本身
from collections import OrderedDict d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d) od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(od)
-
DefaultDict 默认字典
-
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
---------------DefaultDict例子----------------------- l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] from collections import defaultdict res = defaultdict( k1=[], k2=[]) for i,j in enumerate(l1,0): if int(j) > 66: res['k1'].append(j) else: res['k2'].append(j) print(res) ---------执行结果------------------------------- defaultdict(None, {'k1': [77, 88, 99, 90], 'k2': [11, 22, 33, 44, 55, 66]})
-
Count:计数
Counter类的目的是用来跟踪值出现的次数,它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value,计数值可以是任意的interger(整数)(包括0和负数),Count类和其他语言的bags或者multiesets
-----------------Count例子--------------- from collections import Counter res = 'abcdeabcdabcaba' # {'a':2,'b':5 } res1 = Counter(res) print(res1) -----------执行结果----------------------- Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
-
-
时间模块
调用import time
-
三种格式
1.时间戳 time.time() 2.结构化时间 time.gmtime() 3.格式化时间 time.strftime()
-------------------time例子------------------------------ import time print(time.time()) # 1657800944.395487 --------------------------------------------------------------- print(time.gmtime()) #time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=12, tm_min=15, tm_sec=44, tm_wday=3, tm_yday=195, tm_isdst=0) -------------------------------------------------------------------- print(time.strftime('%Y-%m-%d %H:%M:%S')) #2022-07-14 20:31:35 -------------------------------------------------------------------- print(time.strftime('%Y-%m-%d')) # # 2022-07-14 -------------------------------------------------------------------- print(time.strftime('%H:%M:%S')) # 20:31:35 --------------------------------------------------------------------
索引(Index) 属性(Attribute) 值(Values) 0 tm_year(年) 比如2011 1 tm_mon(月) 1 - 12 2 tm_mday(日) 1 - 31 3 tm_hour(时) 0 - 23 4 tm_min(分) 0 - 59 5 tm_sec(秒) 0 - 60 6 tm_wday(weekday) 0 - 6(0表示周一) 7 tm_yday(一年中的第几天) 1 - 366 8 tm_isdst(是否是夏令时) 默认为0 表达方式 表现 时间格式 %Y 年份 2022 (年份) %y 年份 22 (年份) %M 分钟 38 (分钟) %m 月份 07 (七月) %H 小时 20 (晚上八点) %h 英文 jul (英文七月) %D 年月日 07/14/22 %d 日 14 号 %S 秒 45 秒 %X 时分秒 21:02:51 %x 年月日 07/14/22 %A 星期几 Thursday 英文星期四 %a 星期几 Thu 简写英文 %z 区时 中国标准时间 %W 元旦开始第几周 28 %w 星期几 04 第四天
-
#时间戳-->结构化时间
#time.gmtime(时间戳) #UTC时间,与英国伦敦当地时间一致
#time.localtime(时间戳) #当地时间。例如我们现在在北京执行这个方法:与UTC时间相差8小时,UTC时间+8小时 = 北京时间
import time
res = time.gmtime(1500000000)
print(res)
--------------------执行结果------------------------------------
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=2, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
----------------------------------------------------------------
res = time.gmtime() #括号不填写默认当前时间
print(res)
--------------------执行结果--------------------------------------
time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=13, tm_min=16, tm_sec=23, tm_wday=3, tm_yday=195, tm_isdst=0)
import time
#结构化时间-->字符串时间
#time.strftime("格式定义","结构化时间") 结构化时间参数若不传,则显示当前时间
res = time.strftime("%Y-%m-%d %X")
print(res)
-------------执行结果------------------------------------------------------
2022-07-14 21:19:14
res = time.strftime("%Y-%m-%d",time.localtime(1500000000))
print(res)
2017-07-14
--------------------------------------------------------------------------
#字符串时间-->结构化时间
#time.strptime(时间字符串,字符串对应格式)
# >>>time.strptime("2017-03-16","%Y-%m-%d")
res = time.strptime("2022-07-11","%Y-%m-%d")
print(res)
-------------执行结果-------------------------------------------------------
time.struct_time(tm_year=2022, tm_mon=7, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=192, tm_isdst=-1)
---------------------------------------------------------------------------
res = time.strptime("11/07/2022","%m/%d/%Y")
print(res)
------------------执行结果--------------------------------------------------
time.struct_time(tm_year=2022, tm_mon=11, tm_mday=7, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=311, tm_isdst=-1)
#结构化时间 --> %a %b %d %H:%M:%S %Y串
#time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串
import time
res = time.asctime(time.localtime())
print(res)
----------执行结果-------------------
Thu Jul 14 21:13:27 2022
---------------------------------------------------------
#时间戳 --> %a %b %d %H:%M:%S %Y串
#time.ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串
res = time.ctime()
# 复制代码
print(res)
-------------执行结果--------------
Thu Jul 14 21:14:28 2022