1. 程式人生 > >Day-20 基礎模組1

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):
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
Stack棧

  佇列: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模組