Day-20 基礎模組1
一、collections模組
collections模組主要封裝了一些關於集合類的相關操作
1.Counter
counter是一個計數器,主要用來計數
low: s = "alex like pig" dic = {} for c in s: dic[c] = dic.get(c, 0) + 1 print(dic) nb: s = "alex like pig" print(Counter(s)) # 獲取到的結果可以像字典一樣進行使用 [key]
2.deque 雙向佇列
(重點)說雙向佇列之前我們需要了解兩種資料結構. 1. 棧, 2. 佇列
1. 棧: FILO. 先進後出 -> 砌牆的磚頭, 老師傅做饅頭
2. 佇列: FIFO. 先進先出 -> 買火車票排隊, 所有排隊的場景
棧:由於python沒有給出Stack模組,所以我們自己手動寫一個粗略版本(注意:此版本存在嚴重的高併發問題)
1 class StackEmptyError(Exception): 2 pass 3 4 class StackFullError(Exception): 5 pass 6 7 class Stack: 8 def __init__(self, size):Stack棧9 self.index = 0 10 self.size = size 11 self.lst = [] 12 13 def pop(self): 14 if self.index > 0: 15 ret = self.lst[self.index] 16 return ret 17 else: 18 raise StackEmptyError("stack has already empty") 19 20 def push(self, el):21 if self.index > self.size: 22 raise StackFullError("stack is full") 23 else: 24 self.lst[self.index] = el 25 self.index = self.index + 1 26 27 def clear(self): 28 self.lst.clear() 29 self.index = 0 30 31 def __sizeof__(self): 32 return len(self.lst) 33 34 def max(self): 35 return self.size 36 37 def now(self): 38 return self.index
佇列:python提供了queue模組,使用起來非常方便
1 import queue 2 q = queue.Queue() 3 q.put("李嘉誠") 4 q.put("張開") 5 q.put("張毅") 6 print(q) 7 print(q.get()) 8 print(q.get()) 9 print(q.get())queue佇列
注意. 如果佇列裡沒有元素了. 再也就拿不出來元素了. 此時程式會阻塞.
接下來,我們看一下deque,注意,此佇列是collections中的。
1 from collections import deque 2 3 q = deque() 4 q.append("張開") # 右側新增 5 q.append("包貝爾") 6 q.appendleft("趙又廷") # 左側新增 7 q.appendleft("還我高圓圓") 8 print(q) 9 10 print(q.pop()) # 右側刪除 11 print(q.popleft()) # 左側刪除雙向佇列deque
3.namedtuple 命名元組
命名元組, 顧名思義. 給元組內的元素進行命名. 比如. 我們說(x, y) 這是一個元組. 同時. 我們還可以認為這是一個點座標. 這時, 我們就可以使用namedtuple對元素進行命名
1 from collections import namedtuple 2 3 # 自己定義了一個元組, 如果靈性夠好, 這其實就是建立了一個類 4 nt = namedtuple("point", ["x", "y"]) 5 p = nt(1, 2) 6 print(p) 7 8 print(p.x) 9 print(p.y)namedtuple命名元組
4.orderdict和defaultdict
orderdict 顧名思義,字典的key預設是無序的,而OrderedDict是有序的
1 dic = {'a':'娃哈哈', 'b':'薯條', 'c':'胡辣湯'} 2 print(dic) 3 4 from collections import OrderedDict 5 od = OrderedDict({'a':'娃哈哈', 'b':'薯條', 'c':'胡辣湯'}) 6 print(od)orderdict
defaultdict 可以給字典設定預設值,當key不存在時,直接獲取預設值:
1 from collections import defaultdict 2 3 dd = defaultdict(list) # 預設值list 4 print(dd['娃哈哈']) # [] 當key不存在的時候. 會自動執行構造方法中傳遞的內容.defaultdict
二、time時間模組
日期格式化的標準:
%y 兩位數的年份表示(00-99) %Y 四位數的年份表示(000-9999) %m 月份(01-12) %d 月內中的一天(0-31) %H 24小時制小時數(0-23) %I 12小時制小時數(01-12) %M 分鐘數(00=59) %S 秒(00-59) %a 本地簡化星期名稱 %A 本地完整星期名稱 %b 本地簡化的月份名稱 %B 本地完整的月份名稱 %c 本地相應的日期表示和時間表示 %j 年內的⼀天(001-366) %p 本地A.M.或P.M.的等價符 %U 一年中的星期數(00-53)星期天為星期的開始 %w 星期(0-6),星期天為星期的開始 %W 一年中的星期數(00-53)星期一為星期的開始 %x 本地相應的日期表示 %X 本地相應的時間表示 %Z 當前時區的名稱 %% %號本身日期格式化的標準
import time print(time.time()) # 1538927647.483177 系統時間 s = time.strftime("%Y-%m-%d %H:%M:%S") # 必須記住 print(s) #結構化時間 print(time.localtime()) 結果: time.struct_time(tm_year=2017, tm_mon=05, tm_mday=8, tm_hour=10, tm_min=24, tm_sec=42, tm_wday=0, tm_yday=126, tm_isdst=0)
好了. 先在看到的都是當前系統時間, 那如果碰到時間轉換呢? 比如. 我們的資料庫中儲存了這樣一個時間: 1888888888. 如何顯示成xxxx年xx月xx日. 那時間的轉化必須要記住: 所有的轉化都要通過結構化時間來轉化.
t = time.localtime(1888888888) # 結構化時間 s = time.strftime("%Y-%m-%d %H:%M:%S", t) # 格式化這個時間 print(s)
那如果說, 我讓使用者輸入一個時間, 怎麼把它轉化成我們資料庫儲存的時間戳呢? 還是要用到結構化時間
s = "2020-10-01 12:18:12" t = time.strptime(s, "%Y-%m-%d %H:%M:%S") # 轉化成結構時間 print(time.mktime(t)) # 轉換成時間戳
以上兩段程式碼,必須記住
計算時間差:
第一種:
時間差 1小時30分 begin = "2018-11-14 16:30:00" end = "2018-11-14 18:00:00" # 用時間戳計算出時間差(秒) begin_struct_time = time.strptime(begin, "%Y-%m-%d %H:%M:%S") end_stract_time = time.strptime(end, "%Y-%m-%d %H:%M:%S") begin_second = time.mktime(begin_struct_time) end_second = time.mktime(end_stract_time) # 秒級的時間差 180000 diff_time_sec = abs(begin_second - end_second) # 轉換成分鐘 diff_min = int(diff_time_sec//60) print(diff_min) diff_hour = diff_min//60 # 1 diff_min_1 = diff_min % 60 # 30 print("時間差是 %s小時%s分鐘" % (diff_hour, diff_min_1))
第二種:
begin = "2019-11-14 16:30:00" end = "2018-11-14 18:00:00" # 用時間戳計算出時間差(秒) begin_struct_time = time.strptime(begin, "%Y-%m-%d %H:%M:%S") end_stract_time = time.strptime(end, "%Y-%m-%d %H:%M:%S") begin_second = time.mktime(begin_struct_time) end_second = time.mktime(end_stract_time) # 秒級的時間差 180000 diff_time_sec = abs(begin_second - end_second) # 轉化成結構化時間 t = time.gmtime(diff_time_sec) # 最好用格林尼治時間。 否則有時差 print(t) print("時間差是%s年%s月 %s天 %s小時%s分鐘" % (t.tm_year-1970, t.tm_mon-1, t.tm_mday-1,t.tm_hour, t.tm_min ))
三、random模組
所有關於隨機相關的內容都在random模組中
import random print(random.random()) # 0-1小數 print(random.uniform(3, 10)) # 3-10小數 print(random.randint(1, 10)) # 1-10整數 [1, 10] print(random.randrange(1, 10, 2)) # 1-10奇數 [1,10) print(random.choice([1, '周杰倫', ["蓋倫", "胡辣湯"]])) # 1或者23或者[4,5]) print(random.sample([1, '23', [4, 5]], 2)) # 列表元素任意2個組合 lst = [1, 2, 3, 4, 5, 6, 7, 8] random.shuffle(lst) # 隨機打亂順序 print(lst)
四、os模組
os.stat()屬性解讀:
stat 結構: st_mode: inode 保護模式 st_ino: inode 節點號。 st_dev: inode 駐留的裝置。 st_nlink: inode 的連結數。 st_uid: 所有者的使用者ID。 st_gid: 所有者的組ID。 st_size: 普通檔案以位元組為單位的大小;包含等待某些特殊檔案的資料。 st_atime: 上次訪問的時間。 st_mtime: 最後一次修改的時間。 st_ctime: 由作業系統報告的"ctime"。在某些系統上(如Unix)是最新的元資料更改的時間,在其它系統上(如Windows)是建立時間(詳細資訊參見平臺的文件)。
五、sys模組
所有和python直譯器相關的都在sys模組