Python全棧學習筆記day 19:collections模組、時間模組、random模組、os模組、sys模組
阿新 • • 發佈:2018-11-02
一、collections模組
1.namedtuple: 生成可以使用名字來訪問元素內容的tuple
2.deque: 雙端佇列,可以快速的從另外一側追加和推出物件
queue:佇列
3.Counter: 計數器,主要用來計數
4.OrderedDict: 有序字典
5.defaultdict: 帶有預設值的字典
1.1 namedtuple
我們知道tuple可以表示不變集合,例如,一個點的二維座標就可以表示成:p = (1, 2) 但是,看到(1, 2),很難看出這個tuple是用來表示一個座標的。這時,namedtuple就派上了用場:
from collections import namedtuple
Point = namedtuple('point',['x','y','z'])
p1 = Point(1,2,3)
p2 = Point(3,2,1)
print(p1.x) 1
print(p1.y) 2
print(p1,p2) point(x=1, y=2, z=3) point(x=3, y=2, z=1)
1.2 queue
import queue q = queue.Queue() q.put([1,2,3]) q.put(5) q.put(6) print(q) <queue.Queue object at 0x01DAEDF0> print(q.get()) [1, 2, 3] print(q.get()) 5 print(q.get()) 6 print(q.get()) 阻塞
1.3 deque
使用list儲存資料時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性儲存,資料量大的時候,插入和刪除效率很低。
deque是為了高效實現插入和刪除操作的雙向列表,適合用於佇列和棧:
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'] print(dq.pop()) 從後面取資料 print(dq.pop()) 從後面取資料 print(dq.popleft()) 從前面取資料 print(dq) deque([1, 3])
1.4 OrderedDict
使用dict時,Key是無序的。在對dict做迭代時,我們無法確定Key的順序。如果要保持Key的順序,可以用OrderedDict
:
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od['a']) 1
OrderedDict的Key是有序的
1.5 defaultdict
使用dict
時,如果引用的Key不存在,就會丟擲KeyError
。如果希望key不存在時,返回一個預設值,就可以用defaultdict
:
有如下值集合 [
11
,
22
,
33
,
44
,
55
,
66
,
77
,
88
,
99
,
90.
..],將所有大於
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 my_dict.has_key('k1'):
my_dict['k1'].append(value)
else:
my_dict['k1'] = [value]
else:
if my_dict.has_key('k2'):
my_dict['k2'].append(value)
else:
my_dict['k2'] = [value]
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)
二、時間模組
表示時間的三種方式:
1、格式化時間 —— 字串: 給人看的
print(time.strftime("%Y/%m/%d %H:%M:%S")) 2018/10/23 22:20:54
print(time.strftime("%m-%d %H:%M:%S")) 10-23 22:20:54
print(time.strftime("%H:%M:%S")) 22:20:54
print(time.strftime("%H:%M")) 22:20
具體字母意思:
%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 當前時區的名稱
%% %號本身
2、時間戳時間 —— float時間 : 計算機看的
import time
print(time.time()) 1540304274.629
3、結構化時間 —— 元祖 struct_time:計算用的
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)
索引(Index) | 屬性(Attribute) | 值(Values) |
---|---|---|
0 | tm_year(年) | 比如2011 |
1 | tm_mon(月) | 1 - 12 |
2 | tm_mday(日) | 1 - 31 |
3 | tm_hour(時) | 0 - 23 |
4 | tm_min(分) | 0 - 59 |
5 | tm_sec(秒) | 0 - 60 |
6 | tm_wday(weekday) | 0 - 6(0表示週一) |
7 | tm_yday(一年中的第幾天) | 1 - 366 |
8 | tm_isdst(是否是夏令時) | 預設為0 |
時間戳-->結構化時間
time.gmtime(時間戳) #輸出結構化時間
UTC時間,與英國倫敦當地時間一致
time.localtime(時間戳) #輸出結構化時間
當地時間。例如我們現在在北京執行這個方法:與UTC時間相差8小時,UTC時間+8小時 = 北京時間
結構化時間-->時間戳
time.mktime(結構化時間)
time_tuple = time.localtime(1500000000)
print(time.mktime(time_tuple)) 1500000000
結構化時間-->字串時間
time.strftime("格式定義","結構化時間") 結構化時間引數若不傳,則顯示當前時間
time.strftime("%Y-%m-%d %X")
2018-10-24 13:08:28
字串時間-->結構化時間
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)
結構化時間 --> %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之間的小數
random.uniform(1,3) 大於1小於3的小數
random.randint(1,5) 大於等於1且小於等於5之間的整數
random.randrange(1,10,2) 大於等於1且小於10之間的奇數
隨機選擇一個返回
random.choice([1,'23',[4,5]]) 輸出1或者23或者[4,5]
打亂列表順序
item=[1,3,5,7,9]
random.shuffle(item) 打亂次序
練習:生成隨機驗證碼:
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())
四、os模組(作業系統互動)
os.makedirs('dirname1/dirname2') 可生成多層遞迴目錄
os.removedirs('dirname1') 若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推
os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
os.listdir('dirname') 列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印
os.remove() 刪除一個檔案
os.rename("oldname","newname") 重新命名檔案/目錄
os.stat('path/filename') 獲取檔案/目錄資訊
os.system("bash command") 執行shell命令,直接顯示
os.popen("bash command).read() 執行shell命令,獲取執行結果
os.getcwd() 獲取當前工作目錄,即當前python指令碼工作的目錄路徑
os.chdir("dirname") 改變當前指令碼工作目錄;相當於shell下cd
os.path
os.path.abspath(path) 返回path規範化的絕對路徑
os.path.split(path) 將path分割成目錄和檔名二元組返回
os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) 返回path最後的檔名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是絕對路徑,返回True
os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False
os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False
os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的引數將被忽略
os.path.getatime(path) 返回path所指向的檔案或者目錄的最後訪問時間
os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間
os.path.getsize(path) 返回path的大小
os模組的屬性
os.sep 輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep 輸出當前平臺使用的行終止符,win下為"\r\n",Linux下為"\n"
os.pathsep 輸出用於分割檔案路徑的字串 win下為;,Linux下為:
os.name 輸出字串指示當前使用平臺。win->'nt'; Linux->'posix'
五、sys模組(與python直譯器互動)
sys.argv 命令列引數List,第一個元素是程式本身路徑
sys.exit(n) 退出程式,正常退出時exit(0),錯誤退出sys.exit(1)
sys.version 獲取Python解釋程式的版本資訊
sys.path 返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值
sys.platform 返回作業系統平臺名稱
異常處理和status
ret = sys.argv
name = ret[1]
pwd = ret[2]
if name == 'alex' and pwd == 'alex3714':
print('登陸成功')
else:
print("錯誤的使用者名稱和密碼")
sys.exit() 正常退出程式 sys.exit(1) 異常退出程式
print('你可以使用計算器了')