python內建模塊

datetime

from datetime import datetime, timedelta, timezone

#測試datetime
now = datetime.now()
#創建時間by數字
dt = datetime(1970, 2, 28, 20, 10, 50)
#創建時間by string
dt = datetime.strptime('2015/06/01 18:19:59', '%Y/%m/%d %H:%M:%S')
#時間戳
timestamp = dt.timestamp() #5055050.0 單位s,小數點後表示ms
#創建時間by時間戳
dt = datetime.fromtimestamp(timestamp)

#時間運算
print(now + timedelta(hours=10))
print(now + timedelta(days=2, hours=10))

collections

nametuple

namedtuple是一個函數,它用來創建一個自定義的tuple對象,並且規定了tuple元素的個數,並可以用屬性而不是索引來引用tuple的某個元素。

# nametuple, 一個最精簡的類實現
Point = namedtuple('Point', ['x','y'])
p = Point(1, 2)
print('x=', p.x, 'y=', p.y)

deque

deque是爲了高效實現插入和刪除操作的雙向列表,適合用於隊列和棧

# deque, 雙向列表
q = deque(['a','b','c'])
q.append('x') #在尾部插入'x'
q.appendleft('y') #在頭部插入'y'
q.popleft() #刪除最左邊一個item

defaultdict

使用dict時,如果引用的Key不存在,就會拋出KeyError。如果希望key不存在時,返回一個默認值,就可以用defaultdict

# defaultdict, key不存在時,返回一個默認值
dd = defaultdict(lambda : 'N/A')
dd['key1'] = 'abc'
print('dd key1=', dd['key1'], 'dd key2=', dd['key2'])

OrderedDict

使用dict時,Key是無序的。在對dict做迭代時,我們無法確定Key的順序。
如果要保持Key的順序,可以用OrderedDict
注意,OrderedDict的Key會按照插入的順序排列,不是Key本身排序:

# OrderedDict, 有序的dict
d = dict([('a', 1), ('b', 2), ('c', 3)])
print('d=', d)
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print('od=', od)

ChainMap

ChainMap可以把一組dict串起來並組成一個邏輯上的dictChainMap本身也是一個dict,但是查找的時候,會按照順序在內部的dict依次查找。

default = {'color':'red', 'user':'guest'}
args = {'key':'123345', 'color':'green'}

combined = ChainMap(args, default)

print('color=%s' % combined['color'])
print('user=%s' % combined['user'])

base64

Base64編碼會把3字節的二進制數據編碼爲4字節的文本數據,長度增加33%,好處是編碼後的文本數據可以在郵件正文、網頁等直接顯示。

如果要編碼的二進制數據不是3的倍數,最後會剩下1個或2個字節怎麼辦?Base64\x00字節在末尾補足後,再在編碼的末尾加上1個或2個=號,表示補了多少字節,解碼的時候,會自動去掉。

# 字節碼在python中表示,前面要加b,例如 b'abcd'
enc = base64.b64encode(b'abcd')
dec = base64.b64decode(b'YWJjZA==')
enc = base64.b64encode(b'i\xb7\x1d\xfb\xef\xff')
#由於標準的Base64編碼後可能出現字符+和/,在URL中就不能直接作爲參數,
#所以又有一種"url safe"的base64編碼,其實就是把字符+和/分別變成-和_
enc = base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff')

struct

struct用來解決bytes其他二進制數據類型的轉換。
方法,調用struct.pack('>I', 10240099) 返回是一個tuple

規則:
>表示字節順序是big-endian,也就是網絡序
I表示4字節無符號整數。H 2字節無符號整數。c表示char
i表示4字節有符號整數。h 2字節無符號整數。

# -*- coding: utf-8 -*-
struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80')
# 返回(4042322160, 32896)

hashlib

hashlib提供了常見的摘要算法,如MD5SHA1等等。

import hashlib

#md5的使用
#MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit字節,通常用一個32位的16進制字符串表示。

md5 = hashlib.md5()
md5.update('how to use md5 in '.encode('utf-8'))
md5.update('python hashlib'.encode('utf-8'))
digest = md5.hexdigest()
print('md5 digest=', digest)

#sha1的使用
#SHA1的結果是160 bit字節,通常用一個40位的16進制字符串表示
#另外,還有sha256, sha512
sha1 = hashlib.sha1()
sha1.update('how to use sha1 in python hashlib'.encode('utf-8'))
digest = sha1.hexdigest()
print('sha1 digest=', digest)

itertools

itertools提供了非常有用的用於操作迭代對象的函數。

import itertools

# count 創建一個無限的迭代器,用於數字,第一參數start,第二個參數step默認1
natuals = itertools.count(1, 2)
for n in natuals:
    print(n)
    if(n > 10):
        break

# takewhile表示取出一部分
ns = itertools.takewhile(lambda x: x<=20, natuals)
print(list(ns))

print(type(natuals))

# cycle 創建一個無限循環序列, 參數是一個iterable
cs = itertools.cycle('abc')
cnt = 0
for c in cs:
    print(c)
    cnt += 1
    if cnt > 10:
        break
print(type(cs))

# repeat 創建一個不斷重複的序列,第二個參數表示count,不指定則無限
ns = itertools.repeat('ab', 3)
for n in ns:
    print(n)

# chain 把一組迭代對象串聯起來
for c in itertools.chain('abc', 'XYZ', '123'):
    print(c)

# groupby 把迭代器中相鄰的重複元素挑出來
for key, group in itertools.groupby('aaaaAAAbbbBB'):
    print(key, list(group))

參考資料

廖雪峯python教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章