1. 程式人生 > >Python常用模組(1)

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())

生成驗證碼