理解pythonic概念, 詳見書籍<<python之禪>>
編寫pythonic代碼
1. 避免不規(guī)范代碼, 比如只用大小寫區(qū)分變量, 使用容易混淆的變量名, 害怕過長(zhǎng)變量名等.
但是, 有時(shí)長(zhǎng)的變量名會(huì)使代碼更加易讀.
2. 深入學(xué)習(xí)python相關(guān)知識(shí), 比如語言特性, 庫(kù)特性等, 比如python演變過程等. 深入學(xué)習(xí)一兩個(gè)業(yè)內(nèi)公認(rèn)的python的代碼庫(kù), 比如Django, Flask.
理解python與C的不同之處, 比如縮進(jìn)與{}, 單引號(hào)與雙引號(hào), 三元操作符, switch-case語句.
在代碼中適當(dāng)添加注釋
適當(dāng)添加空行, 使代碼布局更加合理
編寫函數(shù)的4個(gè)原則
1. 函數(shù)設(shè)計(jì)要盡量短小, 嵌套層次不宜過深
2. 函數(shù)聲明應(yīng)該做到合理, 簡(jiǎn)單, 易用
3. 函數(shù)參數(shù)設(shè)計(jì)應(yīng)該考慮向下兼容
4. 一個(gè)函數(shù)只做一件事, 盡量保證函數(shù)粒度的一致性
將常量集中在一個(gè)文件, 且常量名盡量使用全大寫字母
編程慣用法
利用assert 語句來發(fā)現(xiàn)問題, 但要注意, 斷言會(huì)影響效率
數(shù)據(jù)交換值時(shí)不推薦使用臨時(shí)變量, 而是直接a, b = b, a
充分利用惰性計(jì)算(lazy evaluation)的特性, 從而避免不必要的計(jì)算
理解枚舉替代實(shí)現(xiàn)的缺陷(最新版python已經(jīng)加入了枚舉特性)
不推薦使用type來進(jìn)行類型檢查, 因?yàn)橛袝r(shí)候type的結(jié)果并不一定可靠. 如果有需求, 建議使用isinstance函數(shù)來代替
盡量將變量轉(zhuǎn)化為浮點(diǎn)類型后再做除法(python3以后不用考慮)
警惕eval()函數(shù)的安全漏洞, 有點(diǎn)類似SQL注入
使用enumerate()同時(shí)獲取序列迭代的索引和值
分清==和is的適用場(chǎng)景, 特別是在比較字符串等不可變類型變量時(shí)
構(gòu)建合理的包層次來管理module
基本用法
有節(jié)制的使用from ... import語句, 防止污染命名空間
i+=1 不等于++i, 在python中, ++i前邊的加號(hào)僅表示正, 不表示操作
習(xí)慣使用with自動(dòng)關(guān)閉資源, 特別是在文件讀寫中
使用else子句簡(jiǎn)化循環(huán)(異常處理)
遵循異常處理的幾點(diǎn)基本原則
1. 注意異常的粒度, try塊中盡量少寫代碼
2. 謹(jǐn)慎使用單獨(dú)的except語句, 或except Exception語句, 而是定位到具體異常
3. 注意異常捕獲的順序, 再合適的層次處理異常
4. 使用更加友好的異常信息, 遵守異常參數(shù)的規(guī)范
避免finally中可能發(fā)生的缺陷
深入理解None, 正確判斷對(duì)象是否為空
連接字符串應(yīng)優(yōu)先使用join函數(shù), 而不是+操作
格式化字符串時(shí)盡量使用.format函數(shù), 而不是%形式. 最好是使用f''
區(qū)別對(duì)待可變對(duì)象和不可變對(duì)象, 特別是作為函數(shù)參數(shù)時(shí)
[], {}, (): 一致的容器初始化形式. 使用列表解析可以使代碼更清晰, 同時(shí)效率更高.
函數(shù)傳參數(shù), 既不是傳值也不是傳引用, 而是傳對(duì)象或者說對(duì)象的引用
警惕默認(rèn)參數(shù)潛在的問題, 特別是當(dāng)默認(rèn)參數(shù)為可變對(duì)象時(shí).
函數(shù)中慎用變長(zhǎng)參數(shù)args, kargs
1. 這種使用太靈活, 從而使的函數(shù)簽名不夠清晰, 可讀性變差
2. 如果因?yàn)閰?shù)過多而使用變長(zhǎng)參數(shù)簡(jiǎn)化函數(shù)定義, 那么一般該函數(shù)可以重構(gòu)
深入理解str()和repr()的區(qū)別
1. 兩者之間的目標(biāo)不同: str主要面向客戶, 其目的使可讀性, 返回形式為用戶友好性和可讀性都比較高的字符串形式;
repr是面向python解釋器或者說是python開發(fā)人員的, 其目的是準(zhǔn)確性, 其返回值表示python解釋器內(nèi)部的定義
2. 在解釋器中直接輸入變量, 默認(rèn)調(diào)用repr函數(shù), 而`print(var)`默認(rèn)調(diào)用str函數(shù)
3. repr函數(shù)的返回值一般可以用eval函數(shù)來還原對(duì)象
4. 兩者分別調(diào)用對(duì)象的內(nèi)建函數(shù)`__str__()`和`__repr__()`
分清靜態(tài)方法 static method 和類方法 class method的使用場(chǎng)景
庫(kù)的使用
掌握字符串的基本用法
按需選擇sort()
和sorted()
函數(shù)
1. `sort()`是列表在就地進(jìn)行排序, 所以不能排序元組等不可變類型
2. `sorted()`可以排序任意的可迭代類型, 同時(shí)不改變?cè)兞勘旧?
使用copy()
模塊深拷貝對(duì)象, 區(qū)分淺拷貝(shallow copy) 和深拷貝(deep copy)
使用Counter進(jìn)行計(jì)數(shù)統(tǒng)計(jì), Counter是字典類的子類, 在collections模塊中
深入掌握ConfigParse
使用argparse模塊處理命令行參數(shù)
使用pandas處理大型csv文件
python本身提供一個(gè)csv文件處理模塊, 并提供reader, writer等函數(shù)
pandas可提供分塊, 合并處理等, 適用于數(shù)據(jù)量大的情況, 且對(duì)二維數(shù)據(jù)操作更方便
使用ElementTree解析xml
理解模塊pickle的優(yōu)劣
1. 優(yōu)勢(shì): 接口簡(jiǎn)單, 各平臺(tái)通用, 支持的數(shù)據(jù)類型廣泛, 擴(kuò)展性強(qiáng)
2. 劣勢(shì): 不保證操作的原子性, 存在安全問題, 不同語言之間不兼容
序列化的另一個(gè)選擇json模塊: load和dump操作
使用traceback獲取棧信息
使用logging記錄日志信息
使用treading模塊編寫多線程程序
使用Queue模塊使多線程編程更安全
設(shè)計(jì)模式
利用模塊實(shí)現(xiàn)單例模式
用mixin模式讓程序更加靈活
用發(fā)布-訂閱模式實(shí)現(xiàn)松耦合
用狀態(tài)模式美化代碼
內(nèi)部機(jī)制
理解build-in對(duì)象
init()不是構(gòu)造方法, 理解new()與它之間的區(qū)別
理解變量的查找機(jī)制, 即作用域
局部作用域 - 全局作用域 - 嵌套作用域 - 內(nèi)置作用域
為什么需要self參數(shù)
理解MRO(方法解析順序)與多繼承
理解描述符機(jī)制
區(qū)別__getattr__()
與__getattribute__()
方法之間的區(qū)別
使用更安全的property
掌握元類metaclass
熟悉python對(duì)象協(xié)議
利用操作符重載實(shí)現(xiàn)中綴語法
熟悉python的迭代器協(xié)議
熟悉python的生成器
基于生成器的協(xié)程和greenlet, 理解協(xié)程, 多線程, 多進(jìn)程之間的區(qū)別
理解GIL的局限性
對(duì)象的管理和垃圾回收
使用工具輔助項(xiàng)目開發(fā)
從pypianzhuang第三方包
使用pip和yolk安裝管理包
做paster創(chuàng)建包
理解單元測(cè)試的概念
為包編寫單元測(cè)試
利用測(cè)試驅(qū)動(dòng)開發(fā)(TDD)提高代碼的可測(cè)性
使用pylint檢查代碼風(fēng)格
代碼風(fēng)格審查
代碼錯(cuò)誤檢查
發(fā)現(xiàn)重復(fù)以及不合理的代碼, 方便重構(gòu)
高度的可配置化和可定制化
支持各種IDE和編輯器的集成
進(jìn)行高效的代碼審查
將包發(fā)布到pypi
性能剖析與優(yōu)化
了解代碼優(yōu)化的基本原則
借助性能優(yōu)化工具
利用cProfile定位性能瓶頸
使用memory_profiler和objgraph剖析內(nèi)存使用
努力降低算法復(fù)雜度
掌握循環(huán)優(yōu)化的基本技巧
減少循環(huán)內(nèi)部的計(jì)算
將顯示循環(huán)改為隱式循環(huán), 當(dāng)然這會(huì)犧牲代碼的可讀性
使用生成器提高效率
使用不同的數(shù)據(jù)結(jié)構(gòu)優(yōu)化性能
充分利用set的優(yōu)勢(shì)
使用multiprocessing模塊客服GIL缺陷
使用線程池提高效率
使用Cpython編寫擴(kuò)展模塊