python tricks

python tricks

社蕙 630 2022-11-08

安装库

pycocotools

参考安装pycocotools烦死了 - 知乎

用conda安装:

conda install -c conda-forge pycocotools

thop

参考python中对thop安装问题 - CSDN

pip install --upgrade git+https://github.com/Lyken17/pytorch-OpCounter.git

注释规范

主要的参考来自于:Google 开源项目风格指南

但是实际上发现如果使用google风格,vscode的编辑器提示就很不好看,所以还是推荐numpy里翻出来的写法(我也不知道叫什么风格):

    """
    绘制网表上的应力分布

    Parameters
    ----------
    fig:    一个Figure类
    ax:     fig附属的ax对象
            由subplots一类的函数产生

    distr:  一个一维张量,尺寸为(d),值范围是[0,1),升序排列
            表征了段上的被关心的应力位置分布
    mesh:   一个三维张量,尺寸为(l,s,2)
            表征了(线数,段数,坐标)
    sigma:  一个一维张量,尺寸为(l,s,d+1)
            表征了所有被关心的应力数值
    beta:   布尔值,可选
            为True时启用测试功能,不保证稳定

    Returns
    -------
    返回一个画在ax上的lineCollection
    和一个Colorbar对象
    """

string::处理多行字符串与缩进问题

对于在代码块中的多行字符串,如果跟随缩进,那么打印出来的字符串也会带上额外多出来的数层缩进,这非常的难受,因此需要引入textwrap.dedent()方法处理。在这种处理的情况下,记得将被处理的字符串同样标记为f-string,否则不能访问到其中的变量。关于f-string,更多的内容可以参考Python 3's f-Strings: An Improved String Formatting Syntax (Guide)

下面是例子:

# 产生vhdl状态机代码的脚本
import textwrap

for now in state:
    # indented code here ...
    out = f"""\
    WHEN {now.name} =>
        CASE pi_money IS
            WHEN "00" =>
                st <= {next0.name};
            WHEN "01" =>
                st <= {next1.name};
            WHEN "10" =>
                st <= {next2.name};
            WHEN OTHERS =>
                NULL;
        END CASE;
    """
    with open("./template.txt", "a") as f:
        f.write(f"{textwrap.dedent(out)}")
    # indented code here ...

reg::正则表达式

正则表达式在线测试

表达式速查表

下面是python使用正则表达式一般的写法:

re.match(r'^\d{3}\-\d{3,8}$', '010-12345')

Error: look-behind requires fixed-width pattern

(?<=[^n]\d+_)\d+这个表达式会报上面的错误。

总而言之,在使用(?<=[pattern]*)(?<![pattern])时,在[pattern]里请不要使用 ? , * , + 这些导致宽度不确定的元字符。如果非要用,建议

import regex as re

关于match

需要注意的是match一定会从头开始匹配。

print(re.findall(r"(?<=d_) d+","V0 n1 8000 174000 0 1.8"))
print(re.match(r"(?<=d_) d+","V0 n1 8000 174000 0 1.8"))
['8000', '174000']
None

Dict::可变对象

参考菜鸟教程 - Python append() 与深拷贝、浅拷贝

如果在多次迭代中,直接使用list.append(dict),最后你会得到一个所有元素都一样的list,这是因为append不是复制,他只是拿到了dict的指针放进去。如果要避免这种情况,需要使用copy模块:

import copy 
alist.append( copy.deepcopy( num ) )