草草的看了一遍,有些設計代碼講解地方由於個人層次不及,尚不能理解。python
基本
# 處理不一樣版本的包名不一樣,或者使用兼容包模擬另外一個包
try:
import functionXX
except ImportError:
import python2_functionXX as functionXX
# 處理2和3不一樣包引入,設置能夠預設2to3的兼容方案
import sys
if sys.version < "3":
import python2_functionXX as functionXX
else:
import functionXX
變量與類型
- Python是動態類型的語言,變量沒有一個固定的類型。變量被實現爲對象的指針。
- 複用變量名對代碼效率提高沒有任何幫助
- 一個變量只賦值一次是良好的實踐
- 變量命名示例:item_string = "sb" \n item_list= [250,520]
- 可變類型:容許in-place改變對象的內容,例如列表和字典,都提供了append()或者pop()等變動自身的方法
- 可變類型不能用做字典的鍵,由於字典在鍵存儲時使用了哈希方式,不容許鍵發生變化
- 字符串是不可變類型
-
字符拼接:apache
sb = "me"
sb2 = "you"
string = "%s %s " %(sb,sb2) # 官方廢棄
string = "{},{}".format(sb,sb2)
string = "{0},{1}".format(sb,sb2) # 與C#的方式略有相似
string = "{people1},{people2}".format(people1=sb,people2=sb2) # 最佳風格
文檔
內部
- Python調用棧包含當前Python解釋器正在執行的指令。若是函數f()調用了函數g(),那麼函數f()會先入棧。待g()被調用時則會入棧壓到f()的上面。當g()返回時,它從棧中被彈出,f()會從原來中斷的位置繼續執行。
代碼發佈
- 通常會使用PyInstaller去打包程序,PyInstaller會將程序用到的全部Python庫都放入dist文件夾,因此在分發可執行文件時,須要分發整個dist文件夾
命令行應用
- argparse替代了已經廢棄的optparse模塊,是Python標準庫內置的包。最優使用
- docopt使用函數或者文件的doc位置設置命令行交互。
- click使用註釋器的方式來實現命令交互編寫
- clint能夠着色和便利的處理縮進問題
GUI應用
- tkinter庫全部依賴已經捆綁進Python發行版
- PyObjC能夠提供OC接口,製做MacOS的專用程序
WSGI服務器
- 相比較於傳統的Web服務器(nginx,apache),wsgi服務器性能好,資源少。
- 比較流行的的服務器有gunicorn,其使用配置比較簡單
代碼管理和改進
- 持續集成,tox |> 打包,測試,部署,Travis-CI |> 分佈式持續集成,可與GitHub無縫集成並評論Pull Request
- 與Jenkins API進行交互最經常使用的Python工具是python-jenkins
- 服務器自動化:ssh |> Ansible |> 最大的優點是不要求在客戶端上安裝Python之外的任何東西
- 系統監控: RawSystemInfo |> psutil > glances (擴展版的top,比較綜合,信息全)
- 系統任務管理:ssh |> Fabric
速度優化
- threading 多線程,使用多線程,當Python內核發現某個線程正阻塞在I/O讀寫上時,會切換到另外一個線程來使用處理器,直到這個線程也被阻塞和結束
- mutliprocessing 多進程,可是不一樣進程之間的通訊須要注意數據的共享安全
- subprocess用於發起系統調用,推薦Python2用戶使用subprocess32版本,該版本修復了若干bug
- PyPy 是Python的一個純Python實現。使用PyPy代碼不須要任何改動,就能運行得更快。
- future.concurrent 這個包裝了threading和mutliprocessing,用起來方便,可是性能略差。(我的見解)
數據序列化
- 將結構數據轉化爲可以被共享或者存儲的格式,保留必要的信息傳輸數據的接收端(或者從存儲中讀取數據時)可以在內存中重建對象
- 可讓被序化的數據佔用最小化,便於最小化磁盤需求或者網絡帶寬需求
- pickle模塊在遇到錯誤和惡意結構的數據時是不安全的,不要使用pickle對來源不明的數據進行反序列化
- 跨語言序列化可使用谷歌的protobuf
網絡編程
- asyncio 提供異步事件循環來管理與非阻塞套接字或者隊列通訊,以及任意用戶定義的協程。asyncio目前仍不成熟。臨時性的存在於標準庫中
- gevent 因輕量,與底層C庫libev緊耦合,性能很高,而被普遍使用
- pika 提供一個清涼的AMQP客戶端,用於鏈接RabbitMQ或者其餘消息代理