今日内容概要
- 包的具体的使用
- 编程思想的转变
- 软件开发目录规范
- 常见内置模块之collections模块
- 常用内置模块之时间模块
- 常用内置模块之随机数模块
今日内容详情
包的具体要求
由于python3对包的要求降低了 不需要__init__.py也可以识别 但为了考虑兼容性问题最好还是加上__init__.py
1.如果只想用包中某几个模块 那么还是按照之前的导入方式即可
from aa import md1, md2
2.如果直接导入包名
import aaa
导入包名其实就是导包下面的__init__.py文件,该文件内有什么名字就可以通过包名点什么名字
编程思想的转变
1.面条版阶段
所有的代码全部堆叠在一起
"""
这个阶段可以看成是直接将所有的数据都放在C盘
视频 文本 图片
"""
2.函数版阶段
根据功能的不同封装不同函数
"""
这个阶段可以看成是将C盘下的数据分类管理
视频文件夹 音频文件夹 文本文件夹 图片文件夹
"""
3.模块版阶段
根据功能的不同拆分成不同的py文件
"""
这个阶段可以看成是将C盘下的数据根据功能的不同划分更合适的位置
系统文件夹 C盘
视频文件夹 D盘
图片文件夹 E盘
都是为了资源的高效管理
"""
软件开发目录规范
1.文件及目录的名字可以变换 但是思想是不变的 分类管理
2.目录规范主要规定开发程序的过程中针对不同的文件功能需要做不同的分类
myproject项目文件夹
文件夹 | 文件夹作用 | py文件 | py文件作用 |
---|---|---|---|
bin | 主要存放项目启动文件 | start.py | 启动文件可以放在bin目录下 也可以直接项目根目录 |
conf | 主要存放项目配置文件 | settings.py | 里面存放项目的默认配置 一般都是全大写 |
core | 主要存放项目核心文件 | src.py | 里面存放项目核心文件 |
interface | 主要存放项目接口文件 | goods.py user.py account.py | 根据具体业务逻辑划分对应文件 |
db | 主要存放项目相关数据 | userinfo.txt db_handler.py | 存放数据库操作相关的代码 |
log | 主要存放项目日志文件 | log.py | |
lib | 主要存放项目公共功能 | common.py | |
readme文件 | 主要存放项目相关说明 | ||
requirements.txt文件 | 主要存放项目所需模块及版本 |
常用内置模块之collections模块
1.具名元组:namedtuple
from collections import namedtuple
表示二维坐标系
point = namedtupule('点',['x', 'y'])
生成点信息
p1 = point(1, 2)
print(p1) # 点(x = 1, y = 2)
print(p1.x) # 1
print(p2.y) # 2
card = namedtuple('扑克牌', ['num', 'color'])
c1 = card('A', '黑♠')
c2 = card('A', '红♥')
print(c1, c1.num, c1.color) # 扑克牌(num=A, color=黑♠) A 黑♠
print(c2, c2.num, c2.color) # 扑克牌(num=A, color=红♥) A 黑♠
2.双端队列 deque
队列与堆栈
队列:先进先出
堆栈:先进后出
队列和堆栈都是一边只能进一边只能出
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈
代码如下:
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x') # 尾部添加x
q.appendleft('y') # 首部添加y
print(q) # deque(['y', 'a', 'b', 'c', 'x']
deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素
3.有序字典 OrderedDict
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDict:
代码如下:
from collections import OrderedDict
data_dict = OrderedDict()
data_dict['k1'] = 2
data_dict['k2'] = 4
data_dict['k3'] = 25
print(data_dict) # OrderedDict([('k1', 2), ('k2', 4), ('k3', 25)])
注意:OrderedDict的键会按照插入的顺序排列 而不是根据键本身进行排序
4.默认字典 defaultdict
有集合[11, 22, 33, 44, 55, 66, 77, 88, 99]将所有大于60的值保存至字典的第一个键中, 小于66的值保存到第二个键中、
传统做法:
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
my_dict = {'k1':[], 'k2':[]}
for i in l1:
if i > 60:
my_dict['k1'].append(i)
else:
my_dict['k2'].append(i)
print(my_dict)
用defaultdict模块:
from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in values:
if value>66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value))
print(my_dict)
5.计数器 Counter
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
c = Counter('abcdeabcdabcaba')
print c
输出:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
常用内置模块之时间模块
一.import time
"""
三种时间表现形式
1.时间戳
秒数
2.结构化时间
主要是给计算机看的
3.格式化时间
主要是给人看的
"""
1.时间戳
print(time.time()) #1666178313.5136297
print(time.sleep(3)) # 让程序原地阻塞指定的秒数
2.结构化时间
print(time.localtime()) # time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=19, tm_min=21, tm_sec=45, tm_wday=2, tm_yday=292, tm_isdst=0)
3.格式化时间
print(time.strftime(%Y-%m-%d)) #2022-10-19
print(time.strftime(%Y-%m-%d %H:%M:%S)) # 2022/10/19 11:31:18
二.import datetime
"""
datetime 年月日 时分秒
date 年月日
time 时分秒
"""
import datetime
print(datetime.datetime.now()) # now()获取当前datetime 2022-10-19 11:58:23.682282
print(datetime.datetime.today()) # today获得当前时间 2022-10-19 11:58:23.682282
print(datetime.date.today()) # 2022-10-19
print(datetime.utcnow()) #utcnow() 世界时间 2022-10-19 11:44:13.573954
import datetime
c = datetime.datetime(2017, 5, 23, 12, 27 )
print(c) # 指定时间 2017-05-23 12:27:00
from datetime import datetime #自定义时间 strptime
d = datetime.strptime('2001/06/24','%Y/%m/%d')
print(d) 2001-06-24 00:00:00
e=datetime.strptime('20001年6月24日星期六','%Y年%m月%d日星期六')
print(e)
f=datetime.strptime('2001年6月24日星期六7时00分00秒','%Y年%m月%d日星期六%H时%M分%S秒')
print(f)
import datetime
ctime = datetime.date.today()
print(ctime)
time_del = datetime.timedelta(days=3)
print(ctime + time_del)
ctime = datetime.datetime.today()
print(ctime)
time_del = datetime.timedelta(minutes=20)
print(ctime + time_del)
常用内置模块之随机数模块
import random
print(random.random()) # 随机产生0到1之间的小数
print(random.randint(1, 10)) # 随机产生1到10之间的整数
print(random.randrange(1, 100, 2)) # 随机产生1到100之间的奇数
print(random.choice(['一等奖', '二等奖', '三等奖', '谢谢惠顾'])) # 随机抽取一个样本 '二等奖'
print(random.choices(['一等奖', '二等奖', '三等奖', '谢谢惠顾'])) # 随机抽取一个样本 ['二等奖']
print(random.sample(['jason', 'kevin', 'tony', 'oscar', 'jerry', 'tom'], 3)) # 随机抽指定个数的 ['tom', 'jerry']
l1 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
random.shuffle(l1) # 随机打乱数据集
print(l1)
'''产生图片验证码: 每一位都可以是大写字母 小写字母 数字 4位'''
def get_code(n):
code = ''
for i in range(n):
# 1.先产生随机的大写字母 小写字母 数字
random_upper = chr(random.randint(65, 90)) # 随机产生A到Z之间的字母
random_lower = chr(random.randint(97, 122)) # 随机产生a到z之间的字母
random_int = str(random.randint(0, 9)) # 随机产生0到9的数字转化成字符串才能拼接
# 2.随机三选一
temp = random.choice([random_upper, random_lower, random_int])
code += temp
return code
re = get_code(3)
print(re)
res = get_code(4)
print(res)
标签:内置,random,datetime,dict,模块,time,print,py
From: https://www.cnblogs.com/zjl248/p/16807602.html