Python3使用積累
最近可能要經常使用Python,所以記錄一下Python的相關用法。
演算法競賽中的積累
- 頭寫法
if __name__ == '__main__':1
- 初始化\輸入
1.讀取一維陣列
arr = list(map(int, input().split(' ')))2.初始化全0的二維陣列
st = [[0 for col in range(n)] for row in range(m)]3.讀入n,m
n, m = map(int, input().split(' '))12345678
- 輸出
1.輸出一維陣列的值print(' '.join(map(str, arr)))2.輸出float,保留小數點後6位,冒號後接整數表述輸出寬度,點後面加6表示保留小數點後6位print('{:.6f}'.format(n))123456
- 字串
1.判斷某個字串字首,例如"I love you"中的單詞,
是否有"yo"這個字首,有則輸出下標(3),否則輸出-1for i, s enumerate(str.split()):
if (s.startswith("yo")) return i + 1return -112345
- 其他技巧
1.交換陣列第i位和第j位的值
arr[i], arr[j] = arr[j], arr[i]2.三目運算子
st = 1 if n < 0 else 03.函式中使用全域性變數,記得宣告 global,避免混淆1234567
- 陣列
1.陣列常用方法 len(list) 返回陣列長度 max(list) 返回陣列最大的數 list.append(obj) 向陣列插入一個物件 list.count(obj) 統計陣列某個物件的個數 list.index(obj) 返回某個物件的索引 list.inser(index, obj) 在某個位置插入物件 list.pop(index=-1) 彈出某個index下標的數,預設最後一個元素,並返回該值 list.remove(obj) 移除列表中某個物件的第一個匹配項 list.reverse() 翻轉 list.sort(key=None, reverse=False) 排序1234567891011
資料科學中的使用
- 字典
1.增:update可以批次新增
dic.update({'name': 'zouyuhang', 'sex': 'man'})2.刪:del,pop del dic['sex']
dic.pop('sex')3.查:get, 當查詢的key不存在的時候,返回預設值
dic.get('sex', 0)4.改:
dic['name'] = 'tom'5.遍歷 for key, value in dic.items():
print(key, value)123456789101112
- 函式
1.任意引數 def func(*name):
...123
- 元組
animals = ('souge', 'lama')1.index索引
animals = ('souge', 'lama')
print(animals.index('lama')) # 1 2.count計數 print(animals.count('lama')) # 13.元組拆包
x, y = (7, 10);
a, b, *c = (1, 2, 3, 4, 5)
print("Value of x is {}, the value of y is {}.".format(x, y))4.列舉
friends = ('Steve', 'Rachel', 'Michael', 'Monica')
for index, friend in enumerate(friends):
print(index,friend)1234567891011121314
- Python隨機數
# 1.random()方法即可隨機生成一個[0,1)範圍內的實數import random
ran = random.random()print(ran) #0.7948628379323708 # 2.預先使用 random.seed(x) 設定好種子之後,# 其中的 x 可以是任意數字,# 此時使用 random() 生成的隨機數將會是同一個。print ("------- 設定種子 seed -------")random.seed(10)print ("Random number with seed 10 : ", random.random())# 3. randint()生成一個隨機整數ran = random.randint(1,20)print(ran)123456789101112131415
- Python物件導向
class Person:
def __init__(self,name):
self.name = name print ('呼叫父類建構函式')
def eat(self):
print('呼叫父類方法')
class Student(Person): # 定義子類
def __init__(self):
print ('呼叫子類構造方法')
def study(self):
print('呼叫子類方法')s = Student() # 例項化子類s.study() # 呼叫子類的方法s.eat() # 呼叫父類方法123456789101112131415161718
- Python JSON
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式,易於人閱讀和編寫。 json.dumps 用於將 Python 物件編碼成 JSON 字串。 為了提高可讀性,dumps方法提供了一些可選的引數。 1.sort_keys=True表示按照字典排序(a到z)輸出。 2.indent引數,代表縮排的位數 3.separators引數的作用是去掉,和:後面的空格,傳輸過程中資料越精簡越好 json.loads 用於解碼 JSON 資料。該函式返回 Python 欄位的資料型別。
# 1.json.dumps 用於將 Python 物件編碼成 JSON 字串。import json
data = [ { 'b' : 2, 'd' : 4, 'a' : 1, 'c' : 3, 'e' : 5 } ]json = json.dumps(data)print(json) # [{"b": 2, "d": 4, "a": 1, "c": 3, "e": 5}]import json
jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}'text = json.loads(jsonData) #將string轉換為dictprint(text)12345678910
- 常見Linux命令
1.gzip常用引數:
-d或--decompress或--uncompress:解壓檔案;
-r或--recursive:遞迴壓縮指定資料夾下的檔案(該資料夾下的所有檔案被壓縮成單獨的.gz檔案);
-v或--verbose:顯示指令執行過程。
注:gzip命令只能壓縮單個檔案,而不能把一個資料夾壓縮成一個檔案(與打包命令的區別)。1234
2.tar常用引數
最常用的是將tar命令與gzip命令組合起來,直接對資料夾先打包後壓縮
-c或--create:建立新的備份檔案;
-x或--extract或--get:從備份檔案中還原檔案;
-v:顯示指令執行過程;
-f或--file:指定備份檔案;
-C:指定目的目錄;
-z:透過gzip指令處理備份檔案;
-j:透過bzip2指令處理備份檔案。1234567
3.zip常用引數
-v:顯示指令執行過程;
-m:不保留原檔案;
-r:遞迴處理。123
unzip常用引數
-v:顯示指令執行過程;
-d:解壓到指定目錄12
Demo:
# 展示當前目錄ls /home# 顯示當前路徑pwd # cp :複製檔案或目錄cp test.txt ./test_copy.txt# mv:移動檔案與目錄,或修改檔案與目錄的名稱mv /home/aistudio/work/test_copy.txt /home/aistudio/data/# rm :移除檔案或目錄rm /home/aistudio/data/test_copy.txtrm -rf /var/log/httpd# 將檔案壓縮為檔案 test.txt.gz,原來的檔案則沒有了,解壓縮也一樣gzip /home/aistudio/work/test.txtgzip -d /home/aistudio/test.gz# tar本身是一個打包命令,用來打包或者解包字尾名為.tar。配合引數可同時實現打包和壓縮。tar -zcvf /home/aistudio/work/test.tar.gz /home/aistudio/work/test.txttar -zxvf /home/aistudio/work/test.tar.gztar -xvf MobileNetV2_pretrained.tar
# zip,unzipzip -r /home/aistudio/work/test.zip /home/aistudio/work/test.txt
unzip /home/aistudio/work/test.zip
12345678910111213141516171819202122232425262728
- OS常用命令
# 列出某個資料夾下所有的檔案os.listdir(dir) # 檔案路徑拼接os.path.join(root, item)# 判斷某個檔案是否是資料夾os.path.isdir(path)1234567
Numpy
import numpy as np1
建立
通常,陣列的元素最初是未知的,但它的大小是已知的。因此,NumPy提供了幾個函式來建立具有初始佔位符內容的陣列。
zeros():可以建立指定長度或者形狀的全0陣列
ones():可以建立指定長度或者形狀的全1陣列
empty():建立一個陣列,其初始內容是隨機的,取決於記憶體的狀態
為了建立數字組成的陣列,NumPy提供了一個類似於range的函式,該函式返回陣列而不是列表。
#將列表轉換為陣列array = np.array([[1,2,3],
[4,5,6]])print(array)# 生成全0或者全1的陣列zeros_data = np.zeros((2, 3)).astype("int32")ones_data = np.ones((3, 3), dtype='int64')emptyarray = np.empty((3,4))arr = np.arange(0, 10)12345678910
還可以輸出陣列的一些資訊,如維度、形狀、元素個數、元素型別等
array = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])print(array)#陣列維度print(array.ndim) # 2#陣列形狀print(array.shape) # (4, 3)#陣列元素個數print(array.size) # 12#陣列元素型別print(array.dtype) # int64array1 = np.arange(6).reshape([2,3])123456789101112
計算
矩陣乘法
#矩陣乘法arr3 = np.array([[1,2,3],[4,5,6]])arr4 = np.ones([3,2],dtype=np.int64)print(arr3)print(arr4)print(np.dot(arr3,arr4))123456
矩陣的其他計算
arr = np.eye(2, 3, dtype=np.int64)print(arr)print(np.sum(arr, axis=0)) # 按列求和print(np.max(arr, axis=1)) # 按行求和print(np.argmax(arr, axis=1)) # 按行求最大值對應的索引arr3_tran = arr3.transpose() # 轉置print(arr3_tran)print(arr3.flatten()) # 壓成一維陣列12345678910
Pandas
Series
Series其實就類似於C++的unordered_map,鍵值對的形式,用列的形式來看,其實就相當於一個資料集的屬性,index代表資料的編號,value代表該屬性(例如年齡等)。區別是Series允許key重複,但是unordered_map不行。
Series中最重要的一個功能是:它會在算術運算中自動對齊不同索引的資料
Series 和多維陣列的主要區別在於, Series 之間的操作會自動基於標籤對齊資料。因此,不用顧及執行計算操作的 Series 是否有相同的標籤。
import numpy as npimport pandas as pd
s = pd.Series(['a', 'b', 'c'])print(s)#與字典不同的是:Series允許索引重複s = pd.Series(['a','b','c','d','e'],index=[100,200,100,400,500])print(s)# Series 可以用字典例項化d = {'b': 1, 'a': 0, 'c': 2}pd.Series(d)# 可以透過Series的values和index屬性獲取其陣列表示形式和索引物件print(s.values)print(s.index)# Series進行運算時,對應index的位置會進行計算a = pd.Series([1, 2, 3], index=['a', 'b', 'c'])b = pd.Series([3, 2, 1], index=['c', 'b', 'a'])print(a + b)print(a * b)1234567891011121314151617181920212223
DataFrame
DataFrame就相當於平常的資料集的樣式,第一列是對應資料的編號(索引),之後的列相當於資料的每個屬性。
DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典(共用同一個索引)
DataFrame生成
用多維陣列字典、列表字典生成 DataFrame
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}frame = pd.DataFrame(data)print(frame)123
#如果指定了列順序,則DataFrame的列就會按照指定順序進行排列frame1 = pd.DataFrame(data, columns=['year', 'state', 'pop'])print(frame1)123
跟原Series一樣,如果傳入的列在資料中找不到,就會產生NAN值
frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=['one', 'two', 'three', 'four', 'five'])print(frame2)12
PIL庫
PIL庫是一個具有強大影像處理能力的第三方庫。
影像的組成:由RGB三原色組成,RGB影像中,一種彩色由R、G、B三原色按照比例混合而成。0-255區分不同亮度的顏色。
影像的陣列表示:影像是一個由畫素組成的矩陣,每個元素是一個RGB值
Image 是 PIL 庫中代表一個影像的類(物件)
from PIL import Imageimport matplotlib.pyplot as plt#顯示matplotlib生成的圖形%matplotlib inline#讀取圖片img = Image.open('/home/aistudio/work/mingren.jpg') plt.imshow(img) plt.show(img) #獲得影像的模式img_mode = img.modeprint(img_mode)width,height = img.sizeprint(width,height)1234567891011121314151617
圖片旋轉
from PIL import Imageimport matplotlib.pyplot as plt#顯示matplotlib生成的圖形%matplotlib inline#讀取圖片img = Image.open('/home/aistudio/work/mingren.jpg') #顯示圖片plt.imshow(img) plt.show(img) #將圖片旋轉45度img_rotate = img.rotate(45) #顯示旋轉後的圖片plt.imshow(img_rotate) plt.show(img_rotate) 12345678910111213141516
圖片剪下
from PIL import Image#開啟圖片img1 = Image.open('/home/aistudio/work/mingren.jpg') #剪下 crop()四個引數分別是:(左上角點的x座標,左上角點的y座標,右下角點的x座標,右下角點的y座標)img1_crop_result = img1.crop((126,0,381,249))#儲存圖片img1_crop_result.save('/home/aistudio/work/mingren_result.jpg')#展示圖片plt.imshow(img1_crop_result) plt.show(img1_crop_result) 123456789101112131415
圖片縮放
from PIL import Image#開啟圖片img2 = Image.open('/home/aistudio/work/mingren.jpg') width,height = img2.size#縮放img2_resize_result = img2.resize((int(width*0.6),int(height*0.6)),Image.ANTIALIAS)print(img2_resize_result.size)#儲存圖片img2_resize_result.save('/home/aistudio/work/yushuxin_resize_result.jpg')#展示圖片plt.imshow(img2_resize_result) plt.show(img2_resize_result) 123456789101112131415161718
映象效果:左右旋轉、上下旋轉
from PIL import Image#開啟圖片img3 = Image.open('/home/aistudio/work/yushuxin.jpg') #左右映象img3_lr = img3.transpose(Image.FLIP_LEFT_RIGHT)#展示左右映象圖片plt.imshow(img3_lr) plt.show(img3_lr) #上下映象img3_bt = img3.transpose(Image.FLIP_TOP_BOTTOM)#展示上下映象圖片plt.imshow(img3_bt) plt.show(img3_bt) 123456789101112131415161718
Matplotlib
matplotlib.pylot是繪製各類視覺化圖形的命令字型檔
繪製折線圖
import matplotlib.pyplot as plt
import numpy as np
#顯示matplotlib生成的圖形
%matplotlib inline
x = np.linspace(-1,1,50) #等差數列
y = 2*x + 1
#傳入x,y,透過plot()繪製出折線圖
plt.plot(x,y)
#顯示圖形
plt.show()123456789101112131415
繪製兩條折線到一張圖中
import matplotlib.pyplot as pltimport numpy as np
plt.figure(figsize=(7,5))plt.plot(x,y1,color='red',linewidth=1)plt.plot(x,y2,color='blue',linewidth=5)plt.xlabel('x',fontsize=20)plt.ylabel('y',fontsize=20)plt.show()123456789
折現圖註釋
import matplotlib.pyplot as pltimport numpy as np
l1, = plt.plot(x,y1,color='red',linewidth=1)l2, = plt.plot(x,y2,color='blue',linewidth=5)plt.legend(handles=[l1,l2],labels=['aa','bb'],loc='best')plt.xlabel('x')plt.ylabel('y')# plt.xlim((0,1)) #x軸只擷取一段進行顯示# plt.ylim((0,1)) #y軸只擷取一段進行顯示plt.show()1234567891011
散點圖
# dots1 = np.array([2,3,4,5,6])# dots2 = np.array([2,3,4,5,6])dots1 =np.random.rand(50)dots2 =np.random.rand(50)plt.scatter(dots1,dots2,c='red',alpha=0.5) #c表示顏色,alpha表示透明度plt.show()1234567
柱狀圖
x = np.arange(10)y = 2**x+10plt.bar(x,y,facecolor='#9999ff',edgecolor='white')plt.show()1234
顯示柱狀圖數值
x = np.arange(10)y = 2**x+10plt.bar(x,y,facecolor='#9999ff',edgecolor='white')for ax,ay in zip(x,y):
plt.text(ax,ay,'%.1f' % ay,ha='center',va='bottom')plt.show()123456
測試題
1.查詢特定名稱檔案
遍歷”Day1-homework”目錄下檔案;
找到檔名包含“2020”的檔案;
將檔名儲存到陣列result中;
按照序號、檔名分行列印輸出。
注意:提交作業時要有程式碼執行輸出結果。
#匯入OS模組import os#待搜尋的目錄路徑path = "Day1-homework"#待搜尋的名稱filename = "2020"#定義儲存結果的陣列result = []def findfiles(root, target):
#在這裡寫下您的查詢檔案程式碼吧!
items = os.listdir(root)
for item in items:
path = os.path.join(root, item)
if os.path.isdir(path):
findfiles(path, target)
elif path.find(target) != -1:
result.append(path)if __name__ == '__main__':
findfiles(path, filename)for idx, name in enumerate(result):
print("[{}, '{}']".format(idx+1, name))
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2744315/,如需轉載,請註明出處,否則將追究法律責任。