Python語言基礎

語言特性
  1. 動態強類型語言(很多人誤覺得是弱類型)
  2. 動態仍是靜態指的是編譯期仍是運行期肯定類型
  3. 強類型指的是不會發生隱式型轉換
 
優缺點
  1. 膠水語言,輪子多,應用普遍
  2. 語言靈活,生產力高
  3. 性能問題,代碼維護問題,Python2/3兼容問題
 
鴨子類型
  1. 關注點在對象的行爲,而不是類型(duck typing)
  2. 好比 file,StringIO,socket 對象都支持 read/write 方法(file like object)
  3. 再好比定義了 __iter__ 魔術方法的對象能夠用 for 迭代
 
monkey patch
  1. 所謂的 monkey patch 就是運行時替換
  2. 好比 gevent 庫須要修改內置的 socket
  3. from gevent import monkey; monkey.patch_socket()
 
自省(Introspection)
  1. 運行時判斷一個對象的類型的能力
  2. Python 一切皆對象,用 type,id,isinstance 獲取對象類型信息
  3. Inspect 模塊提供了更多獲取對象信息的函數
 
列表或字典推導式
  1. 好比 [i for i in range(10) if i % 2 == 0]
  2. 一種快速生成 list/dict/set 的方式。用來替代 map/filter 等
  3. (i for i in range(10) if i % 2 == 0) 返回生成器
 
Python之禪
  1. Tim Peters 編寫的關於 Python 編程的準則
  2. import this
  3. 編程拿不許的時候能夠參考
 
Python3改進
  1. print 成爲函數
  2. 編碼問題。Python3 再也不有 Unicode 對象,默認 str 就是 unicode
  3. 除法變化。Python3 除號返回浮點數
  4. 類型註解(type hint)。幫助 IDE 實現類型檢查
  5. 優化 super() 方便直接調用父類函數
  6. 高級解包操做。a, b, *rest = range(10)
  7. Keyword only arguments。限定關鍵字參數
  8. Chained exceptions。Python3 從新拋出異常不會丟失棧信息
  9. 一切返回迭代器 range, zip, map, dict.values, etc.are, alliterators
  10. 生成的 pyc 文件統一放到 __pycache__
  11. 一些內置庫的修改。urllib, selector 等
  12. 性能優化等
 
Python3新增
  1. yield from 連接字生成器
  2. asyncio 內置庫,async/await 原生協程支持異步編程
  3. 新的內置庫 enum, mock, asyncio, ipaddress, concurrent.futures 等
 
2/3的兼容工具
  1. six 模塊
  2. 2to3 等工具轉換代碼
  3. __future__
 
傳遞參數(一個容易混淆的問題)
  1. 傳遞值仍是引用呢?都不是。惟一支持的參數傳遞是共享傳參
  2. Call by Object(Call by Object Reference or Call by Sharing)
  3. Call by sharing(共享傳參)。函數形參得到實參中各個引用的副本
  4. 默認參數只計算一次
 
可變/不可變的對象
  1. 哪些是可變對象?哪些不可變?
  2. 不可變對象 bool/int/float/tuple/str/frozenset
  3. 可變對象 list/set/dict
  4. 可變對象每次賦值的時候拷貝自身的引用,而不可變對象則是建立一個新的對象
 
*args, **kwargs含義是什麼
  1. 用來處理可變參數
  2. *args 被打包成 tuple
  3. **kwargs 被打包成 dict
 
使用異常的常見場景
  1. 網絡請求(超時、鏈接錯誤等)
  2. 資源訪問(權限問題、資源不存在)
  3. 代碼邏輯(越界訪問、KeyError等)
 
Cpython GIL
  1. Cpython 解釋器的內存管理並非線程安全的
  2. 保護多線程狀況下對 Python 對象的訪問
  3. Cpython 使用簡單的鎖機制避免多個線程同時執行字節碼
 
GIL的影響
  1. 同一個時間只能有一個線程執行字節碼
  2. CPU 密集程序難以利用多核優點
  3. IO 期間會釋放 GIL,對 IO 密集程序影響不大
 
規避GIL影響
  1. CPU 密集可使用多進程 + 進程池
  2. IO 密集使用多線程/協程
  3. cython 擴展
 
剖析程序性能
  1. 二八定律,大部分時間耗時在少許代碼上
  2. 內置的 profile/cprofile 等工具
  3. 使用 pyflame(uber開源) 的火焰圖工具
 
服務端性能優化(Web應用通常語言不會成爲瓶頸)
  1. 數據結構與算法優化
  2. 數據庫層:索引優化,慢查詢消除,批量操做減小 IO、NoSQL
  3. 網絡IO:批量操做,pipeline 操做減小 IO
  4. 緩存:使用內存數據庫 redis/memcached
  5. 異步:asyncio,celery
  6. 併發:gevent/多線程
 
生成器
  1. 生成器就是能夠生成值的函數
  2. 當一個函數裏有了 yield 關鍵字就成了生成器
  3. 生成器能夠掛起執行而且保持當前執行的狀態
 
 基於生成器的協程
  1. pep 342(Coroutines via Enhanced Generators)加強生成器功能
  2. 生成器能夠經過 yield 暫停執行和產出數據
  3. 同時支持 send() 向生成器發送數據和 throw() 向生成器拋異常
 
 協程注意點
  1. 協程須要使用 send(None) 或者 next(coroutine)來預激(prime)才能啓動
  2. 在 yield 處協程會暫停執行
  3. 單獨的 yield value 會產出值給調用方
  4. 能夠經過 coroutine.send(value) 來給協程發送值,發送的值會賦值給 yield 表達式左邊的變量 value = yield
  5. 協程執行完成後(沒有遇到下一個 yield 語句)會拋出 StopIteration 異常
 
單元測試
  1. 針對程序模塊進行正確性檢驗
  2. 一個函數,一個類進行驗證
  3. 自底向上保證程序正確性
 
單元測試的重要性
  1. 保證代碼邏輯的正確性(甚至有些採用測試驅動開發(TDD))
  2. 單測影響設計,易測的代碼每每是高內聚低耦合的
  3. 迴歸測試,防止改一處整個服務不可用
 
單元測試庫
  1. nose/pytest 較爲經常使用
  2. mock 模塊用來模擬替換網絡請求等
  3. coverage 統計測試覆蓋率 
相關文章
相關標籤/搜索