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串起來並組成一個邏輯上的dict
。ChainMap
本身也是一個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
提供了常見的摘要算法,如MD5
,SHA1
等等。
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))