常用内置模块
包的使用
# PS:虽然python3之后的版本中并不再要求包内必须含有__init__.py,但是考虑到兼容性问题,我们在创建包文件时,还是推荐加上__init__.py
当我们再python中导入包时
# 正常导入包内的模块名称 from 包名 import 模块名 import 包名.模块名 # 导入包名 #直接导入包名的本质是导入包内的__init__.py文件,然后将我们包内其他模块的名称存放在这个中,当我们需要用到模块名称时,通过包名加点的方式就可以调用模块
编程思维转变
截止到目前为止,我们所经历的编程思维阶段可以按照代码的编写形式分为三个阶段
1.面条式
if... # 在这个阶段我们的代码一行一行如同面条一样堆叠,既繁琐又不美观,且功能单一 elif... elif... else ...
2.函数式
def func(): # 在这个阶段我们的代码使用函数包裹,简化代码的同时增加了更多的功能 pass func()
3.模块式
import time # 在这个阶段我们的代码更加简单,但是功能却更加强大 time.time()
经历的这几个阶段,我们可以理解为不断地将功能性代码进行分类管理,提高资源利用效率,面条式相当于将所有文件都堆在根目录,函数式相当于将文件进行了初步分类并归纳在不同的文件夹,而模块则相当于进行再次细分,建立二级甚至三级文件路径
在之后的编程中,我们需要不断适应这种模式,并逐步培养细化分类的编程思维,这样可以让我们的代码在更加简洁的基础上,更加高效,更加富有逻辑性
软件开发目录规范
1.文件及目录的名字可以变换,但是遵循分类管理的思想逻辑是不变的
2.目录规范的作用是规定开发程序的过程中针对不同的文件功能需要做不同的分类''' myproject项目文件夹 1.bin文件夹 主要存放项目启动文件 start.py 启动文件可以放在bin目录下,也可以直接在项目根目录 2.conf文件夹 主要存放项目配置文件 settings.py 里面存放项目的默认配置,一般都是全大写 3.core文件夹 主要存放项目核心文件 src.py 里面存放项目核心功能 4.interface文件夹 主要存放项目接口文件 goods.py 根据具体业务逻辑划分对应的文件 user.py account.py 5.db文件夹 主要存放项目相关数据 userinfo.txt db_handler.py 存放数据库操作相关的代码 6.log文件夹 主要存放项目日志文件 log.log 7.lib文件夹 主要存放项目公共功能 common.py 8.readme文件 主要存放项目相关说明 9.requirements.txt文件 主要存放项目所需模块及版本 ''' # requirements.txt文件的作用是在我们的源码被他人使用时,可以通过该文件了解到程序运行所需的模块即相关插件的版本,并检测本机对所需环境的安装情况,对缺少的必要运行环境进行快速安装
常用内置模块之collections
1.具名元组:namedtuple:(具有名称的元组)
from collections import namedtuple # 表示二维坐标系 point = namedtuple('点', ['x', 'y']) # 生成点信息 p1 = point(1, 2) print(p1) # 点(x=1, y=2) print(p1.x) # 1 print(p1.y) # 2 # 自定义扑克牌 card = namedtuple('扑克牌', ['num', 'color']) # (元组名, [变量名1, 变量名2]) c1 = card('A', '黑♠') c2 = card('A', '红♥') print(c1) # 扑克牌(num='A', color='黑♠') # 输出格式元组名(变量名1 = 参数1, 变量名2 = 参数2) print(c2) # 扑克牌(num='A', color='红♥') ''' 相当于将原有的元组添加名称,并将我们传入的参数与元组中列表的数据值绑定 '''
2.双端队列:deque(生成双端进出的队列)
队列与堆栈
队列:先进先出(先添加的先输出)
堆栈:先进后出(先添加的后输出)
队列和堆栈都是一边只能进一边只能出from collections import deque l1 = [1, 2, 3, 4, 5, 6] A = deque(l1) print(A) # deque([1, 2, 3, 4, 5, 6]) # 双端队列实现了两端都可以进出数据 from collections import deque q = deque(['a', 'b', 'c']) q.append('x') q.appendleft('y') print(q) # deque(['y', 'a', 'b', 'c', 'x']),通过deque方法,我们可以在左右两端都添加数据
3.有序字典:OrderedDict(按照输入数据顺序生成有序字典)
from collections import OrderedDict d = dict([('a', 1), ('b', 2), ('c', 3)]) print(d) # dict的Key是无序的 {'a': 1, 'c': 3, 'b': 2} od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(od) # OrderedDict的Key是有序的 OrderedDict([('a', 1), ('b', 2), ('c', 3)]) # 在OrderedDict中,Key是按照插入顺序排列的而不是Key本身
常用内置模块之时间
1.time模块
时间在python中的表现形式有三种,分别是时间戳,结构化时间和格式化时间
时间戳代表距离1970年1月1日0时0分0秒的秒数
结构化时间主要是为了给计算机使用
格式化时间是为人类使用
time模块
time.strptime(),功能:将特定字符串格式的时间,转换为struct_time
time_1 = "2000-01-01 14:30:30" time_2 = time.strptime(time_1, '%Y-%m-%d %H:%M:%S') print(time_2) ''' time.struct_time(tm_year=2000, tm_mon=1, tm_mday=1, tm_hour=14, tm_min=30, tm_sec=30, tm_wday=5, tm_yday=1, tm_isdst=-1) '''
time.strftime(),功能:将struct_time,转换为特定字符串格式的时间
print(time.strftime('%Y/%m/%d %H:%M:%S', time_2)) # 2000/01/01 14:30:30
time.time(),功能:将当前时间转换为时间戳
import time print(time.time()) # 1666182346.4953427
time.mktime(),功能:将struct_time转换为时间戳,输入当地struct_time,输出格林威治时间戳
time_3 = time.mktime(time_2) print(time_3) # 946708230.0
time.localtime(),功能:将时间戳转换为struct_time(当地时间)
time3 = 1666182346.4953427 print(time.localtime(time3)) # time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=20, tm_min=25, tm_sec=46, tm_wday=2, tm_yday=292, tm_isdst=0)
time.gmtime(),功能:将时间戳转换为struct_time(格林威治时间)
time_3 = 946708230.0 time_4 = time.gmtime(time_3) print(time_4) ''' time.struct_time(tm_year=2000, tm_mon=1, tm_mday=1, tm_hour=6, tm_min=30, tm_sec=30, tm_wday=5, tm_yday=1, tm_isdst=0) '''
localtime与gmtime两者关系:例如,localtime北京时间 = gmtime格林威治时间 + 8小时
# 获取一个当前时间戳 times = time.time() # 将一个时间戳格式化为格林威治时间 gmtimes_before = time.gmtime(times) print(gmtimes_before) # time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=12, tm_min=11, tm_sec=9, tm_wday=2, tm_yday=292, tm_isdst=0) gmtimes = time.strftime("%Y-%m-%d %H:%M:%S", gmtimes_before) print(gmtimes) # 将struct_time转化为格林威治时间 # '2022-10-19 12:11:09' # 将一个时间戳格式化为本地时区时间 mytimes_before = time.localtime(times) print(mytimes_before) # time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=20, tm_min=18, tm_sec=10, tm_wday=2, tm_yday=292, tm_isdst=0) mytimes = time.strftime("%Y-%m-%d %H:%M:%S", mytimes_before) print(mytimes) # 将本地时间格式化输出 # '2022-10-19 20:18:10'
time.sleep():让程序运行阻滞几秒钟
import time time.sleep(10)
转换关系
datetime模块
print(datetime.datetime.now()) # 2022-10-19 11:58:23.682282 print(datetime.datetime.today()) # 2022-10-19 11:58:23.682282 print(datetime.date.today()) # 2022-10-19 ''' datetime 年月日 时分秒 date 年月日 time 时分秒(后续会有此规律) ''' from datetime import date, datetime print(date.today()) print(datetime.today()) print(datetime.utcnow()) # 格林威治时间2022-10-19 12:46:12.251013 import datetime c = datetime.datetime(2017, 5, 23, 12, 20) # 类似于格式化输出指定时间 print(c) # 2017-05-23 12:20:00 print('指定日期:',c) # 指定日期: 2017-05-23 12:20:00 from datetime import datetime d=datetime.strptime('2017/9/30','%Y/%m/%d') print(d) # 2017-09-30 00:00:00 e=datetime.strptime('2017年9月30日星期六','%Y年%m月%d日星期六') print(e) f=datetime.strptime('2017年9月30日星期六8时42分24秒','%Y年%m月%d日星期六%H时%M分%S秒') print(f) # 将括号内的时间进行格式化输出 import datetime ctime = datetime.date.today() print(ctime) # 2022-10-19 time_del = datetime.timedelta(days=3) # 设置定时3天 print(ctime + time_del) # 2022-10-22 ctime = datetime.datetime.today() print(ctime) time_del = datetime.timedelta(minutes=20) # 设置定时20秒 print(ctime + time_del)
常用模块之随机数
import random
print(random.random()) # 随机产生0到1之间的小数 print(random.randint(1, 6)) # 随机产生1到6之间的整数 print(random.randrange(1, 100, 2)) # 随机产生指定的整数 print(random.choice(['一等奖', '二等奖', '三等奖', '谢谢惠顾'])) # 随机抽取一个样本 '二等奖' print(random.choices(['一等奖', '二等奖', '三等奖', '谢谢惠顾'])) # 随机抽取一个样本 ['二等奖'] # choice抽取的结果是数据值,而choices抽取的结果仍然是列表,并未改变原有的数据类型 print(random.sample(['jason', 'kevin', 'tony', 'oscar', 'jerry', 'tom'], 2)) # 随机抽指定样本数 ['tom', 'jerry'] l1 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A'] random.shuffle(l1) # 随机打乱数据集 print(l1) # [8, 7, 'K', 'Q', 'A', 2, 9, 5, 6, 10, 3, 4, 'J'] '''产生图片验证码: 每一位都可以是大写字母 小写字母 数字 4位''' def get_code(n): # 定义抽取次数,使用函数达到自定义抽取次数效果 code = '' for i in range(n): # 循环次数 # 1.先产生随机的大写字母 小写字母 数字 random_upper = chr(random.randint(65, 90)) # 随机抽取大写字母 random_lower = chr(random.randint(97, 122)) # 随机抽取小写字母 random_int = str(random.randint(0, 9)) # 随机抽取数字 # 2.随机三选一 temp = random.choice([random_upper, random_lower, random_int]) code += temp return code res = get_code(10) # 随机抽取10次 print(res) res = get_code(4) # 随机抽取4次 print(res)