今日内容概要
-
绝对导入与相对导入
-
包的概念
-
编程思想的转变
-
软件开发目录规范
-
常见内置模块
(一)绝对导入与相对导入
1.绝对导入
其实就是以执行文件所在的sys.path为起始路径,往下一层层查找
from ccc import b from ccc.ddd.eee import b
ps:由于pycharm会自动将项目根目录添加到sys.path中,所以查找模块肯定不报错的方法就是永远从根路径往下一层层找
如果不是用pycharm运行,则需要将项目跟目录添加到sys.path(针对项目根目录的绝对路径有模块可以帮助我们获取>>>:os模块)
2.相对导入
相对导入可以不参考执行文件所在的路径,直接以当前模块文件路径为准
(1)只能在模块文件中使用,不能在执行文件中使用
(2)相对导入在项目比较复杂的情况下,可能会出错
ps:相对导入尽量少用,推荐使用绝对导入
.在路径中意思是当前路径;
…在路径中意思是上一层路径;
…/…在路径中意思是上上一层路径
(二)包的概念
1.包的理解:
专业的角度:内部含有__init__.py的文件夹
直观的角度:就是一个文件夹
2.包的作用:
内部存放多个py文件(模块文件),仅仅是为了更加方便的管理模块文件。
3.具体使用:
import包名:
导入包名其实导入的是里面的__init__.py文件(该文件里面有什么你才能用什么);
其实也可以跨过__init__.py直接导入包里面的模块文件。
针对python3解释器:
其实文件夹里面有没有__init__.py已经无所谓了,都是包。
针对python2解释器:
文件夹下面必须要有__init__.py才能被当做包
(三)编程思想的转变
1.整个编程演变过程,目的为了更加方便快捷高效的管理资源
(1)小白阶段——单文件
按照需求从上往下堆叠代码(面条版)
(2)函数阶段——单文件
将代码按照功能的不同封装成不同的函数
(3)模块阶段——多文件
根据功能的不同拆分不同的模块文件
2.大白话描述:
小白阶段相当于将所有的文件全部存储在C盘并且不分类;
函数阶段相当于将所有的文件在C盘下分类存储;
模块阶段相当于将所有的文件按照功能的不同分门别类到不同的盘中。
(四)软件开发目录规范
1.我们实际工作中编写的程序软件都是有很多文件夹和文件组成的。
这些文件夹和文件其实都有各自存在的意义和主要功能。
种类 功能 启动文件名称 bin文件夹 同于存储程序的启动文件 start.py conf文件夹 用于存储程序的配置文件 settings.py core文件夹 用于存储程序的核心逻辑 src.py lib文件夹 用于存储程序的公共功能 common.py db文件夹 用于存储程序的数据文件 userinfo.txt log文件夹 用于存储程序的日志文件 log.log interface文件夹 用于存储程序的接口文件 user.py order.py goods.py readme文件(文本文件) 用于编写程序的说明,介绍,广告,类似于产品说明书 requirements.txt 用于存储程序所需的第三方模块名称和版本 2.归纳总结:
1.目录的名字可以不一致 但是主要的思想是一致的
2.主要作用就是为了便于管理 解耦合
(五)常见内置模块
1.collections模块
给我们提供了更多数据类型!!!
这个模块实现了特定目标的容器,以提供Python标准内建容器 dict、list、set、tuple 的替代选择。2.内部方法官方介绍:
函数名 功能 Counter 字典的子类,提供了可哈希对象的计数功能 defaultdict 字典的子类,提供了一个工厂函数,为字典查询提供了默认值 OrderedDict 字典的子类,保留了他们被添加的顺序 namedtuple 创建命名元组子类的工厂函数 deque 类似列表容器,实现了在两端快速添加(append)和弹出(pop) ChainMap 类似字典的容器类,将多个映射集合到一个视图里面
(1)namedtuple
1.1:简介
具名元祖(加强版tuple),可以使tuple更加语义化。之前我们写一个元祖tuple,对内部元素不能进行命名。往往我们并不知道一个元祖所要表达的意义,而namedtuple很好的解决了此问题。(可以变相地理解为字典化的元组)
1.2:语法结构namedtuple('tuple_name', 'field_names') # tuple_name 元祖的名称,为字符串,返回一个元组子类,所以我们要对这个对象进行命名。 # field_name 元祖中元素的名称,通常是一个可迭代的数据,也可以是以逗号隔开的元素名称
1.3:用法举例
from collections import namedtuple Point = namedtuple('二维坐标系',['x','y']) res1 = Point(1,3) res2 = Point(10,49) print(res1,res2) print(res1.x) print(res1.y) ''' # 执行结果 二维坐标系(x=1, y=3) 二维坐标系(x=10, y=49) 1 3 ''' Point = namedtuple('三维坐标系',['x','y','z']) res1 = Point(1,3,44) res2 = Point(10,49,55) print(res1,res2) ''' # 执行结果 三维坐标系(x=1, y=3, z=44) 三维坐标系(x=10, y=49, z=55) ''' p = namedtuple('扑克牌',['花色','点数']) res1 = p('♥', 'A') res2 = p('♠', 'A') print(res1) print(res2) ''' # 执行结果 扑克牌(花色='♥', 点数='A') 扑克牌(花色='♠', 点数='A') '''
(2):deque
2.1:简介
双向队列,类似于list的容器,可以快速的在队列头部和尾部添加、删除元素
2.2:append
从右端添加元素(与list同)# 双端队列 from collections import deque q = deque([1, 2, 3]) q.append(111) q.append(222) q.append(333) print(q) ''' # 执行结果 deque([1, 2, 3, 111, 222, 333]) '''
2.3:appendleft
从左端添加元素from collections import deque q = deque([1, 2, 3]) q.appendleft(555) print(q) ''' # 执行结果 deque([555, 1, 2, 3]) '''
2.4:pop
移除列表中的一个元素(默认最右端的一个元素),并且返回该元素的值(与list同),如果没有元素,将会报出IndexErrorfrom collections import deque q = deque([1, 2, 3]) q.pop() print(q) ''' # 执行结果 deque([1, 2]) '''
(3):OrderedDict
3.1:简介
有序字典,实现了对字典对象中元素的排序。
3.2:from collections import OrderedDict d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d) od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(od) ''' # 执行结果 {'a': 1, 'b': 2, 'c': 3} OrderedDict([('a', 1), ('b', 2), ('c', 3)]) '''
(4):defaultdict
4.1:简介
默认字典,是内置数据类型dict的一个子类,基本功能与dict一样,只是重写了一个方法missing(key)和增加了一个可写的对象变量default_factory
4.2:语法结构:collections.defaultdict([default_factory[, …]])
第一个参数为default_factory属性提供初始值,默认为None;其余参数包括关键字参数(keyword arguments)的用法,和dict构造器用法一样。
4.3:需求:
#有如下值集合 [11,22,33,44,55,66,77,88,99,90],
#将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中
#{‘k1’:[], ‘k2’:[]}from collections import defaultdict l1 = [11,22,33,44,55,66,77,88,99,90] res = defaultdict(k1=[i for i in l1 if i < 66],k2=[i for i in l1 if i > 66]) print(res) ''' # 执行结果 defaultdict(None, {'k1': [11, 22, 33, 44, 55], 'k2': [77, 88, 99, 90]}) '''
(5):Counter
5.1:需求:
将字符串字母出现次数制成字典
(1)for循环方法res = 'abcdeabcdabcaba' # {'a':2,'b':5 } new_dict = {} for i in res: if i not in new_dict: new_dict[i] = 1 else: new_dict[i] += 1 print(new_dict)
(2)运用内置模块方法
res = 'abcdeabcdabcaba' # {'a':2,'b':5 } from collections import Counter res1 = Counter(res) print(res1) ''' # 执行结果 Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}) '''
3.时间模块之time模块
时间的三种格式:
(1)时间戳
time.time()
距离1970年1月1日0时0分0秒至此相差的秒数
(2)结构化时间
tie.gmtime()
以元组方式返回格林威治时间
(3)格式化时间
time.strftime()
将元组时间转换为字符串格式时间