Python 标准库

1. re 与正则表达式

(1) 正则表达式基本语法

(2) re 模块

1) 匹配语句及参数

pattern 表示正则表达式, string 表示目标字符串, modulFunction 表示 re 模块中的函数

import re
# 创建模式对象匹配
Pattern = re.compile(pattern, flags = None) # 此处的正则表达式需要加上 r 或 R
Pattern.moduleFunction(string)

# 直接匹配
re.moduleFunction(pattern, string, flags = None) # 声明匹配模式

# 关于 flags 的说明:
flags = re.I # 忽略字母大小写
flags = re.M # 多行匹配模式
flags = re.S # 强化元字符 "." , 使之能匹配换行符
flags = re.X # 忽略正则表达式中的空格, 并可以使用 # 进行注释

2) 常用函数

import re

re.search(pattern, string) # [懒惰匹配] 若匹配成功, 返回一个 match 对象, 否则返回 None
re.findall(pattern, string) # [贪婪匹配] 若匹配成功, 返回一个 list 列表, 否则返回空列表 []
re.split(pattern, string, maxsplit = None)# 字符串 split 的扩展, 按照 pattern 规则分隔, 最多分隔 maxsplit 次
re.sub(pattern, repl, string) # 将 pattern 匹配到的字符串替换成 repl

案例: 倒数的循环节

单位分数指分子为1的分数. 分母为2至10的单位分数的十进制表示如下所示:

1/2= 0.5

1/3= 0.(3)

1/4= 0.25

1/5= 0.2

1/6= 0.1(6)

1/7= 0.(142857)

1/8= 0.125

1/9= 0.(1)

1/10= 0.1

这里0.1(6)表示0.166666…, 括号内表示有一位循环节. 可以看出, 1/7有六位循环节.

找出正整数d < 1000, 其倒数的十进制表示小数部分有最长的循环节.

'''使用正则表达式进行匹配'''
import re

result = (0, 1)
for i in range(2, 1000):
   ILen = len(re.findall(r'^\d*?(\d+?)\1\d*?$', str(10 ** 5000 // i))[0])
   result = (ILen, i) if ILen > result[0] else result

print(result[1])

2. os 系统相关操作

os 模块提供了操作系统功能的接口函数

import os

(1) 系统级命令

os.name                     # 操作系统名字, windows返回nt, linux返回posix
os.system('命令')   # 调用 cmd 执行命令, 返回状态码, print 结果(有编码问题, 一般用 popen)
os.popen('ipconfig').read() # 创建管道, 调用 fock() 生成子进程, 执行 shell 命令, 使用 read 捕获输出文本

(2) 路径操作

os.getcwd()                 # 返回当前工作目录
os.chdir(path) # 改变工作目录为 path, 一般运行某个py文件时, 会自动切换至该文件所在路径
os.listdir(path=’.’) # 列举指定目录中的文件名(‘.’表示当前目录, ’..’代表上一级目录), 默认列举当前py文件所在路径

os.path.basename(path) # 去掉目录路径, 单独返回文件名
os.path.dirname(path) # 去掉文件名, 单独返回目录路径

os.path.exists(path) # 判断指定路径(目录或文件)是否存在
os.path.isabs(path) # 判断指定路径是否为绝对路径
os.path.isdir(path) # 判断指定路径是否存在且是一个目录
os.path.isfile(path) # 判断指定路径是否存在且是一个文件

os.path.split(path) # 分割文件名和路径, 返回(f_path,f_name)元组
os.path.splitext(path) # 分离文件名与扩展名, 返回(f_name,f_extension)元组
os.path.join(path1,path2) # 将 path1,path2 各部分组合成一个路径名

os.path.join(os.path.expanduser("~"), 'Desktop') # 桌面路径

(3) 文件操作

os.mkdir(path)          # 创建单层目录, 如该目录已存在抛出异常
os.makedirs(path) # 递归创建多层目录, 如果该目录已经存在则抛出异常
os.rmdir(path) # 删除单层目录, 如改目录非空则抛出异常
os.removedirs(path) # 递归删除目录, 从子目录到父目录逐层尝试删除, 遇到目录非空则抛出异常.

os.path.getsize(file) # 返回指定文件的尺寸, 单位是字节
os.path.getatime(file) # 返回指定文件最近的访问时间(浮点型秒数, 可用time模块的gmtime()或localtime()函数换算)
os.path.getctime(file) # 返回指定文件创建时间(浮点型秒数, 可用time模块的gmtime()或localtime()函数换算)
os.path.getmtime(file) # 返回指定文件最新的修改时间(浮点型秒数, 可用time模块的gmtime()或localtime()函数换算)返回True或False的函数

os.rename(old,new) # 将文件old 重命名为new, 文件和目录都使用这条命令
os.remove(path) # 删除文件

案例: 列出当前文件夹下的所有 Python 源文件

[filename for filename in os.listdir() if filename.endswith(('.py', '.pyw'))]

3. time 时间操作

time 模块提供了时间戳数据处理及本地计算机时间处理功能. 常用的时间表示形式有两种:

  • 时间戳表示法: 以整型或浮点型表示, 一个以秒为单位的时间间隔, 这个时间的基础值是从 1970 年 1 月 1 日零点算起
  • 格式化字符串
  • 元组格式表示法: 结构体对象
索引属性
0tm_year(年)4位正整数
1tm_mon(月)1-12
2tm_mday(日)1-31
3tm_hour(时)0-23
4tm_min(分)0-59
5tm_sec(秒)0-61
6tm_wday(weekday)0-6 (0表示周日)
7tm_yday(一年中的第几天)1-366
8tm_isdst(是否是夏令时)默认为 -1 (自动判断) 0 表示正常格式 1 表示夏令时格式
import time

(1) 获取当前时间

time.time()                         # 当前时间戳
time.strftime('%Y-%m-%d %H:%M:%S') # 获取当前时间戳, 并进行格式化
time.localtime() # 当前时间戳的结构体对象

time.sleep(time) # 进程休眠

(2) 时间格式转换

time.strptime('2018-8-8','%Y-%m-%d')    # 将字符串格式时间转换成为结构体时间, 可以使用%H%M%S继续匹配
time.strftime('%Y-%m-%d %H:%M:%S',time.strptime('2018-8-8','%Y-%m-%d'))# 将结构体时间转化为指定的字符串格式
time.strftime("%X", time.localtime()) # '13:42:25'

time.mktime(time.strptime('2018-8-8','%Y-%m-%d')) # 将结构体时间转换为时间戳
time.gmtime(0) # 将时间戳转化为结构体时间

4. random 随机数生成

random 是 Python 内建的随机数及随机生成模块. 在 numpy 中实现了 array、matrix 对象的随机方法. random 模块指定的区间都是左右闭的.

import random

random.random()    # 生成 [0, 1] 的随机浮点数
random.uniform(a,b) # 生成 [a, b] 或 [b, a] 之间的随机浮点数, 不需要考虑大小关系
random.randint(a,b) # 生成 [a, b] 之间的整数
random.randrange(start, stop, step)        # 生成 range(start, stop, step) 的整数, 此处是左闭右开

random.choice(iterable) # 从所给 iterable 中随机抽取1个元素
random.sample(iterable, k) # 从所给 iterable 中不重复地随机抽取k个元素, 返回列表

random.shuffle(iterable) # 打乱 iterable 的顺序, 这是原位改变, 没有返回值, 要做好数据备份!

5. itertools 迭代对象

itertools 是 Python 内建的迭代对象处理模块, 实现了许多迭代操作、组合数、循环队列操作.

(1) 无限迭代器

无限迭代器本质上是生成器, 不会预先生成占用内存, 每一次迭代都是都是一次使用马上销毁

import itertools

natuals = itertools.count(start=0, step=1) # 创建一个从 start 开始, 步数为 step 的无限迭代器
itertools.cycle(iterable) # 循环无限迭代器
itertools.repeat(value, times=float('inf'))  # 重复 time 次, 默认为无穷次, 相当于 [value] * times, 但这种写法不占用空间

(2) 处理输入序列迭代器

itertools.starmap(func, seq)                # 作用于无穷序列的 map 方法
itertools.zip_longest(iterable1, iterable2, iterable3, ...) # 作用于无穷序列的 zip 方法
itertools.compress(iterable, selectors) # 选择迭代器, 与filter类似, 但此处的selectors不是函数, 而是该函数的返回值.
# True,False 等, 也可以是其他能类似表达的语句, 如 [] 可以表示 False
itertools.takewhile(lambda x: x <= 10, natuals) # 创建一个带逻辑判断的迭代器, 满足条件才会继续迭代, natuals是无限迭代器之一
itertools.chain(iterable1, iterable2, iterable3, ...) # 串联不同的迭代器, 遍历完第一个继续遍历第二个第三个...

(3) 组合生成器

itertools.product(iterable1, iterable2, iterable3,...)  # 笛卡尔积
itertools.product(iterable, repeat) # repeat 个 iterable 的笛卡尔积
itertools.permutations(iterable, r=len(iterable)) # iterable 中 r 个不重复元素的有序组合, 默认为全长度
itertools.combinations(iterable, r) # iterable 中 r 个不重复元素的无序组合
itertools.combinations_with_replacement(iterable, r) # iterable 中 r 个可重复元素的无序组合

6. collections 内置数据类型强化

collections 是 Python 内建的集合模块, 提供了许多集成集合类操作, 内部实现了许多数据类型的强化功能.

(1) namedtuple 扩展元组

namedtuple 融合了类的属性表示方法(也可以使用下标表示)及元组的不变性, 使用方便. 这种数据类型是 tuple 的子类

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)

# 该代码创建了一个 namedtuple 实例并命名为 Point. 这个实例限制了输入数据的维度为 2, 按序命名为 x, y 点对, 可以通过下标和属性引用
p.x == p[0]
p.y == p[1]
isinstance(p, tuple) # 表明这种数据类型确实是 tuple 的子类, 元素无法修改

(2) deque 双端队列

使用 list 存储数据时, 按索引访问元素很快, 但是插入和删除元素比较慢, 因为 list 是线性储存, 数据量大时, 插入和删除操作的效率很低.

deque 是为了高效实现插入和删除操作的双向列表, 适用于队列和栈:

from collections import deque
q = deque(['a', 'b', 'c', 'd', 'e'])

deque 兼容 list 列表的操作, 还提供了如下方法:

q.appendleft(value)     # 左侧追加一个元素
q.extendleft(list1) # 左侧扩展序列
q.popleft() # 左侧弹出元素

q.rotate(index) # 循环移位, + 为右移位, - 为左移位

(3) defaultdict 全局默认键字典

在一般的字典中, 若引用的 key 不存在, 会抛出异常(可以使用 get 方法设置默认参数值). defaultdict 兼容 dict 字典的操作, 会为字典设置全局默认值, 若不存在, 则返回这个默认值.

from collections import defaultdict

a = defaultdict(lambda: 'N/A') # 设置默认值, 返回 'N/A'

d.default_factory = lambda : ‘A/N’ # 修改默认值, 必须是有返回值的函数

(4) OrderedDict 有序字典

默认的字典不论是键值, 都是无序的(集合特征), 而 OrderedDict 会按照生成的顺序排列.

from collections import OrderedDict         # 保持字典录入顺序
favorite_languages = OrderedDict()

favorite_languages['jen'] = 'python'
favorite_languages['sarah'] = 'c'
favorite_languages['edward'] = 'ruby'
favorite_languages['phil'] = 'python'
for (name, language) in favorite_languages.items():
print(name.title() + "'s favorite language is " + language.title() + ".")

使用 popitem( last = True ) 进行弹出时, 也会按照顺序弹出(默认弹出最后一个, 若改为 False 则为先入先出)

(5) Counter 计数器

Counter 是一个简单的计数器, 可以用于统计频数, 返回一个字典对象

from collections import Counter

Counter(计数对象) # 如传入一个列表, 会统计列表元素的频数

7. functools 高阶函数

(1) reduce 归并函数

将两个参数的函数从左至右依次作用于序列中的项, 直到序列归并为单个值(分治)

Input: reduce(func, iterable)

Output: func(func(iterable[0], iterable[1]), iterable[2])…

函数的第一个参数是上一次的计算值(第一次迭代则为可迭代序列的第一个值), 第二个参数是迭代序列的下一个值…

案例: 实现 sum 函数

from functools import reduce

def sum(iterable):
   '''阶乘'''
   return 1 if n == 0 else reduce(lambda x, y: x * y, iterable)

案例: 实现阶乘函数

from functools import reduce

def factorial(n):
   '''阶乘'''
   return 1 if n == 0 else reduce(lambda x, y: x * y, range(1, n + 1))

(2) partial 偏函数

偏函数用于包装函数, 为函数指定默认参数以简化形式(如 int2, int8, int16 实际上就是对 int 函数指定了不同的 base)

更改函数的默认值参数, 功能上包含于装饰器, 但语法更为简单.

from functools import partial

int2 = partial(int,base = 2) # 包装 int(base = 2), 此后调用 int2 时会自动指定base = 2, 相当于更改函数的默认值

int2('11110')
>>> 30

8. json 解析库

JSON 是轻量级的文本数据交换格式, 前后端的数据交互, 其实就是 JSON 和 Python 进行数据交互. JSON 数据原本是不能被 Python 识别, 需要使用 json 模块进行转码

  • 名称必须用双引号(即: ")来包括
  • 值可以是双引号包括的字符串、数字、true、 false、 null、 数组,或对象
import json
data = {'name': "张柳彬", 'age': 20, 'grade': [100, 99, 98], 'school': ('湖南师范大学', '浙江大学'), '国防生': None, 'boy': True, 'girl': False} # 构造字典

json_data = json.dumps(data) # 将字典转为 json
python_data = json.loads(json_data) # 将 json 转为 python 数据对象

with open("xxxx.json", "w+") as f:
   json.dump(json_data, f) # 写入文件
   
with open("xxxx.json", "r") as f:
   python_data = json.load(f) # 从文件导入

9. hashlib 哈希加密

import hashlib

password = "123456"
md5 = hashlib.new('md5', password.encode()) # md5 只能对字节加密, 返回哈希对象
print(md5.hexdigest()) # 获取加密结果, 转为字符串
print(md5.digest()) # 获取加密结果, 转为二进制格式

# md5 = hashlib.md5(password.encode()) # 这样的加密方式速度更快

标签

发表评论