基本變量與運算
- 整數:
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
標記:
image.png
- 修改圖片標題:
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])