基本变量与运算
- 整数:
1
、0xff00
、int('123')
、int(1.23)
- 浮点数:
1.23
、1.23e2
、1.2e-5
、float('1.23')
- 字符串:
'abc'
、str(123)
、str(1.23)
- 布尔值、运算符、布尔表达式:
True
、False
,and
、or
、not
,3 > 2
- 变量(类型不固定,因此无需定义类型):
a = 1
,a = 'abc'
vi. 精确除:/
,例如10 / 3
的结果为3.33333333…
vii. 整数除://
,例如10 // 3
的结果为3
viii. 格式化字符串:'Age: %s. Gender: %s' % (25, True)
ix. 条件判断:(注意python是用缩进来代替{}的,注意判断语句后的冒号)
if a == 0:
print("a == 0")
elif a == 1:
print("a == 1")
else:
print("a is not 0 or 1")
x. 循环:可以用break和continue。
- for循环,数组迭代。
for x in [1,2,3]:
print("x = ", x)
- for循环,range迭代。用range(N)生成0 ~ N - 1的整数序列
for x in range(5):
print("x = ", x)
- while循环。
x = 0
while x < 3:
x += 1
常用容器类型
list
- 说明:list也就是常用的数组/链表,数据按顺序存储。
- 定义:
s = ['Apple', 123, ['asp', 'php'],True]
- 初始化:
s = [0] * 100
- 取出元素:
s[1]
、s[2][1]
、s[-1]
(等价于s[len(s) - 1]
) - 计算长度:
len(s)
- 追加元素:
s.append('Adam')
- 插入:
s.insert(1, 'Jack')
- 扩展(追加列表):
s.extend(ss)
- 删除元素:
s.pop(1)
,默认不加参数为删除最后一个(index = -1
)。 - 排序:
s.sort()
- 查找元素序号:
pos = s.index(value)
- 切片:
-
s[ :3]
(取前3个元素) -
s[1:4]
(取1~3共3个元素) -
s[-3: ]
(取最后3个元素) -
s[ :10:2]
(取前10个元素,每2个取1个,从第一次切片中的0元素开始计数) -
s[::5]
(所有元素,每5个取1个,从0元素开始计数) -
s[:]
(原样复制一个list) - 备注:tuple和字符串也可以按照如上切片规律操作
-
- Counter:Counter(list)来计算list中的set以及各个元素出现的次数。
tuple
- 说明:tuple也即元组,是一旦初始化就不能修改的list
- 定义:
t = ('Michael', 'Bob', 'Tracy')
,特例:定义一个元素的tuple,t = (1, )
set
- 说明:set也即集合,类似于没有重复元素的list
- 定义:
s = set([1, 2, 3])
(要创建一个set,需输入一个list以供初始化) - 添加一个元素:
s.add(4)
- 删除一个元素:
s.remove(4)
- 求两个set的交集、并集:
s1 & s2
、s1 | s2
dic
- 说明:dic也即字典,也就是map,通过键值对(key value)存储数据。
- 定义:
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
- 通过key取value:d['Michael']
- 通过key给value赋值(覆盖value,或者添加键值对):
d['Bob'] = 67
,d['Az'] = 69
- 将dict2添加到dict中:
dict.update(dict2)
- 判断元素存在:
'Thomas' in d
或者d.get('Thomas', -1)
- 删除键值对:
d.pop('Bob')
- 遍历key:
for key in dic:
,按排序后的key遍历:for i in sorted (dic) :
常用语法
main函数
main函数可以简单认为是python脚本的起始点,但实际在main之前会执行全局代码段,因此实际不用main函数代码也可以执行。
main函数写法如下:
if __name__ == '__main__':
print("hello world!")
说明:__name__
变量是一个特殊的内置Python变量,它显示当前模块的名称。如果当前函数对应文件为程序执行文件,则__name__
被标记为'__main__'
,否则__name__
被标记为模块名称,这可以用于区分当前文件是执行文件还是作为模块被导入的文件。通过下述这种方式在python脚本中标记main函数,可以使得main中的代码在程序作为独立脚本时运行,而作为导入模块时不会运行。
定义函数
格式为:def <函数名>(<参数表>): <表达式>
注意对于python而言,不需要分号断句,但对缩进有严格要求。
函数定义举例如下:
def max(a,b):
return a if a > b else b
调用函数
直接调即可:
a = max(1,2)
导入函数
格式为:from <文件名> import <函数名> ,文件名不含.py,例如:
from util import timer
如果想全部导入,可以使用:
from util import *
导入模块
直接用import
关键字导入即可,例如:
import sys
import numpy as np
如果运行提示没有安装对应模块,可以使用pip install <package name>来安装。
执行顺序
python程序执行顺序是按照全局代码块到main函数来执行的,因此对于下述代码,执行顺序是:
导入sys模块 -> 执行global变量a初始化赋值 -> 执行global打印 -> 执行main函数 -> 执行test函数 -> 执行变量a赋值
import sys
a = 1
print("global")
def test():
print("test")
if __name__ == '__main__':
print("main")
test()
a = 2
常用第三方库使用方法
numpy
说明:numpy是一个数学库,主要用于数组和矩阵的计算。
- 生成矩阵:
- 生成一维矩阵:
np.array([1,2,3,4])
、np.array(range(1,5))
、np.arrange(5)
- 生成二维矩阵:
np.array([1,2],[3,4])
、np.array([1,2,3,4]).reshape(2,2)
- 生成零矩阵:
np.zeros(shape=(2,2))
- 生成一矩阵:
np.ones(shape=(2,2))
- 生成n * n的单位矩阵:
np.identity(n)
、np.diag([1] * n)
、np.eye(n)
- 生成一维矩阵:
- 矩阵最大、最小、平均值:
np.max(img)
,np.min(img)
,np.mean(img)
- 矩阵按值筛选,生成0、1掩膜矩阵:
img < 3.14
- 矩阵变形:
A.reshape(m,n)
- 带通截止:
np.clip(img, thresh_low, thresh_high)
- 矩阵点乘A·B:
np.dot(A,B)
或者A.dot(B)
,按位乘Ai*Bi:A * B
- 矩阵叉乘AxB:
np.cross(A,B)
- 求矩阵的模:
np.linalg.norm(A)
- 求矩阵的逆:
np.linalg.inv(img)
- 求矩阵的转置:
A.T
、A. transpose()
pyplot
说明:pyplot是Matplotlib 的子库,提供了和MATLAB 类似的绘图API,主要用于科学绘图。
- 导入pyplot:
from matplotlib import pyplot as plt
- 各种图绘制:
- 散点图:
plt.scatter(x,y, s = 5)
,其中x、y为数据对应的list,下同。 - 点线图:
plt.plot(x,y,label='a',color='g',marker='o', linewidth=1, alpha=0.6)
- 直方图:
plt.hist(x, color = "g")
- 柱状图:
plt.bar(x,y,label='pass',alpha = 0.6,fc = 'c')
,可用Counter(origin_list)
将一个有原始数据的list转换为统计频度的map,map的key为list中的各数据,也即x
,value为出现的次数,也即y
。 - 在同一坐标轴中绘制两套数据:以绘制对比柱状图为例,再次调用
plt.bar([x1+0.1 for x1 in x], y, label = 'fail',alpha = 0.6,fc = 'r')
,其中x1+0.1
是将第二套数据在坐标轴中总体偏移0.1,用于区分两套数据。 - 绘制多个子图:
plt.subplot(NMi)
,绘制N
行M
列的第i
张图,例如121
指绘制1
行2
列子图中的第1
张图。
- 散点图:
- 图片参数修改:
- 修改图片标题:
plt.title(str)
- 调整x、y轴坐标刻度:
plt.xticks(x_label)
、plt.yticks(y_label)
,其中x_label
、y_label
为希望标注的刻度值的list。 - 设置x、y轴标题:
plt.xlabel(str)
、plt.ylabel(str)
- 设置图例:
plt.legend(loc='upper center', shadow=True, fontsize='x-large')
,根据plot的label自动设定图例文字。 - 边缘留白:
plt.margins(2, 2)
- Subplot间距:
plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
,前四个参数为整幅图在画面中的上下左右位置,1代表是100%,hspace
和wspace
代表副图间隔与单幅图的大小比例。说明见:https://blog.csdn.net/ggt55ng6/article/details/88879689 - 图片大小:
plt.figure(figsize=(60,60))
- 可用
marker
标记:
- 修改图片标题:
OpenCV
说明:OpenCV是一个计算机视觉库,主要用于图像处理。
- 读取图像:
img = cv2.imread(img_dir, cv2.IMREAD_UNCHANGED)
- 写出图像:
cv2.imwrite(path, img)
- 获取图像宽高与位数:
img.shape
、img.dtype
- 获取BGRA通道:
b,g,r,a = cv2.split(img)
- 合并成新图:
img = cv2.merge((b, g, r, a))
- 缩放:
new_img = cv2.resize(img, (new_w,new_h), fx=x_ratio, fy=y_ratio, interpolation=cv2.INTER_AREA)
- Padding:
new_img = cv2.copyMakeBorder(img, pad_top, pad_bottom, pad_left, pad_right, cv2.BORDER_CONSTANT, value=0)
Dataframe
说明:Dataframe是pandas库的一个表格型的数据结构,在对表操作时会用到。
- 生成空的Dataframe:
df = pd.Dataframe()
- 从csv中读取:
df = pd.read_csv(file_path,index_col="index")
- 列名列表:
df.columns
- 行名列表:
df.index
- 增加一列:
df[key] = val
- 修改列名:
df.rename(columns={'a':'A'})
- 按行列获取数据:
df.loc[index_a, COL_A]
,获取index_a行,COL_A列的数据 - 按某一列值获取数据:
df.loc[df[df[key_a] == val_a].index.tolist()[0], key_b]
,key_a
列为val_a
的第一行中,key_b
列的值。 - 筛选A列数据并返回筛选后的dataframe:
df [df[COL_A] > val]
- 筛选A列数据并返回对应B列的值:
list(df [df[COL_A] > val][COL_B])
- 增加一条数据:
s = pd.Series(list(infoMap.values()),index=infoMap.keys())
df.append(pd.DataFrame({nid:s}).T)
- 去重:
df.drop_duplicates(COL_A)
- 删除指定列:
df.drop(columns=[COL_A, COL_B, COL_C])