踩过的深坑/常用的技巧

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'))

通过此法即可输出文件中的内容。

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值