# 內置模塊
[TOC]
---
## datetime
```python
# 導入datetime模塊的datetime類
from datetime import datetime
now = datetime.now()
now # datetime.datetime(2018, 3, 30, 21, 2, 20, 167446)
print(now) # 2018-03-30 21:02:20.167446
print(type(now)) # <class 'datetime.datetime'>
# 用指定日期時間創建datetime
dt = datetime(2015, 4, 19, 12, 20)
print(dt) # 2015-04-19 12:20:00
# 轉換時間戳
dt = datetime(2018, 4, 19, 12, 20)
dt.timestamp() # 1524111600.0
# timestamp轉換為datetime
t=1524111600
print(datetime.fromtimestamp(t)) # 2018-04-19 12:20:00
# str轉換為datetime
cday = datetime.strptime('2018-3-30 21:36:50', '%Y-%m-%d %H:%M:%S')
print(cday) # 2018-03-30 21:36:50
# datetime轉換為str
now = datetime.now()
print(now.strftime('%Y-%m-%d %H:%M:%S')) # 2018-03-30 21:42:24
# 10小時后
from datetime import timedelta
now = datetime.now()
now + timedelta(hours=10) # datetime.datetime(2018, 3, 31, 7, 44, 11, 686375)
# 1天前
now - timedelta(days=1)
# 2天12小時以后
now + timedelta(days=2, hours=12)
```
## collections
collections內置了很多有用的集合類
### namedtuple
語義化元祖(為tuple取名): namedtuple是一個函數,它用來創建一個自定義的tuple對象,并且規定了tuple元素的個數,并可以用屬性而不是索引來引用tuple的某個元素。
```python
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
Point # <class '__main__.Point'>
p = Point(1,2)
p.x # 1
p.y # 2
isinstance(p,Point) # True
isinstance(p,tuple) # True
```
### deque
使用list存儲數據時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性存儲,數據量大的時候,插入和刪除效率很低。
deque是為了高效實現插入和刪除操作的雙向列表,適合用于隊列和棧:
```python
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x') # pop()
q.appendleft('y') #popleft()
q # deque(['y', 'a', 'b', 'c', 'x'])
```
### defaultdict
dict的key不存在時提供默認值
```python
from collections import defaultdict
dd = defaultdict(lambda: 'N/A') # 注意: 默認值是調用函數返回的
dd['key1'] = 'abc'
dd['key1'] # key1存在 'abc'
dd['key2'] # key2不存在,返回默認值 'N/A'
# 但如果默認值是不需要函數處理之后的結果值,建議用dict
```
### OrderedDict
使用dict時,Key是無序的。如果要保持Key的順序,可以用OrderedDict
**注意:這里的順序是指插入的順序,而不是keys或value的大小順序**
```python
od = OrderedDict([('b', 2), ('c', 3),('a', 1)])
od # OrderedDict([('b', 2), ('c', 3), ('a', 1)])
list(od.keys()) # ['b', 'c', 'a']
```
> 實現一個FIFO(先進先出)的dict類,當容量超出限制時,先刪除最早添加的Key:
```python
class LastUpdatedOrderedDict(OrderedDict):
def __init__(self, capacity):
super().__init__()
self._capacity = capacity
def __setitem__(self, key, value):
containsKey = 1 if key in self else 0
if len(self) - containsKey >= self._capacity:
last = self.popitem(last=False)
print('remove:', last)
if containsKey:
del self[key]
print('set:', (key, value))
else:
print('add:', (key, value))
OrderedDict.__setitem__(self, key, value)
d = LastUpdatedOrderedDict(2);
d[0]=1 # add: (0, 1)
d[0]=0 # set: (0, 0)
d[1]=0 # add: (1, 0)
d[2]=0 # remove: (0, 0) add: (2, 0)
```
### counter
計數器
```python
from collections import Counter
c = Counter()
for ch in 'programming':
c[ch] = c[ch] + 1
c # Counter({'r': 2, 'g': 2, 'm': 2, 'p': 1, 'o': 1, 'a': 1, 'i': 1, 'n': 1})
```
## base64
```python
import base64
base64.b64encode(b'binary\x00string') # b'YmluYXJ5AHN0cmluZw=='
base64.b64decode(b'YmluYXJ5AHN0cmluZw==') # b'binary\x00string'
```
## hashlib
提供常見的摘要算法
```python
import hashlib
md5 = hashlib.md5()
md5.update('how to use md5 in python hashlib?'.encode('utf-8'))
print(md5.hexdigest()) # d26a53750bc40b38b65a520292f69306
# 可以分塊多次調用update()
md5.update('how to use md5 in '.encode('utf-8'))
md5.update('python hashlib?'.encode('utf-8'))
# 加鹽算法
import hmac
message = b'Hello, world!'
key = b'secret'
h = hmac.new(key, message, digestmod='MD5')
h.hexdigest() # fa4ee7d173f2d97ee79022d1a7355bcf
```
## itertools
```python
import itertools
# 生成一個無限迭代器,從1開始
natuals = itertools.count(1)
# 無限循環ABC
cs = itertools.cycle('ABC')
# 無限循環元素A,第二參數可限制次數
ns = itertools.repeat('A', 3)
```
### takewhile
通過takewhile()等函數根據條件判斷來截取出一個有限的序列
```python
natuals = itertools.count(1)
ns = itertools.takewhile(lambda x: x <= 10, natuals)
list(ns) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```
### chain
串聯迭代對象
```python
for n in itertools.chain('xyz','abc'):
print(n)
# x y z a b c
```
### groupby
```python
# lamba: 上個返回的值和這個返回的值相等,就是相同分組的
for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):
print(key, list(group))
```
## sys
## contextlib
處理上下文關系
## urllib
urllib提供了一系列用于操作URL的功能,但我們一般不用