1、掌握time、random库的常用用法。
2、了解collection库,掌握Counter、namedtuple、deque函数的含义和用法。
3、了解itertools库,掌握enumarate、zip、product等函数的含义和用法。
Python自身提供了比较丰富的生态,拿来即用,可极大的提高开发效率。
一、time库
Python处理时间的标准库
1、获取现在时间
- time.localtime():本地时间
- time.gmtime():UTC世界统一时间
北京时间比世界统一时间早8个小时
import time
t_local = time.localtime()
t_UTC = time.gmtime()
print("t_local: ", t_local) # 本地时间
print("t_UTC: ", t_UTC) # UTC统一时间
print(time.ctime()) # 返回本地时间的字符串
"""
t_local: time.struct_time(tm_year=2020, tm_mon=2, tm_mday=8, tm_hour=12, tm_min=9, tm_sec=9, tm_wday=5, tm_yday=39, tm_isdst=0)
t_UTC: time.struct_time(tm_year=2020, tm_mon=2, tm_mday=8, tm_hour=4, tm_min=9, tm_sec=9, tm_wday=5, tm_yday=39, tm_isdst=0)
Sat Feb 8 12:09:09 2020
"""
2、时间戳与计时器
- time.time():返回自纪元以来的秒数,记录sleep
- time.perf_counter():随意选取一个时间点,记录现在时间到该时间点的间隔秒数,记录sleep
time.process_time():随意选取一个时间点,记录现在时间到该时间点的间隔秒数,不记录sleep
3、格式化
time.strftime:自定义格式化输出
import time
t_local = time.localtime()
print(time.strftime("%Y-%m-%d %H:%m:%S", t_local))
"""
2020-02-08 12:16:51
"""
4、休眠
time.sleep(m):休眠m秒
二、random库
随机数在计算机应用中十分常见,Python通过random库提供各种伪随机数,基本可以用于除加密解密算法外的大多数工程应用
1、随机种子——seed(a=None)
- 相同种子会产生相同的随机数
如果不设置随机种子,以系统当前时间为默认值
2、产生随机整数
- (1) randlint(a, b):产生[a, b]之间的随机整数
- (2) randrange(a):产生[0, a)之间的随机整数
(3) randrange(a, b, step):产生[a,b)之间以step为步长的随机整数
3、产生随机浮点数
- (1) random():产生[0.0, 1.0]之间的随机浮点数
- (2) uniform(a, b):产生[a, b]之间的随机浮点数
from random import *
numbers = [uniform(2.1, 3.5) for i in range(10)]
print(numbers)
"""
[2.1929577529017896, 2.1924724048023942, 2.774429454086627,
2.8437011579509877, 2.124246843787783, 3.28800355840583,
2.1034517877154464, 2.1154575533581137, 2.1230887166888635, 3.209706038847072]
"""
4、序列用函数
- choice(seq)——从序列类型中随机返回一个元素
choice(['win', 'lose', 'draw'])
choice("python")
- choice(seq.weights = None,k)——对序列类型进行k次重复采样,可设置权重
from random import *
print(choices(['win', 'lose', 'draw'], [4, 4, 2], k=10))
"""
['draw', 'lose', 'lose', 'win', 'draw',
'draw', 'lose', 'lose', 'win', 'win']
"""
- shuffle(seq)——将序列类型中元素随机排列,返回打乱后的序列
sample(pop, k)——从pop类型中随机选取k个元素,以列表类型返回
5、概率分布——以高斯分布为例
gauss(mean, std):生产一个符合高斯分布的随机数
import matplotlib.pyplot as plt
from random import *
res = [gauss(0, 1) for i in range(10000)]
plt.hist(res, bins=1000)
plt.show()
三、collections库——容器数据类型
1、namedtuple——具名元组
collections.namedtuple(typename, filed_name, *, rename=False, defaults=None, module=None)
- typename是元组名字,field_names是域名
import collections
Point = collections.namedtuple("Point", ["x", "y"])
p = Point(1, y=2) # Point(x=1, y=2)
# 可以调用属性
print(p.x)
print(p.y)
# 有元组的属性
print(p[0])
print(p[1])
x, y = p
print(x, y)
# 确实是元组的子类
print(isinstance(p, tuple)) # True
模拟扑克牌
2、Counter——计数器工具
- 是字典的一个子类 # isinstance(Counter(), dict) #True
```python
from collections import Counter
s = "牛奶奶找刘奶奶买牛奶"
colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
cat_str = Counter(s)
cat_color = Counter(colors)
print(cat_str)
print(cat_color)
"""
Counter({'奶': 5, '牛': 2, '找': 1, '刘': 1, '买': 1})
Counter({'blue': 3, 'red': 2, 'green': 1})
"""
- 最常见的统计——most_common(n):提供n个频率最高的元素和计算
print(cat_color.most_common(2)) # [('blue', 3), ('red', 2)]
- 元素展开——elements()
print(list(cat_str.elements()))
# ['牛', '牛', '奶', '奶', '奶', '奶', '奶', '找', '刘', '买']
- 其他的一些加减操作
c = Counter(a=3, b=1)
d = Counter(a=1, b=2)
print(c+d)
# Counter({'a': 4, 'b': 3})
3、双向队列——deque
列表访问数据非常快速,插入和删除非常慢——通过移动元素位置来实现,特别是insert(0, v)和pop(0),在列表开始进行的插入和删除操作
双向列表可以方便的在队列两边搞笑、快速的增加和删除元素
from collections import deque
d = deque('cde')
d.append("f") # 在右端添加
d.appendleft("g") # 在左端添加
print(d) # deque(['g', 'c', 'd', 'e', 'f'])
d.pop() # 右端删除
d.popleft() # 左端删除
print(d) # deque(['c', 'd', 'e'])
"""
Counter({'奶': 5, '牛': 2, '找': 1, '刘': 1, '买': 1})
Counter({'blue': 3, 'red': 2, 'green': 1})
"""
其他用法参照官网
四、Itertools库——迭代器
1、排列组合迭代器
- (1)product——笛卡尔积
import itertools
for i in itertools.product('ABC', '01'):
print(i)
for i in itertools.product('ABC', repeat=3):
print(i)
"""
('A', '0')
('A', '1')
('B', '0')
('B', '1')
('C', '0')
('C', '1')
('A', 'A', 'A')
('A', 'A', 'B')
('A', 'A', 'C')
('A', 'B', 'A')
('A', 'B', 'B')
('A', 'B', 'C')
('A', 'C', 'A')
('A', 'C', 'B')
('A', 'C', 'C')
('B', 'A', 'A')
('B', 'A', 'B')
('B', 'A', 'C')
('B', 'B', 'A')
('B', 'B', 'B')
('B', 'B', 'C')
('B', 'C', 'A')
('B', 'C', 'B')
('B', 'C', 'C')
('C', 'A', 'A')
('C', 'A', 'B')
('C', 'A', 'C')
('C', 'B', 'A')
('C', 'B', 'B')
('C', 'B', 'C')
('C', 'C', 'A')
('C', 'C', 'B')
('C', 'C', 'C')
"""
- (3)combinations——组合
- (4) combinations_with_replacement——元素可重复组合
(2)permutations——排列
2、拉链
- (1)zip——短拉链:相同位置上的元素组合在一起
import itertools
for i in zip("ABC", "012", "xyz"):
print(i)
"""
('A', '0', 'x')
('B', '1', 'y')
('C', '2', 'z')
"""
# 长度不一致是,执行到最短的对象处就停止
for i in zip("ABC", "012345"):
print(i)
"""
('A', '0')
('B', '1')
('C', '2')
"""
- (2) zip_longest——长拉链:长度不一时,执行到最长的对象处,就停止,缺省元素用None或指定字符代替
import itertools
for i in itertools.zip_longest("ABC", "012345"):
print(i)
"""
('A', '0')
('B', '1')
('C', '2')
(None, '3')
(None, '4')
(None, '5')
"""
for i in itertools.zip_longest("ABC", "012345", fillvalue="?"):
print(i)
"""
('A', '0')
('B', '1')
('C', '2')
('?', '3')
('?', '4')
('?', '5')
"""
3、无穷迭代器
- (1) count(start=0, step=1)——计数:创建一个迭代器,从start值开始,返回均匀间隔的值
- (2) cycle(iterable)——循环:创建一个迭代器,返回iterable中所有元素,无限重复
(3) repeat(object, times)——重复:创建一个迭代器,不断重复object,除非设定参数times,否则将无限重复
4、其他
- (1) chain(iterable)——锁链:把一组迭代对象串联起来,形成一个更大的迭代器
import itertools
for i in itertools.chain("ABC", "012"):
print(i)
"""
A
B
C
0
1
2
"""
- (2) enumerate(iterable, start=0)——枚举(Python内置):产生由两个元素组成的元组,结构是(index, item),其中index从start开始,item从iterable中取
```python
import itertools
for i in enumerate("Python", start=1):
print(i)
"""
(1, 'P')
(2, 'y')
(3, 't')
(4, 'h')
(5, 'o')
(6, 'n')
"""
- (3)groupby(iterable, key=None)——分组:创建一个迭代器,按照key指定的方式,返回iterable中连续的键和值。一般来说需要预先对数据进行排序,key为None默认把连续重复元素分组
import itertools
animal = ['duck', 'eagle', 'rat', 'giraffe', 'bear', 'bat', 'dolphin', 'shark', 'lion']
# 按照长度进行排序
animal.sort(key=len)
print(animal)
"""
['rat', 'bat', 'duck', 'bear', 'lion', 'eagle', 'shark', 'giraffe', 'dolphin']
"""
for key, group in itertools.groupby(animal, key=len):
print(key, list(group))
"""
3 ['rat', 'bat']
4 ['duck', 'bear', 'lion']
5 ['eagle', 'shark']
7 ['giraffe', 'dolphin']
"""
# 按照首字母大小排序
animal.sort(key=lambda x: x[0])
print(animal)
"""
['bat', 'bear', 'duck', 'dolphin', 'eagle', 'giraffe', 'lion', 'rat', 'shark']
"""
for key, group in itertools.groupby(animal, key=lambda x: x[0]):
print(key, list(group))
"""
b ['bat', 'bear']
d ['duck', 'dolphin']
e ['eagle']
g ['giraffe']
l ['lion']
r ['rat']
s ['shark']
"""