python之python标准库

python之python标准库

1. 前言

python自身提供了比较丰富的生态,拿来即用,可极大提高开发效率。

2. time库

处理时间的标准库。

2.1 获取现在时间

  • 本地时间
time.localtime()

获取的是地区时间

  • UTC世界统一时间
time.gmtime()

北京时间比世界统一时间早8个小时。

  • 返回本地时间的字符串
time.ctime()

2.2 时间戳与计时器

  • 返回纪元以来的秒数,记录sleep
time.time()
  • 随意选择一个时间点,记录现在时间到该时间点的间隔描述,记录sleep
time.perf_counter()

精度比time()高

  • 随意选择一个时间点,记录现在时间到该时间点的间隔描述,不记录sleep
time.process_time()

2.3 格式化输出

time.shifttime自定义格式化输出

lctime = time.localtime()
time.shifttime("%Y-%m-%d %A %H:%M:%S", lctime)

A为星期

2.4 睡觉觉

time.sleep(休息的时间,秒)

3. random库

随机数在计算机应用中十分常见,random库提供各种伪随机数,基本可以用于加密解密算法外的大多数工程应用。

3.1 随机种子 – seed(a=None)

  • 相同种子会产生相同的随机数
  • 如果不设置随机种子,以系统时间为默认值
import random
seed(10)
print(random.random())
seed(10)
print(randrom.random())

3.2 产生随机整数

3.2.1 randint(a, b) – 产生[a, b]之间的随机整数

nums = [randrom.randint(1,10) for i in range(10)]
nums

3.2.2 randrange(a) – 产生[0, a)之间的随机整数

nums = [randrom.randrange(10) for i in range(10)]

3.2.3 randrange(a, b, step) – 产生[a, b)之间以step为步长的随机整数

nums = [randrom.randrange(0, 10, 2) for i in range(10)]

3.3 产生随机浮点数

3.3.1 random() – 产生[0.0, 1.0)之间的随机浮点数

nums = [randrom.random() for i in range(10)]

3.3.2 uniform(a,b) – 产生[a, b]之间的随机浮点数

nums = [randrom.uniform(2.1, 3.6) for i in range(10)]

3.4 序列化函数

3.4.1 choice(seq) – 从序列类型中随机返回一个元素

randrom.choice(['win', 'lose', 'draw'])
randrom.choice('python')

3.4.2 choices(seq, weight=None, k) – 对序列类型进行k次重复采样,可设置权重

k次: 选k次
重复采用: 每一次才取都是从原始序列取

randrom.choice(['win', 'lose', 'draw'], k=5)
randrom.choice(['win', 'lose', 'draw'], [4, 4, 2], k=5)

3.4.3 shuffle(seq) – 将序列类型中元素随机排序,返回打乱后的序列

nums = ['one', 'two', 'three']
randrom.shuffle(nums)
nums

3.4.4 sample(pop, k) – 从pop类型中随机选取k个元素,以列表类型返回

k必须小于等于pop序列中的长度

randrom.sample([10, 20, 30, 40], k=3)

3.5 概率分布

3.5.1 gauss(mean, std) – 产生一个符合均值为mean标准差为std的高斯分布的随机数

import matplotlib.pyplot as plt
number = randrom.gauss(0, 1)
nums = [randrom.gauss(0, 1) for i in range(10000)]
plt.hit(nums, bins=1000)
plt.show()

3.6 案例

3.6.1 简单的红包发送

  • 要求
    随机分发红包,并保证每人得到得金额期望相同。
  • 代码
def red_packet(total, num):
	ls = []
	for i in range(1, num):
		per = round(random.uniform(0.01, total/(num-i+1)*2),2)
		ls.append(per)
		total = total - per
	else:
		ls.append(total)
	return ls
  • 说明
random.uniform(a, b)

rangdom.unifrom()是从[a,b]中随机取小数,即为均匀分布,每一个取值的期望为(a+b)/2,为了让红包程序保证分包得公平性中,在每一轮分发的过程中,每一个per的期望为total/n,则b应该设置为2*total/n。

3.6.2 产生随机验证码

  • 要求
    产生4位由数字和字母构成的验证码
  • 代码
import string
def check_code(4):
	S = string.digits + string.ascii_letters
	code = random.sample(S, 4)
	return code

4. collections库

提供容器数据类型

4.1 具名元组 – namedtuple

在普通的tuple中的,是直接存的。并不知道存储的数字和声明的tuple对象是什么含义。
namedtuple就是给存储的数值和声明的tuple对象赋予含义。

4.1.1 实例创建

  • 语法
collections.namedtuple(typename, field_name, *, rename = False, defaults = None, module = None)

typename: tuple对象名字
field_name: 存储的对象名字

  • 实例
Point = collections.namedtuple("Point", ["x", "Y"])
p = Point(1, y=1)
print(p)

4.1.2 属性调用

  • 语法
对象.fieldname
  • 实例
p.X
p.Y

4.1.3 namedtuple具有元组的性质

namedtuple是tuple的子类,用下面代码可以判断

print(isintance(p, tuple))

namedtuple具有如下性质:

# 索引
p[0]
p[1]

# 赋值
a, b = p
print(a)
print(b)

4.1.4 模拟扑克牌

  • 要求
    模拟一副不带大小王的扑克牌,每一张牌含有牌面大小和花色
  • 代码
    构建namedtuple可以存放大小和花色
def poker():
	
	# 声明带有大小和花色的namedtuple对象
	Card = collections.namedtuple("Card", ["rank", "suit"])
	
	# 声明rank和suit范围
	ranks = [str(n) for n in range(2, 11)] + list("JQKA")
	suits = "spades diamands clubs hearts".split()
	
	# 产生扑克牌
	cards = [Card(rank, suit) for rank in ranks
							  for suit in suits 

由于cards是序列,因此可以调用shuflle进行打乱,继续模拟扑克其它操作。

4.2 Counter – 计数器工具

4.2.1 引入

  • 语法
Cunter(Seq)

会自动统计Seq中每一个元素出现的次数,以字典形式返回

  • 实例
from collections immport Counter
color = ["red", "red", "blue"]
S = "adfasddad"
cnt_col = Counter(color)
cnt_S = Counter(S)

4.2.2 介绍

Counter是字典的一个子类,判断:

print(isinstance(Counter(), dict))

4.2.3 统计最top n位的元素

利用most_common(n),只返回出现频率最高的n个元素,以字典的形式

cnt_col.most_common(3)

4.2.4 将Counter()结果进行展开

利用elements()函数,可以将Counter返回的字典结果进行展开,获取每一个元素

cnt_col.elements()

4.2.5 其它的加减操作

c = Counter(a=6, b=3)
d = Counter(a=1, b=2)
c+d

上面代码输出:
Counter(a=7, b=5)

4.3 双向队列 – deque

列表中访问数据非常快速,但是由于要通过移动元素位置来实现元素的删除和插入,因此插入和删除非常慢。特别是在首位插入或者删除首位时。
双向队列可以方便在队列两边高效,快速的增加和删除元素

4.3.1 语法和实例

  • 语法
deque(seq)
  • 实例
from collections import deque
d = deque("adfws")

4.3.2 插入操作 append和appendleft

## 在列表的尾部操作
d.append("d")

## 在列表的开始增加
d.appendleft("y")

4.3.3 删除操作pop和popleft

## 删除尾部数据
d.pop()

## 删除首位元素
d.popleft()

5. itertools库 – 迭代器

itertools提供各种产生迭代器的方法

5.1 排列组合迭代器

5.1.1 product – 笛卡尔积

从每个对象取分别取一个数值构成新的组合,返回是一个迭代,元组元素是每一个对象取出的元素

import iertools

# 不同对象产生
for i in itertools.product("abc", "12"):
	print(i)

# 自己产生
for i in itertools.product("abc", repeat=3):
	print(i)

5.1.2 permutations – 排列

从对象中选择n个元素构成新的排序

for i in itertools.permutations("ABCD", 3):
	print(i)

上述代码含义是从"ABCD“中取3个元素进行排序,存在顺序要求。

for i in itertools.permutations("ABCD"):
	print(i)

上述代码含义是从"ABCD“中取”ABCD“长度个元素(即4个)进行排序,存在顺序要求。

5.1.3 combinations – 组合

  • 组合中(A, B)和(B, A)是同样的组合
  • 没有重复元素的, 即没有(A, A)。
for i in itertools.combinations("ABCD", 2):
	print(i)

上述代码含义是从"ABCD"中选择2个元素进行组合。
在组合中,组合的字数是不能缺省的。

5.1.4 combinations_with_replacement – 元素可以重复的组合

即可以取重复元素,例如可以取到(A, A)

for i in itertools.combinations_with_replacement("ABC", 2)print(i)

5.2 拉链

将相同位置的元素进行组合

5.2.1 短拉链

  • 利用zip函数
  • 组合到长度最小的对象则停止组合,如
for i in zip("ABC", "123344"):
	print(i)

上述输出结果:
(A, 1), (B, 2), (C, 3)

5.2.2 长拉链

  • 利用zip_longgest函数
  • 组合到长度最长的对象则停止组合,缺省的元素是None或者指定字符代替,如
for i in zip_longest("ABC", "1234"):
	print(i)

上述输出结果:
(A, 1), (B, 2), (C, 3), (None, 4)

for i in zip_longest("ABC", "1234", fillvalue = "?"):
	print(i)

上述输出结果:
(A, 1), (B, 2), (C, 3), (?, 4)

5.3 无穷迭代器

5.3.1 count(start=0, step=1) – 计数

创建一个迭代器,从start开始,以步长为step返回均匀间隔的值

itertools.count(10, 1)

5.3.2 cycle(iterable) – 循环迭代

创建一个迭代器,返回iterable中所有元素,无限重复

itertools.cycle("ABC")

5.3.3 repeat(object [, times]) – 重复

创建一个迭代器,不断重复object;除非设置参数times,让obeject重复times次,否则将无限重复object。

for i in itertools.repeat(10, 10):
	print(i)

5.4 其它

5.4.1 chain(iterables) – 锁链

把一组迭代器对象串联起来,形成一个更大的迭代器

for i in itertools.chain("ABC", [1, 2, 3]):
	print(i)

5.4.2 enumerate(iterable, start=0) – 枚举(python内置)

产生由两个元素组成的元组,结构是(index, iterm), 其中index从start开始,item从iterable中取

for i in enumerate("Python", start=1):
	print(i)

5.4.3 groupby(iterable, key=None) – 分组

创建一个迭代器,按照key指定的方式,返回iterable中连续的键和组;
一般来说,要原先对数据进行排列
key默认为None, 默认把连续重复元素分组

for key, group in itertools.groupby("AAADDFSSS"):
	print(key, list(group))

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值