python代码块总结

Posted 蔚尺丈八声

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python代码块总结相关的知识,希望对你有一定的参考价值。

本文总结工作中频繁用到的python代码块。

python 中文注释规范

参考文献1234,总结对于python函数、方法、类的中文注释规范:

class ClassExample(object):
    """这里写对于类的简单描述(一句话总结)。

    这里写对于类的具体描述。

    TODO(可选):
        这里写将来可能对于类的改动。

    属性:
        属性名:属性类型 属性描述
    """

    def __init__(self, val):
        self.val = val

    def method_example(self, p):
        """这里写对于方法的简单描述(一句话总结)。

        这里写对于方法的具体描述。

        TODO(可选):
            这里写将来可能对于方法的一些改动

        用例(可选):
            具体写方法的使用例子。

        参数:
            参数名:参数类型 参数描述

        返回值:
            返回值类型 返回值描述

        异常(可选):
            异常类型 异常描述
        """
        self.val = p
        if p is None:
            raise TypeError
        return p


def function_example(p):
    """这里写对于函数的简单描述(一句话总结)。

    这里写对于函数的具体描述。

    用例(可选):
        具体写方法的使用例子。

    参数:
        参数名:参数类型 参数描述

    返回值:
        返回值类型 返回值描述

    异常(可选):
        异常类型 异常描述
    """
    if p is None:
        raise TypeError
    return p

用例:

from collections import deque

class TreeNode(object):
    """二叉树的结点类型。

    包含对二叉树结点的初始化、打印结点的操作。

    TODO:
       增加对二叉树删除、插入结点的操作。

    属性:
        val:int 根结点的值,默认为0
        left:TreeNode 左孩子结点,默认为None
        right:TreeNode 右孩子结点,默认为None
    """

    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

    def __str__(self):
        """打印二叉树中的所有结点。

        返回值:
            TreeNode 嵌套的结点
        """
        return f'<self.val, self.left, self.right>'


def build_tree(nodes):
    """构造一棵二叉树。

    思路:
        借助辅助队列,对输入的列表nodes构造二叉树。

        步骤:
            1.将nodes中第一个元素初始化为二叉树的根结点,并入辅助队列中。
            2.辅助队列出队一个元素root,然后进入循环:
                2.1.从左至右遍历nodes,每次遍历两个元素,第一个元素作为root的左孩子,第二个元素作为root的右孩子
                2.2.将root的左孩子、右孩子依次入辅助队列中
                2.3.一直循环2.1、2.2,直到nodes遍历结束

    参考:
        https://stackoverflow.com/questions/43097045/best-way-to-construct-a-binary-tree-from-a-list-in-python

    参数:
        nodes:list 装有数字的list,双亲存储结构,如nodes=[1,2]

    返回值:
        TreeNode 构建好的二叉树

    异常:
        StopIteration 对输入的列表,停止迭代时抛出的异常
    """
    iter_p = iter(nodes)
    tree = TreeNode(next(iter_p))
    assist_deque = deque([tree])  # 构造一个辅助队列(左出右进)
    while True:
        root = assist_deque.popleft()
        try:
            root.left = TreeNode(next(iter_p))
            root.right = TreeNode(next(iter_p))
            assist_deque.append(root.left)
            assist_deque.append(root.right)
        except StopIteration:
            break
    return tree

注意:

  • 类名采用大驼峰命名法(CamelCase),方法名、函数名采用(小写)下划线命名法(lower_upper_case)
  • 如在注释中额外增加字段,参照如下格式:
    """
    字段名:(冒号是中文冒号)
    	具体描述。(前面空一个tab)
    """
    
    用例:
    """
    思路:
    	该方法借鉴了某思路。
    """
    

glob.glob() 的排序问题

python 的 glob 模块,我们可以用它批量抓取某种格式、或者以某个字符打头的文件名5

这里假设读取一系列的图片文件,用 tree 命令显示的目录树如下67

E:\\>tree image /f
卷 DATA1 的文件夹 PATH 列表
卷序列号为 000000AE C262:5E49
E:\\IMAGE
    1.png
    10.png
    11.png
    12.png
    13.png
    14.png
    15.png
    16.png
    17.png
    18.png
    19.png
    2.png
    20.png
    21.png
    22.png
    23.png
    24.png
    3.png
    4.png
    5.png
    6.png
    7.png
    8.png
    9.png

没有子文件夹

这里显示的是以 1,10,11,12 … 的字符串排序的文件名,同样单纯以 glob.glob 顺序读取文件路径时也是这样的排序方式:

import glob

# 检索图片路径
img_paths = glob.glob("E:\\image\\\\*.png")

print(img_paths)

输出读取的文件顺序(以字符串排序):

['E:\\\\image\\\\1.png', 'E:\\\\image\\\\10.png', 'E:\\\\image\\\\11.png', 'E:\\\\image\\\\12.png', 'E:\\\\image\\\\13.png', 'E:\\\\image\\\\14.png', 'E:\\\\image\\\\15.png', 'E:\\\\image\\\\16.png', 'E:\\\\image\\\\17.png', 'E:\\\\image\\\\18.png', 'E:\\\\image\\\\19.png', 'E:\\\\image\\\\2.png', 'E:\\\\image\\\\20.png', 'E:\\\\image\\\\21.png', 'E:\\\\image\\\\22.png', 'E:\\\\image\\\\23.png', 'E:\\\\image\\\\24.png', 'E:\\\\image\\\\3.png', 'E:\\\\image\\\\4.png', 'E:\\\\image\\\\5.png', 'E:\\\\image\\\\6.png', 'E:\\\\image\\\\7.png', 'E:\\\\image\\\\8.png', 'E:\\\\image\\\\9.png']

为了能以 1,2,3 … 的数字排序方式顺序读取文件,代码改成:

import glob
import os

# 检索图片路径
img_paths = glob.glob("E:\\image\\\\*.png")
img_paths.sort(key=lambda x:int(os.path.split(x)[-1][:-4]))

print(img_paths)

输出:

['E:\\\\image\\\\1.png', 'E:\\\\image\\\\2.png', 'E:\\\\image\\\\3.png', 'E:\\\\image\\\\4.png', 'E:\\\\image\\\\5.png', 'E:\\\\image\\\\6.png', 'E:\\\\image\\\\7.png', 'E:\\\\image\\\\8.png', 'E:\\\\image\\\\9.png', 'E:\\\\image\\\\10.png', 'E:\\\\image\\\\11.png', 'E:\\\\image\\\\12.png', 'E:\\\\image\\\\13.png', 'E:\\\\image\\\\14.png', 'E:\\\\image\\\\15.png', 'E:\\\\image\\\\16.png', 'E:\\\\image\\\\17.png', 'E:\\\\image\\\\18.png', 'E:\\\\image\\\\19.png', 'E:\\\\image\\\\20.png', 'E:\\\\image\\\\21.png', 'E:\\\\image\\\\22.png', 'E:\\\\image\\\\23.png', 'E:\\\\image\\\\24.png']

注意上述 python 代码中的 img_paths.sort(key=lambda x:int(os.path.split(x)[-1][:-4])) 的执行细节:

  1. 先对读取的文件路径拆分出文件名。如 x 读取到的文件路径为 E:\\\\image\\\\1.png,那么 s.path.split(x)8 拆分结果为 ('E:\\\\image', '1.png'),然后 os.path.split(x)[-1] 获得文件名 '1.png'
  2. 取出文件名中的数字,以便下一步按数字排序的方式顺序读取文件。如 os.path.split(x)[-1][:-4],是借助 python 的索引切片原理910,对第 1 步中获取的 '1.png' 进行切片取得 '1',注意这里的 '1' 依然是字符串,如果直接按此排序,则依然为字符串排序的方式顺序读取文件。
  3. 对取出的数字从字符串变为 int 型,便于以数字排序的方式顺序读取文件。如 int(os.path.split(x)[-1][:-4]) 将第 2 步中所得的字符串 '1' 变为数字 1
  4. 然后再用 sort() 排序文件路径11

完整读取图片文件的代码如下:

import glob
import os
import cv2

# 检索图片路径
img_paths = glob.glob("E:\\image\\\\*.png")
img_paths.sort(key=lambda x:int(os.path.split(x)[-1][:-4]))

# 顺序读取图片
img_read=[]
for i in img_paths:
    img = cv2.imread(i)
    img_read.append(img)

print(img_paths)

这里采取先检索路径,再将所有图片文件一次性导入到内存中的方式。

pip 显示 python 库的版本信息

使用命令 pip show <安装包名>,即可查询所安装的 python 库,其版本等详细信息12

如查询所安装的 pandas 库的版本:

C:\\Users\\user>pip show pandas
Name: pandas
Version: 1.1.5
Summary: Powerful data structures for data analysis, time series, and statistics
Home-page: https://pandas.pydata.org
Author: None
Author-email: None
License: BSD
Location: c:\\users\\user\\appdata\\local\\programs\\python\\python36\\lib\\site-packages
Requires: numpy, pytz, python-dateutil
Required-by:

由此可知所安装的 pandas 库版本为 1.1.5,在安装 pandas 库之前可能需要安装的依赖库有:numpy、pytz 和 python-dateutil。


  1. Google开源项目风格指南.Python风格规范 ↩︎

  2. python-style-guide.注释和文档 ↩︎

  3. CSDN作者Johnny、me.Python笔记:文档注释docstrings, 让函数更易读懂 ↩︎

  4. CSDN作者zxnode.Python开发命名规范 ↩︎

  5. CSDN作者我从崖边跌落.【 python】 Python中gob.gob的排序问题 ↩︎

  6. Microsoft.Commands by Server Role/tree ↩︎

  7. StackExchange.Windows 10 powershell tree command how to show files ↩︎

  8. GeeksforGeeks.Python |os path.split method ↩︎

  9. 简书作者b499783e8279.python的索引和切片 ↩︎

  10. Stackoverflow.Index all except one item In python ↩︎

  11. Stackoverflow.How to sort file names in a particular order using python ↩︎

  12. note.nkmk.me.Check the version of Python package / library ↩︎

以上是关于python代码块总结的主要内容,如果未能解决你的问题,请参考以下文章

Python的语言基础总结之循环与字符串操作

经常进行数据处理?这6个 Python 代码块值得收藏

python中的3种控制流语句之while

python-unitest模块总结

Python函数知识点总结

深度盘点:总结30段最频繁使用的 Python 代码