学习内容概览
- 绝对导包与相对导包
- 包的简介
- 软件开发目录规范
- 常见模块
一、绝对导包与相对导包
导包的过程中,路径都是以执行文件为基准
绝对导包与相对导包类似于之前学习的绝对路径与相对路径
- 绝对导包:
以项目根目录开始,使用from一层层找到模块所在的文件夹,然后使用import导入(pycharm帮我们在sys.path中添加了项目根目录的路径,如果没有使用pycharm则需要自行添加) - 相对导包:
根据当前执行文件所在位置,使用from . 代表当前目录;from …代表上级目录来找到模块文件与之导入文件的相对路径(相对路径只能在模块文件中使用,不能在执行文件中使用)
二、包的简介
- 什么是包
文件夹中含有__init__.py的文件夹就是一个包
对于python3来说,只要是文件夹都可以当做是包
但对于python2来说,只有含有__init__的文件夹才是包 - 包的作用
存放多个py文件(模块文件),用于分门别类 - 包的用法
import 包名 """ 可以直接使用import导入一个包 不过这样直接导入的不是包内所有的模块文件,而是导入了包内的__init__文件 可以在__init__文件中导入模块,就可以使用 包名.模块名.名字 的方式来调用 这样也可以像__all__一样,可以控制导入哪些包 """ from 包名 import 模块名 """ 也可以直接跳过包,直接导入包内的模块 """
三、软件开发目录规范
学习了模块过后,以后就需要习惯把不同功能的代码放在不同的文件夹下
而我们使用的所有程序目录都有一定规范
- bin文件夹
用于存放程序的启动文件 start.py - conf文件夹
用于存放程序的配置文件 settings.py - core文件夹
用于存放程序的核心功能 src.py - lib文件夹
用于存放程序的公共功能 common.py - db文件夹
用于存放程序的数据文件 info.txt - log文件夹
用于存放程序的日志信息 log.log - interface文件夹
用于存放程序的接口文件 user.py order.py goods.py - readme文件
相当于程序的说明书,写入产品介绍、联系方式、广告等 - requirements.txt
在内部填写程序运行需要的环境,需要哪些模块、软件,需要什么版本
在编写文件名时,可以不用完全按照上边的名字
也可以不用bin文件夹,将启动文件直接放在项目根目录下
四、常见内置模块
collections模块
提供了更多的数据类型
-
具名元组
from collections import namedtuple coord = namedtuple('坐标', ['x', 'y']) # coord = namedtuple('坐标', 'x y') # 也可以在一个字符串中使用空格来分割两个数据,这里和上边代码相同 res = coord('4', '9') print(res) # 坐标(x=4, y=9) """可以在元组的前面加上一个字符串信息"""
-
双端队列
from collections import deque res = deque() print(res) # deque([]) res.append(1) res.append(2) res.append(3) print(res) # deque([1, 2, 3]) """ 队列的特性是先进先出 而双端队列两端都可以增加和移除数据 """ res.appendleft(4) print(res) # deque([4, 1, 2, 3]) res.pop() print(res) # deque([4, 1, 2]) res.popleft() print(res) # deque([1, 2])
-
有序字典
from collections import OrderedDict """ 字典在python3.6之前是无序列表 可以使用这个模块生成有序字典 """ d1 = dict([('a',1), ('b', 2)]) print(d1) d2 = OrderedDict([('a', 1), ('b', 2)]) print(d2)
-
默认字典
from collections import defaultdict """可以先看做一种构建字典的方式""" d1 = defaultdict(k1=[], k2=[]) print(d1) # defaultdict(None, {'k1': [], 'k2': []})
-
计数器
from collections import Counter res = 'asdfzxcvfdasvczx' """之前写的统计每个字符出现次数使用了for循环和if判断""" d1 = {} for i in res: if i in d1: d1[i] += 1 else: d1[i] = 1 print(d1) # {'a': 2, 's': 2, 'd': 2, 'f': 2, 'z': 2, 'x': 2, 'c': 2, 'v': 2} """现在使用内置模块可以很方便的拿到结果""" d2 = Counter(res) print(d2) # Counter({'a': 2, 's': 2, 'd': 2, 'f': 2, 'z': 2, 'x': 2, 'c': 2, 'v': 2})
time模块
时间模块有三种格式
1. 时间戳:time.time(),返回值是从1970年1月1号0时0分0秒到执行时经过的秒数
2. 结构化时间:time.gmtime(),返回值是方便计算机识别的时间元组
3. 格式化时间:strftime(),返回值是方便我们看的时间
时间戳和格式化时间不能相互转换,需要经过结构化时间转换