今日学习目标:
- 学习并应用collections、time与datetime、random随机数模块知识
今日学习内容:
- collections模块
- time与datetime模块
- random随机数模块
内容详情:
collections模块
这个模块实现了特定目标的容器,以提供Python标准内建容器 dict、list、set、tuple 的替代选择。
内部方法官方介绍:
函数名 | 功能 |
---|---|
Counter | 字典的子类,提供了可哈希对象的计数功能 |
defaultdict | 字典的子类,提供了一个工厂函数,为字典查询提供了默认值 |
OrderedDict | 字典的子类,保留了他们被添加的顺序 |
namedtuple | 创建命名元组子类的工厂函数 |
deque | 类似列表容器,实现了在两端快速添加(append)和弹出(pop) |
ChainMap | 类似字典的容器类,将多个映射集合到一个视图里面 |
部分方法个人理解:
-
namedtuple
简介
具名元祖(加强版tuple),可以使tuple更加语义化
。之前我们写一个元祖tuple,对内部元素不能进行命名。往往我们并不知道一个元祖所要表达的意义,而namedtuple很好的解决了此问题。(可以变相地理解为字典化的元组)
语法结构
namedtuple('tuple_name', 'field_names') # tuple_name 元祖的名称,为字符串,返回一个元组子类,所以我们要对这个对象进行命名。 # field_name 元祖中元素的名称,通常是一个可迭代的数据,也可以是以逗号隔开的元素名称
用法举例
from collections import namedtuple person = namedtuple('人物', 'name age gender') p1 = person('jason', 18, 'male') p2 = person('kevin', 28, 'female') print(p1, p2) print(p1.name, p1.age) ''' # 执行结果 人物(name='jason', age=18, gender='male') 人物(name='kevin', age=28, gender='female') jason 18 '''
特有属性及方法
-
属性 _fileds
输出这个类的所有字段名的元祖
from collections import namedtuple person = namedtuple('人物', 'name age gender') p1 = person('jason', 18, 'male') p2 = person('kevin', 28, 'female') print(p1._fields) print(p2._fields) ''' # 执行结果 ('name', 'age', 'gender') ('name', 'age', 'gender') '''
-
方法 _asdict()
把具名元祖以collection.OrdereDict的形似返回
from collections import namedtuple person = namedtuple('人物', 'name age gender') p1 = person('jason', 18, 'male') p2 = person('kevin', 28, 'female') print(p1._asdict()) print(p2._asdict()) ''' # 执行结果 {'name': 'jason', 'age': 18, 'gender': 'male'} {'name': 'kevin', 'age': 28, 'gender': 'female'} '''
-
-
deque
简介
双向队列,类似于list的容器,可以快速的在队列头部和尾部添加、删除元素
内部功能分类
-
append
从右端添加元素(与list同)
用法举例
from collections import deque q = deque([1, 2, 3]) print(q) q.append(444) print(q) ''' # 执行结果 deque([1, 2, 3]) deque([1, 2, 3, 444]) '''
-
appendleft
从左端添加元素
用法举例
from collections import deque q = deque([1, 2, 3]) print(q) q.appendleft(666) print(q) ''' # 执行结果 deque([1, 2, 3]) deque([666, 1, 2, 3]) '''
-
pop
移除列表中的一个元素(默认最右端的一个元素),并且返回该元素的值(与list同),如果没有元素,将会报出IndexError
用法举例
from collections import deque q = deque([1, 2, 3]) print(q) print(q.pop()) ''' # 执行结果 deque([1, 2, 3]) 3 '''
-
popleft
移除列表中的一个元素(默认最左端的一个元素),并且返回该元素的值,如果没有元素,将会报出IndexError
用法举例
from collections import deque q = deque([1, 2, 3]) print(q) print(q.popleft()) ''' # 执行结果 deque([1, 2, 3]) 1 '''
-
-
Counter
简介
计数器,可以支持方便、快速的计数,将元素数量统计,然后计数并返回一个字典,键为元素,值为元素个数。
内部独特功能
-
most_common()
返回一个列表,包含counter中n个最大数目的元素,如果忽略n或者为None,most_common()将会返回counter中的所有元素,元素有着相同数目的将会选择出现早的元素
用法举例
from collections import Counter list1 = ["a", "a", "a", "b", "c", "f", "g", "g", "c", "11", "g", "f", "10", "2"] print(Counter(list1).most_common(3)) list2 = ["a", "a", "a", "b", "f", "c", "g", "g", "c", "11", "g", "f", "10", "2"] print(Counter(list2).most_common(3)) ''' # 执行结果 [('a', 3), ('g', 3), ('c', 2)] [('a', 3), ('g', 3), ('f', 2)] '''
-
elements()
返回一个迭代器,每个元素重复的次数为它的数目,顺序是任意的顺序,如果一个元素的数目少于1,那么elements()就会忽略它
用法举例
from collections import Counter dic1 = {'a': 3, 'b': 4, 'c': 0, 'd': -2, "e": 0} print(Counter(dic1)) print(list(Counter(dic1).elements())) ''' # 执行结果 Counter({'b': 4, 'a': 3, 'c': 0, 'e': 0, 'd': -2}) ['a', 'a', 'a', 'b', 'b', 'b', 'b'] '''
-
subtract()
从一个可迭代对象中或者另一个映射(或counter)中,元素相减,是数目相减而不是替换它们
用法举例
from collections import Counter dic1 = {'a': 3, 'b': 4, 'c': 0, 'd': -2, "e": 0} dic2 = {'a': 3, 'b': 4, 'c': 0, 'd': 2, "e": -1, "f": 6} a = Counter(dic1) print(a) b = Counter(dic2) print(b) ''' # 执行结果 Counter({'b': 4, 'a': 3, 'c': 0, 'e': 0, 'd': -2}) Counter({'f': 6, 'b': 4, 'a': 3, 'd': 2, 'c': 0, 'e': -1}) '''
-
-
OrderedDict
简介
有序字典,实现了对字典对象中元素的排序。用法举例
from collections import OrderedDict d2 = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) print(d2) d2['x'] = 111 d2['y'] = 222 d2['z'] = 333 print(d2) print(d2.keys()) ''' # 执行结果 OrderedDict([('a', 1), ('b', 2), ('c', 3)]) OrderedDict([('a', 1), ('b', 2), ('c', 3), ('x', 111), ('y', 222), ('z', 333)]) odict_keys(['a', 'b', 'c', 'x', 'y', 'z']) '''
如果在已经存在的 key 上添加新的值,将会保留原来的 key 的位置,然后覆盖 value 值。
-
defaultdict
简介
默认字典,是内置数据类型dict的一个子类,基本功能与dict一样,只是重写了一个方法missing(key)和增加了一个可写的对象变量default_factory
语法结构
collections.defaultdict([default_factory[, …]])
第一个参数为default_factory属性提供初始值,默认为None;其余参数包括关键字参数(keyword arguments)的用法,和dict构造器用法一样。
用法举例:
使用list作第一个参数,可以很容易将键-值对序列转换为列表字典。from collections import defaultdict s=[('yellow',1),('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] d=defaultdict(list) for k, v in s: d[k].append(v) a=sorted(d.items()) print(a) ''' # 执行结果 [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] '''
time与datetime模块.
-
time模块
常用方法
- time.sleep(secs)
推迟指定的时间运行,单位为秒 - time.time()
获取当前时间戳
三种用于表示时间的格式(彼此之间可以转换)
时间戳<–>结构化时间- time.gmtime() 以元组方式返回格林威治时间
- localtime 将元组时间转换为时间戳
结构化时间<–>格式化时间
- time.strftime() 将元组时间转换为字符串格式时间
- time.strptime() 将字符串格式时间转换为元组格式时间
-
时间戳 time.time()
距离1970年1月1日0时0分0秒至此相差的秒数 -
结构化时间 time.localtime()以元组方式返回本地当前时间
该时间类型主要是给计算机看的,人看起来不太方便import time print(time.localtime()) ''' # 执行结果 time.struct_time(tm_year=2022, tm_mon=3, tm_mday=29, tm_hour=19, tm_min=43, tm_sec=35, tm_wday=1, tm_yday=88, tm_isdst=0) '''
结果说明
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 -
格式化时间 time.strftime()
import time print(time.strftime('%Y-%m-%d %H:%M:%S')) ''' # 执行结果 2022-03-29 19:48:15 '''
结果说明
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
- time.sleep(secs)
-
datetime模块
注意
date 意思就是年月日
datetime 意思就是年月日 时分秒
基础用法
-
返回当前时间
import datetime print(datetime.datetime.now()) ''' # 执行结果 2022-03-29 19:58:56.239953 '''
-
时间戳转换成日期
import datetime print(datetime.date.fromtimestamp(1178766678)) ''' # 执行结果 2007-05-10 '''
-
当前时间+3天
import datetime print(datetime.datetime.now() + datetime.timedelta(+3)) ''' # 执行结果 2022-04-01 20:02:47.204113 '''
-
当前时间-3天
import datetime print(datetime.datetime.now() + datetime.timedelta(-3)) ''' # 执行结果 2022-03-26 20:03:35.130271 '''
-
当前时间+3小时
import datetime print(datetime.datetime.now() + datetime.timedelta(hours=3)) ''' # 执行结果 2022-03-29 23:04:18.038341 '''
-
当前时间+30分钟
import datetime print(datetime.datetime.now() + datetime.timedelta(minutes=30)) ''' # 执行结果 2022-03-29 20:35:17.594292 '''
-
random随机数模块
代码中经常有一些生成随机数的需求。特意整理了一下python中random模块的一些相关用法。
基本用法
-
随机整数:
import random print(random.randint(0, 99)) ''' # 执行结果 33 '''
-
随机选取0到100间的偶数:
import random print(random.randrange(0, 101, 2)) ''' # 执行结果 30 '''
-
随机浮点数:
import random # 范围 0-10 print(random.uniform(1, 10)) ''' # 执行结果 9.109443958042473 '''
-
选择一个随机元素
import random print(random.choice('abc')) ''' # 执行结果 b '''
-
将一个列表中的元素打乱
import random p = ["Python","is", "powerful","simple", "and so on..."] random.shuffle(p) print(p) ''' # 执行结果 ['powerful', 'is', 'simple', 'and so on...', 'Python'] '''
-
从指定序列中随机获取指定长度片段
import random list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] a = random.sample(list, 5) print(list) print(a) ''' # 执行结果 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [8, 10, 3, 9, 6] '''
-
随机字符:
import random print(random.choice('abcdefg&#%^*f')) ''' # 执行结果 & '''
-
多个字符中选取特定数量的字符:
import random print(random.sample('abcdefghij', 3)) ''' # 执行结果 ['f', 'i', 'g'] '''
-
多个字符中选取特定数量的字符组成新字符串:
import random a = ''.join(random.sample(['a','b','c','d','e','f','g','h','i','j'], 3)).replace(" ","") print(a) ''' # 执行结果 ghj '''
-
随机选取字符串:
import random print(random.choice(['apple', 'pear', 'peach', 'orange', 'lemon'])) ''' # 执行结果 apple '''
-
洗牌:
import random items = [1, 2, 3, 4, 5, 6] random.shuffle(items) print(items) ''' # 执行结果 [4, 1, 3, 6, 5, 2] '''
学习时间:
- 周一至周五晚上 7 点—晚上9点
- 周六上午 9 点-上午 11 点
- 周日下午 3 点-下午 6 点
学习产出:
- CSDN 技术博客 1 篇
- 学习心得录音 1 个
- 作业
使用random模块编写一个能够产生随机验证码的代码
基本要求:产生固定位数的 比如四位
拔高要求:产生指定位数的 …
eg:
要产生四位随机验证码 J2nB
要产生五位随机验证码 JkO98
import random
# 生成小写字母列表
l1 = [chr(i) for i in range(97, 123)]
# 生成大写字母列表
l2 = [chr(i) for i in range(65, 91)]
# 生成0-9数字列表
l3 = ['%s' % i for i in range(0, 10)]
# 生成四位验证码
print(''.join(random.sample(l1 + l2 + l3, 4)).replace(" ", ""))
# 生成五位验证码
print(''.join(random.sample(l1 + l2 + l3, 5)).replace(" ", ""))