1. 程式人生 > >Python全棧學習筆記day 19:collections模組、時間模組、random模組、os模組、sys模組

Python全棧學習筆記day 19:collections模組、時間模組、random模組、os模組、sys模組

 

一、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('你可以使用計算器了')