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 日零点算起
- 格式化字符串
- 元组格式表示法: 结构体对象
| 索引 | 属性 | 值 |
|---|---|---|
| 0 | tm_year(年) | 4位正整数 |
| 1 | tm_mon(月) | 1-12 |
| 2 | tm_mday(日) | 1-31 |
| 3 | tm_hour(时) | 0-23 |
| 4 | tm_min(分) | 0-59 |
| 5 | tm_sec(秒) | 0-61 |
| 6 | tm_wday(weekday) | 0-6 (0表示周日) |
| 7 | tm_yday(一年中的第几天) | 1-366 |
| 8 | tm_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()) # 这样的加密方式速度更快

发表评论