1. 正则表达式
1.1. 匹配任意字符:.*
re.findall(r'(因|受).*影响', event)
1.2. 匹配至少一个字符:.+
re.findall(r'(因|受).+影响', event)
1.3. 匹配任意长数字:\d+
1.4. 匹配某几个字符:r'(a|b|c)'
注意,'.'等字符在正则表达式中是特殊字符的类型,则需要\.进行转义。
2. 日期操作
2.1. 日期格式转换:strptime函数
datetime.strptime(_str, "%Y-%m-%d %H:%M")
其中‘-’可以换为其他字符如'/'或'.'以适配其他格式。
年月日时分秒格式不能调用该函数,秒不会舍去,而是报错。只能严格使用年月日时分格式。
还可以在后面附上“ %p”表示显示AM或PM。
2.2. 日期计算
def get_duration(
timestamp1: str,
timestamp2: str,
):
# 将时间字符串解析为datetime对象
timestamp1 = datetime.strptime(timestamp1, "%Y/%m/%d %H:%M:%S")
timestamp2 = datetime.strptime(timestamp2, "%Y/%m/%d %H:%M:%S")
# 计算时间差
time_difference = timestamp1 - timestamp2
# 提取小时、分钟和秒
hours, remainder = divmod(time_difference.total_seconds(), 3600)
minutes, seconds = divmod(remainder, 60)
# 格式化结果
result = "{:02}:{:02}:{:02}".format(int(hours), int(minutes), int(seconds))
# 打印结果
print(result)
return result
2.3. eval日期格式的字符串
假设当前有一个字符串“datetime.datetime(2023, 11, 12, 17, 2)”,希望能通过eval函数将其转换为一个datetime.datetime对象,需要在当前eval函数所在文件中导入datetime
import datetime
# 错误示范:from datetime import datetime
2.4. 日期格式转换
年月日时分格式转换为年月日格式:date函数
datetime.datetime(2023, 11, 12, 10, 12).date()
2.5. 日期排序
datetime.datetime类型支持sort和sorted函数。
2.6. 求n个月之后的月份
引入relativedelta函数
from datetime import datetime
from dateutil.relativedelta import relativedelta
# 给定的 datetime 对象
given_date = datetime(2023, 11, 15)
# 计算接下来的第 n 个月的日期
n = 3 # 例如,计算接下来的第三个月
next_month_date = given_date + relativedelta(months=n)
# 打印结果
print(next_month_date)
3. 优化表达
3.1. 检验可迭代元素中所有元素的类型是否为整数
例如,当检验列表month中所有元素是否都为整数:
all(isinstance(m, int) for m in month)
3.2. 刷新输出
有时输出太多需要反复滚轮翻看过于麻烦,可以选择如下表达:
for i in range(100):
print(f'\r{i}', end='')
3.3. 定义可加二元组/可加多元列表
注意两者的区别。由于元组不可改变,因此在重新定义时应用__new___函数,而不是__init__。
class Tuple(tuple):
def __new__(cls, num1, num2):
return super(Tuple, cls).__new__(cls, (num1, num2))
def __add__(self, other):
return Tuple(self[0] + other[0], self[1] + other[1])
class List(list):
def __init__(self, *args):
super().__init__(args)
def __add__(self, other):
assert len(self) == len(other)
return List(*[self[i] + other[i] for i in range(len(self))])
3.4. 组合问题
从M个元素中抽取N个元素的组合:
from itertools import combinations
letters = ['A', 'B', 'C', 'D']
choose_two = list(combinations(letters, 2))
3.5. 得出所有参数组合
在对模型的参数进行网格搜索时,需要逐一测试参数组合:
import itertools
hyper_params = {
'A': [3, 4, 5, 6],
'B': [5, 10, 15, 20],
'C': [0.005, 0.0005, 0.00005, 0.001, 0.0001, 0.00001],
}
all_param_combinations = list(itertools.product(*hyper_params.values()))
# 得出所有组合可能数
total_combinations = len(all_param_combinations)
3.6. 从N个元素中随机选择一个
使用random.choice()函数即可。
3.7. 创建可迭代的循环列表
import itertools
# 创建一个列表
my_list = [1, 2, 3, 4, 5]
# 使用 itertools.cycle 创建一个无限循环迭代器
cycler = itertools.cycle(my_list)
# 通过迭代器获取下一个元素
for i in range(10):
next_element = next(cycler)
print(next_element)
3.8. 构建可显示信息的自定义异常
class Exception_msg(Exception):
def __init__(self, message):
super().__init__(message)
3.9. 为什么不要用内置函数等作为变量
当定义了内置函数作为变量后,编译器会默认把这个函数作为变量/对象,而使得函数无法调用。
list = [1, 2, 3, 4]
print(list(range(3, 5)))
4. 环境
4.1. 常用命令
4.1.1. 创建conda环境
conda create -n envname python=3.5.22
4.1.2. python更新pip
pip install --upgrade pip
4.1.3. python下载requirements
pip install -r requirements.txt
4.1.4. 将项目依赖的包输出到指定文件中
pip freeze > d:\requirements.txt
4.1.5. python显示版本
pip show ____
4.1.6. conda删除环境
conda remove -n envname --all
4.1.7. conda显示环境
conda env list
4.1.8. 导出和导入环境(创建一个和已有环境相同内容的新环境)
conda env export > environment.yml
conda env create -f environment.yml
4.1.9. 更新环境
conda update -n envname -c defaults conda
4.2. 找不到已下载的库
先通过以下代码获取当前使用的python环境:
import sys
print(sys.executable)
然后在terminal中运行以下代码:
/path/to/python -m pip install statsmodels
其中/path/to/python换成当前使用的python环境的地址。
4.3. 打包文件
pyinstaller --noconsole your_script.py
其中指定--noconsole是在打包完成运行时不打开命令行。否则会自动打开命令行。
4.4. 查看当前使用的python环境路径
import sys
current_environment = sys.prefix
print("当前使用的Python环境路径:", current_environment)
5. Unity开发
5.1. 设置单例物体
private void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject); // 使该物体在场景切换时不被销毁
}
else
{
Destroy(gameObject);
return;
}
}
5.2. 将小数转换为百分数
string percentage = (value * 100).ToString("0") + "%";
6. Jupyter
6.1. 自动加载
无需重启内核,自动加载修改过后的python模块
%load_ext autoreload
%autoreload 2
6.2. markdown中富文本字体
<font color="red">调整字体为红色</font>
<b>粗体</b>
[创造超链接](#1)
6.3. 动态显示图形
from IPython import display
self.fig, self.axes = plt.subplots(nrows=n_rows, ncols=n_cols, figsize=figsize)
display.display(self.fig)
display.clear_output(wait=True)
self.fig是一个Matplotlib图形对象,display.clear_output(wait=True) 用于清除当前单元格的输出,等待用户在清除输出后继续执行后续操作,而不是堆叠多个图形。
7. 文件操作
7.1. OS文件操作
7.1.1. 获取文件的父目录路径:os.path.dirname
其中dirname函数接收一个参数,为文件名。
7.1.2. 分离文件名与拓展名:os.path.splitext
7.2. 无法编码0x8b
报错原因是因为目标文件很可能是压缩后的文件,此时设置encoding参数为utf-8也是无效的。正解应该用gzip包进行解码后读取。
with gzip.open('yolo.cfg', 'rb') as cfg_file:
print(cfg_file.read().decode('utf-8'))
通过此法即可输出文件中的内容。