1. 程式人生 > >day21 常用模組01

day21 常用模組01

一. 模組

  模組是我們把特定功能程式碼進行歸類的結果.

 引入模組的方式: 1. import 模組  2. from xxx import 模組

二. collections  集合類的操作, 除了基礎資料型別以外的資料集合型別

  1. Counter 計數器

s = "I am sylar, I have a dream, freedom...."
dic = {}
for el in s:
    dic[el] = dic.setdefault(el, 0) + 1  #
get 也可以 print(dic) from collections import Counter print(Counter(s)) # 結果是字典型別的

 

  2. deque 雙向佇列

   (重要的資料結構)  1. 棧: FILO 先進後出 -> 砌牆的磚頭,  2. 佇列: FIFO 先進先出 -> 所有排隊的場景

  注意: python本身沒有提供棧, 但是list本身就是一個棧

# python 寫一個棧程式
class StackFullError(Exception): pass # 自定義 棧滿的異常 class StackEmptyError(Exception): pass # 自定義 棧空的異常 class Stack: def __init__(self, size): self.index = 0 # 棧頂指標 self.lst = [] self.size = size # 棧的容量 # 給棧新增元素 def push(self, item): if self.index == self.size: #
判斷棧頂是否在最後 raise StackFullError('the stack is full') # 丟擲異常 self.lst.append(self.index, item) # 根據棧頂指標的位置, 插入對應元素 self.index += 1 # 棧頂指標向下移動 # 從棧中獲取(刪除)資料 def pop(self): if self.index is 0: # 判斷棧頂指標是否再最上面 raise StackEmptyError('the stack is empty') self.index -= 1 # z指標向下移動 item = self.lst.pop(self.index) # 獲取元素刪除 return item # 返回刪除的元素, 即可以提取棧內元素 s = Stack(5) s.push("饅頭1號") s.push("饅頭2號") s.push("饅頭3號") s.push("饅頭4號") s.push("饅頭5號") print(s.pop()) print(s.pop()) print(s.pop()) print(s.pop()) print(s.pop())

 

# 佇列
import queue
#
q = queue.Queue() # 建立佇列
q.put("李嘉誠")
q.put("陳冠希")
q.put("周潤發")
q.put("吳彥祖")

print(q.get())
print(q.get())
print(q.get())
print(q.get())
# print(q.get()) # 佇列中如果沒有元素了. 繼續獲取的話. 會阻塞
print("拿完了")
from collections import deque

q = deque() # 建立一個雙向佇列
q.append("高圓圓")
q.append("江疏影")
q.appendleft("趙又廷")
q.appendleft("劉大哥")
#  劉大哥 趙又廷 高圓圓 江疏影
print(q.pop()) # 從右邊獲取資料
print(q.pop())
print(q.popleft()) # 從左邊獲取資料
print(q.popleft())
print(q.pop())  # IndexError: pop from an empty deque

# 注意雙向佇列的左右方向

  3. nametuple 命名元組

  顧名思義, 給元組內的元素進行命名

 

from collections import namedtuple

point = namedtuple("Point", ["x", "y", 'z']) # 這個就相當於寫了一個類
# class point:
#     def __init__(self, x, y):
#         self.x = x
#         self.y = y

p = point(5, 18, 88)
print(p.x)
print(p.y)
# p.x = 19 # AttributeError: can't set attribute  終歸是元組不能修改
print(p)

 

  4. orderdict 和 defaultdict

    orderdict 顧名思義, 字典的key是無序的(字典的底層是hash), 而OrderedDict是有序的

dic = {'a':'娃哈哈', 'b':'薯條', 'c':'胡辣湯'}
print(dic) # 最底層一定是無序的. 最底層是hash

from collections import OrderedDict
# 按照我們儲存的順序儲存資料
od = OrderedDict({'b':'薯條','a':'娃哈哈', 'c':'胡辣湯'})
print(od)

    defaultdict: 可以給字典設定預設值, 當key不存在時, 直接獲取預設值

from collections import defaultdict

d = defaultdict(list)  # {} # 引數位置給的內容必須是可呼叫的
d["周杰倫"] = "昆凌"
print(d["周杰倫"])  # 從字典中獲取資料的時候. 如果這個key不存在. 去執行可執行的內容, 拿到的是一個空列表


# 以前的題目
lst= [11,22,33,44,55,66,77,88,99]
d = defaultdict(list)
for el in lst:
    if el < 66:
        d["key1"].append(el) # key1預設是不存在的. 但是可以拿key1. 一個空列表.
    else:
        d["key2"].append(el)
print(d)

# {'key1': [11, 22, 33, 44, 55], 'key2': [66, 77, 88, 99]})

 

三. time 時間模組(重點)

  1. 獲取系統時間 time.time()  得到的結果是是時間戳(timestamp)   

    時間戳使用的1970年01月01日 00時00分00秒開始的到當前的秒數, 使用float 表示

  2. 格式化時間 time.strftime()   常用時間格式: %Y-%m-%d %H:%M:%S

while 1:
    s = time.strftime("%Y-%m-%d %H:%M:%S") #  使用頻率最高
    print(s)
    time.sleep(1)
# 一秒一秒的列印時間

  3. 結構化時間  time.gmtime()  格林尼治時間  time.localtime() 當地時間

時間表示轉換問題

# 從時間戳 -> 格式化時間
t = time.localtime(1542513992)  # 有時區問題   gmtime() 格林尼治時間.
print(t)
str_time = time.strftime("%Y-%m-%d %H:%M:%S", t)
print(str_time)

# 使用者輸入一個時間. 變成時間戳
# 格式化時間 -> 時間戳
# 2018-11-18 12:06:32
s = "2018-11-18 12:06:32"
t = time.strptime(s, "%Y-%m-%d %H:%M:%S") #  string parse time
print(t)
# 結構化時間 -> 時間戳
ss = time.mktime(t)
print(ss)
print(time.strftime("%Y年%m月%d日"))   # string format time

 

 

計算時差問題:

# 時間差  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 模組
 

 

五. os 模組

 

 

 

 

 

 六. sys模組