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]))
的执行细节:
- 先对读取的文件路径拆分出文件名。如
x
读取到的文件路径为E:\\\\image\\\\1.png
,那么s.path.split(x)
8 拆分结果为('E:\\\\image', '1.png')
,然后os.path.split(x)[-1]
获得文件名'1.png'
。 - 取出文件名中的数字,以便下一步按数字排序的方式顺序读取文件。如
os.path.split(x)[-1][:-4]
,是借助 python 的索引切片原理910,对第 1 步中获取的'1.png'
进行切片取得'1'
,注意这里的'1'
依然是字符串,如果直接按此排序,则依然为字符串排序的方式顺序读取文件。 - 对取出的数字从字符串变为 int 型,便于以数字排序的方式顺序读取文件。如
int(os.path.split(x)[-1][:-4])
将第 2 步中所得的字符串'1'
变为数字1
。 - 然后再用
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。
以上是关于python代码块总结的主要内容,如果未能解决你的问题,请参考以下文章