Python常用模組(1)
一、 collections 模組
python中的擴充套件資料型別
在內建資料型別(dict、list、set、tuple)的基礎上,collections模組還提供了幾個額外的資料型別:Counter、deque、defaultdict、namedtuple和OrderedDict等。
1.namedtuple :生成可以使用名字來訪問元素內容的tuple
from collections import namedtuple Point=namedtuple("Point",["x","y","z"]) p=Point(1,2,3) print(p.x) # 1 print(p.y) # 2 print(p.z) # 3 print(p) #結果:Point(x=1, y=2)
類似的,如果要用座標和半徑表示一個圓,也可以用namedtuple
定義:
from collections import namedtuple Circle=namedtuple("circle",["x","y","r"]) d=Circle(2,3,2) print(d) #circle(x=2, y=3, r=2)
2.deque
使用list儲存資料時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性儲存,資料量大的時候,插入和刪除效率很低。
deque是為了高效實現插入和刪除操作的雙向列表,適合用於佇列和棧:(堆疊:先進後出 佇列:先進先出FIFO)
#佇列 import queue q = queue.Queue() q.put(6) q.put(7) q.put(8) print(q) # <queue.Queue object at 0x000001D5560650F0> print(q.get()) # 6 print(q.get()) # 7 print(q.get()) # 8 print(q.qsize()) # 0 print(q.get()) # 阻塞
from collections import deque dq=deque(["a","b","c"]) dq.append("x") dq.appendleft("y") print(dq) #結果:deque(['y', 'a', 'b', 'c', 'x'])
deque除了實現list的append()
和pop()
外,還支援appendleft()
和popleft()
,這樣就可以非常高效地往頭部新增或刪除元素。
from collections import deque dq = deque([1,2]) dq.append('a') # 從後面放資料 [1,2,'a'] dq.appendleft('b') # 從前面放資料 ['b',1,2,'a'] dq.insert(2,3) #['b',1,3,2,'a'] #2為索引,3為數字 print(dq.pop()) # "a"從後面取資料 print(dq.pop()) # 2 從後面取資料 print(dq.popleft()) # "b" 從前面取資料 print(dq) #deque([1, 3])
3.Counter
計數器,主要用來計數
from collections import Counter c=Counter("abhdsfifhabaacsdfgsfa") print(c) #結果:Counter({'a': 5, 'f': 4, 's': 3, 'b': 2, 'd': 2, 'h': 2, 'i': 1, 'c': 1, 'g': 1}) #跟蹤值出現的次數
4.OrderedDict
有序字典
使用dict時,Key是無序的。如果想要保持key的順序,就用OrderedDict。
#dict中的Key是無序的 d=dict([("a","1"),("b",2),("c",3)]) print(d) #結果:{'c': 3, 'b': 2, 'a': '1'} # dict中的Key是無序的
#OrderedDict的Key是有序的 from collections import OrderedDict od=OrderedDict([("a","1"),("b","2"),("c","3")]) print(od) #OrderedDict([('a', '1'), ('b', '2'), ('c', '3')]) print(od["a"]) # a #OrderedDict的Key是有序的,即使有序也是一個字典,不能用索引,只能用鍵值對 for k in od: print(k) # a ,b,c
from collections import OrderedDict od=OrderedDict() od["z"]=1 od["y"]=2 od["x"]=3 print(od.keys()) #結果:odict_keys(['z', 'y', 'x']) #按照插入的key的順序返回
#將所有大於 66 的值儲存至字典的第一個key中,將小於 66 的值儲存至第二個key的值中。 #即: {'k1': 大於66 , 'k2': 小於66} values = [11, 22, 33,44,55,66,77,88,99,90] my_dict = {} for value in values: if value>66: if 'k1' in my_dict.keys(): my_dict['k1'].append(value) else: my_dict['k1'] = [value] else: if 'k2' in my_dict.keys(): my_dict['k2'].append(value) else: my_dict['k2'] = [value] print(my_dict) # {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]}
#defaultdict字典解決方法 from collections import defaultdict values = [11, 22, 33,44,55,66,77,88,99,90] my_dict = defaultdict(list) for value in values: if value>66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) print(my_dict) ## defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]})
使用dict
時,如果引用的Key不存在,就會丟擲KeyError
。如果希望key不存在時,返回一個預設值,就可以用defaultdict
:
>>> from collections import defaultdict >>> dd = defaultdict(lambda: 'N/A') >>> dd['key1'] = 'abc' >>> dd['key1'] # key1存在 'abc' >>> dd['key2'] # key2不存在,返回預設值 'N/A'
二、time模組
和時間有關係的我們就要用到時間模組。在使用模組之前,應該首先匯入這個模組。
#常用方法 1.time.sleep(secs) (執行緒)推遲指定的時間執行。單位為秒。 2.time.time() 獲取當前時間戳
表示時間的三種方式
在Python中,通常有這三種方式來表示時間:時間戳、元組(struct_time)、格式化的時間字串:
(1)時間戳(timestamp) :通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們執行“type(time.time())”,返回的是float型別。
(2)格式化的時間字串(Format String): ‘1999-12-06’
python中時間日期格式化符號:
%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 當前時區的名稱
%% %號本身
(3)元組(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等)
首先,我們先匯入time模組,來認識一下python中表示時間的幾種格式:
#匯入時間模組 >>>import time #時間戳 >>>time.time() 1500875844.800804 #時間字串 >>>time.strftime("%Y-%m-%d %X") '2017-07-24 13:54:37' >>>time.strftime("%Y-%m-%d %H-%M-%S") '2017-07-24 13-55-04' #時間元組:localtime將一個時間戳轉換為當前時區的struct_time time.localtime() time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=13, tm_min=59, tm_sec=37, tm_wday=0, tm_yday=205, tm_isdst=0)
小結:時間戳是計算機能夠識別的時間;時間字串是人能夠看懂的時間;元組則是用來操作時間的
幾種格式之間的轉換
#結構化時間-->字串時間 #time.strftime("格式定義","結構化時間") 結構化時間引數若不傳,則顯示當前時間 >>>time.strftime("%Y-%m-%d %X") '2017-07-24 14:55:36' >>>time.strftime("%Y-%m-%d",time.localtime(1500000000)) '2017-07-14' #字串時間-->結構化時間 #time.strptime(時間字串,字串對應格式) >>>time.strptime("2017-03-16","%Y-%m-%d") time.struct_time(tm_year=2017, tm_mon=3, tm_mday=16, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=75, tm_isdst=-1) >>>time.strptime("07/24/2017","%m/%d/%Y") time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=205, tm_isdst=-1)
#結構化時間 --> %a %b %d %H:%M:%S %Y串 #time.asctime(結構化時間) 如果不傳引數,直接返回當前時間的格式化串 >>>time.asctime(time.localtime(1500000000)) 'Fri Jul 14 10:40:00 2017' >>>time.asctime() 'Mon Jul 24 15:18:33 2017' #時間戳 --> %a %b %d %H:%M:%S %Y串 #time.ctime(時間戳) 如果不傳引數,直接返回當前時間的格式化串 >>>time.ctime() 'Mon Jul 24 15:19:07 2017' >>>time.ctime(1500000000) 'Fri Jul 14 10:40:00 2017
#####
import time true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S')) time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S')) dif_time=time_now-true_time struct_time=time.gmtime(dif_time) print('過去了%d年%d月%d天%d小時%d分鐘%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1, struct_time.tm_mday-1,struct_time.tm_hour, struct_time.tm_min,struct_time.tm_sec)) 計算時間差
三、random模組
>>> import random #隨機小數 >>> random.random() # 大於0且小於1之間的小數 0.7664338663654585 >>> random.uniform(1,3) #大於1小於3的小數 1.6270147180533838#恆富:發紅包 #隨機整數 >>> random.randint(1,5) # 大於等於1且小於等於5之間的整數 >>> random.randrange(1,10,2) # 大於等於1且小於10之間的奇數 #隨機選擇一個返回 >>> random.choice([1,'23',[4,5]]) # #1或者23或者[4,5] #隨機選擇多個返回,返回的個數為函式的第二個引數 >>> random.sample([1,'23',[4,5]],2) # #列表元素任意2個組合 [[4, 5], '23'] #打亂列表順序 >>> item=[1,3,5,7,9] >>> random.shuffle(item) # 打亂次序 >>> item [5, 1, 3, 7, 9] >>> random.shuffle(item) >>> item [5, 9, 7, 1, 3]
練習:生成隨機驗證碼
import random def v_code(): code = '' for i in range(5): num=random.randint(0,9) alf=chr(random.randint(65,90)) add=random.choice([num,alf]) code="".join([code,str(add)]) return code print(v_code()) 生成驗證碼