Python編程中的反模式
python是時下最熱門的編程語言之一了。簡潔而富有表達力的語法,兩三行代碼往往就能解決十來行C代碼才能解決的問題;豐富的標準庫和第三方庫,大大節約了開發時間,使它成為那些對性能沒有嚴苛要求的開發任務的首選;強大而活躍的社區,齊全的文檔,也使很多編程的初學者選擇了它作為自己的第一門編程語言。甚至有國外的報道稱,Python已經成為了美國頂尖大學里最受歡迎的編程入門教學語言。
要學好一門編程語言實屬不易,在初學階段,就糾正一些錯誤的做法,對今后的深入學習至關重要。有一位叫ConstantineLignos的博主,他是賓夕法尼亞兒童醫院放射研究部門的博士后研究員,他最近撰寫了一篇很有意義的文章,列舉了初學Python的學生們最常犯的錯誤,并對這些錯誤進行了分類和剖析,其內容提綱挈領,非常值得每個Python初學者學習。
這篇文章給出了一些在Python初學者中很常見的反模式,反模式通常是指那些不符合習慣或者會導致糟糕后果的用法。Lignos把他總結的反模式分成了四大類——迭代、性能、變量的漏洞和編程風格。下面我們逐一來看一個例子,理解這些反模式到底“反”在什么地方。
迭代
當我們需要簡單迭代一個數量范圍的時候,Python給了我們一個非常好用的函數:range。Lignos觀察到有些初學者喜歡用range來迭代列表的下表,像下面這種形式:
foriinrange(len(alist)):
printalist[i]
這代碼現在還沒什么問題,但已經不符合Python的習慣了。但下面的代碼就有問題了:
alist=['her','name','is','rio']
foriinrange(0,len(alist)-1):#漏掉了最后一個
printi,alist[i]
我們可以看一下Python官方文檔range的示例:
>>>range(1,11)
[1,2,3,4,5,6,7,8,9,10]
range的右區間是不包含在內的,如果受了直覺或其他編程語言的影響,再減1就不對了。Lignos還列舉了其他幾種錯誤的迭代模式,我們只要記住,range應該用在迭代一個數量范圍。
性能
Lignos給出了兩段代碼:
lyrics_list=['her','name','is','rio']
words=make_wordlist()
forwordinwords:
ifwordinlyrics_list:#線性時間
printword,"isinthelyrics"
和
lyrics_set=set(lyrics_list)
words=make_wordlist()
forwordinwords:
ifwordinlyrics_set:#常數時間
printword,"isinthelyrics"
哪種模式效率更高?Lignos注釋已經給出了答案。注釋的意思是,判斷一個元素是否在一組元素中存在,使用list的算法復雜度是O(n),而使用set的算法復雜度是O(1)。那是否set永遠是優于list?在其他情況下,應該用哪個數據結構?Python官方Wiki有一份專門各個數據結構操作的時間復雜度的文檔供參考,知道參考這份文檔比答案本身更重要。至于為什么,只有Python的源碼才能告訴我們。
以上內容為大家介紹了Python編程中的反模式,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。http://www.mobiletrain.org/

猜你喜歡LIKE
相關推薦HOT
更多>>
python中的filter函數功能是什么?
python中的filter函數功能是什么?在python中,面對眾多的數據,我們要過濾篩選出我們需要的數據。python中的filter函數就是起到了過濾篩選的作...詳情>>
2023-11-10 20:37:27
pythontime模塊是什么
pythontime模塊是什么在python中使用時間,就免不了和time模塊打交道,另外兩個模塊這個暫時先不做介紹。做time模塊的使用上,我們可以用它來對...詳情>>
2023-11-10 15:53:16
python是什么編程語言
python是什么編程語言1、說明是一種面向對象、解釋型計算機程序設計語言,由GuidovanRossum于1989年底發明,第一個公開發行版發行于1991年。Pyt...詳情>>
2023-11-10 15:21:05
python異常處理的兩種技巧
python異常處理的兩種技巧1、傳遞異常有時我們會在捕捉到一個異常后重新引發它(傳遞異常),實現起來很簡單,使用不帶參數的raise語句即可。deff...詳情>>
2023-11-10 14:49:39熱門推薦
python中的filter函數功能是什么?
沸python delattr函數如何使用?
熱python中pdb模塊怎么用?
熱Python如何截圖保存?
新python?中缺少module怎么辦?
python strftime和strptime的不同分析
python time.strptime的格式化
python中@contextmanager是什么?
python對象的三要素是什么
pythonGIL在Python多線程的應用
python如何對多個CSV文件進行讀取
pythonif嵌套命令如何理解?
python對列表進行永久性或臨時排序的方法
python生成器調用方法引發異常
技術干貨






