day21 常用模組01
阿新 • • 發佈:2018-11-19
一. 模組
模組是我們把特定功能程式碼進行歸類的結果.
引入模組的方式: 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模組