Python的1001種騷操作——基礎篇(0)
寫在第0行:
已經斷斷續續地所謂自學了大半年的Python語言。現在回想起來,只有躺在Pycharm里的30個.py文件,我並沒有留下一些實質性的乾貨,但是我又喜歡自己弄點小的黑科技來娛樂一些枯燥的學習生活。Thus,我就開通了這個專欄,用來從零記錄學習Python中的點點滴滴。當然,一開始是從基礎開始,隨著(盡量周更)深入學習,後期會偏向於數據分析方向。也希望在這過程中可以和大家一起探討學習。
一:數據結構
常用數據結構有:元組,列表,集合及字典。在數據處理中,對數據進行分解操作會有以下操作:
>>>data = [I,am,so,handsome]>>>first , second , third , end = data>>>firstI>>>secondam
這裡可以看出data列表含有4個元素,其中first,second , third , end分別對應 I ,am, so,handsome。但是,這需要達成一一對應的關係,如果data列表含有4個元素,但分解成小於4個單獨變數時,會出現 "ValueError: too many values to unpack (expected n)" (n為你要分解的單獨變數數量) 。但是在現實場景中,如統計一個班級的平均分的計算方法是去掉一個最高分,去掉一個最低分,使用剩餘的分數來計算平均分時,我們沿用上述分解方法會超級麻煩。這是我們可以這樣騷操作:
>>>騷操作0>>>def calculate_average(datalist): #datalist已經順序排序... first , *middle , last = datalist... return avg(middle)
當然,根據cookbook上還有一個用戶記錄的案例,與其類似就不講了。
在拆分(splitting)中,使用 *式語法也會非常有用。
>>>userinfo = name:peter|phonenum:16714112138|email:XXXX|....|tail>>>uname , *contact , whatsup , tail = userinfo.split(|)>>>contact[phonenum:16714112138, email:XXXX]>>>tailtail
* 分解操作與函數式編程
在體驗過用 *式來簡化分解數據後,有沒有想到過我們經常用到的累加列表元素的操作:
>>>tmp = 0>>>for i in datalist:... tmp += i
現在我們可以這樣玩:
>>>def sum(datalist):... head , *tail = datalist... return head + sum(tail) if tail else head
保存最後N個元素:有時候我們在數據處理過程中要對最後N項數據進行保存。這個時候,我們可以用到collection模塊中的deque。deque,類似於list的容器,可以快速的在隊列頭部和尾部添加、刪除元素。下面就貼出cookbook的示例代碼:
from collection import dequedef search(lines, pattern, historysize): #lines為讀取到的行,pattern為匹配欄位 previous_lines = deque(maxlen_history) for line in lines: if pattern in line: yield line,previous_lines #yield 生成器標誌 previous_lines.append(line)
這裡可以看出search()不在只是一個def, 而是變成了生成器!
講到生成器就不得不講參考下面這篇文章,我覺得他已經講的很詳細了。
深入理解Python中的生成器 - Python - 伯樂在線
還是再講一下deque()吧。首先deque是一個隊列結構具有FIFO的特性,它類似list。在源碼片段中可以看到:
def __init__(self, iterable=(), maxlen=None): # known case of _collections.deque.__init__ """ deque([iterable[, maxlen]]) --> deque object A list-like sequence optimized for data accesses near its endpoints. # (copied from class doc) """ pass
我們可以看到,在deque()中可以自己定義deque的長度maxlen,默認就是無限界的隊列。
deque還可以選擇在兩邊進行入隊和出隊操作(appendleft(); popright();)。雖然說list也可以進行append,del操作,但是deque在性能上要好得多,and比較優雅。
總結
這第一篇文章說實話比較水,內容都比較簡單。但是我覺得在實際應用中 *式分解出來你需要的目標數據還是比較實用的(如果目標數據是特定的某一項時,這個方法未必實用)。那麼下一期依舊接著 《Python Cookbook》來學習。最後歡迎各位同好多提提建議,多多批評,謝謝。
參考文獻
《Python Cookbook 中文版》第三版
只求同好,無關浮名。
推薦閱讀:
※python基礎-pickle
※PY交友路?開發環境系列:PyCharm環境配置
※基於Python的三峽發電量估算系統
※chapter7 - 大型程序的結構
※Requests 庫學習筆記
TAG:Python |