Python程式設計師的30個常見錯誤

2020-12-14 電子產品世界

  文章中,我將總結新老Python程式設計師常犯的一些錯誤,以幫助你們在自己的工作避免犯同樣或類似錯誤。

本文引用地址:http://www.eepw.com.cn/article/201901/396507.htm

  首先我要說明一下的是,這些都是來源於第一手的經驗。我以講授Python的知識為生。在過去的7年裡,我已經給上千名學生講授上百堂Python的課程,同時看著這些學生們犯同樣的錯。也就是說,這些是我看著Python初學者活生生犯的錯,千百次的錯。

  事實上,這些錯誤實在是太普遍了以至於我敢保證你剛開始學的時候是一定會犯的。

  「那麼是什麼呢?」你會問,「你也會在Python裡犯那麼多錯麼?」是的。Python可能是最簡單、最靈活的語言之一,但它終究還是一門程式語言。它仍然有語法,數據類型,以及巫師蒂姆居住的黑暗角落。

  典故出自《蒙蒂派森與聖杯》中的魔法師蒂姆,他主角們指點在洞穴的牆壁上記錄的聖杯位置,作者在此處的意思是Python語言裡容易犯錯的地方。另,Python語言得名於作者Guido van Rossum特別喜歡的《蒙蒂派森飛行馬戲團(Monty Python’s Flying Circus)》——譯者注

  好事情是多虧了Python那乾淨的設計,一旦你學會了Python,你就能自動的避開很多陷阱。Python在其各組件之間有著最小的互動,這能有效的減少bug。它也擁有十分簡單的語法,這意味著在一開始你就有更小的概率犯錯。當你實在是犯了錯的時候,Python的即時錯誤檢測和報告能幫你迅速的恢復。

  但用Python編程也不是個自動完成的活兒,很多事還是要早做準備。那麼廢話不多說了,讓我們直切正題。在接下來的三節裡我們將這些錯誤分為語用、代碼,以及編程三個大類。

  如果你想讀到更多的Python的常見錯誤以及如何避免它們,那麼在O』Reilly系列叢書的《Python學習手冊》(原書第5版)裡有詳細的解讀。

  01 語用錯誤

  讓我們從基礎開始,從那些剛學習編程的人鑽研語法之前碰到的事情開始。如果你已經編過一些程了,那麼以下這些可能看起來十分的簡單;如果你曾經嘗試過教新手們怎麼編程,它們可能就不這麼簡單了。

  1. 在交互提示符中輸入Python代碼

  在>>>交互提示符中你只能輸入Python代碼,而不是系統命令。時常有人在這個提示符下輸入emacs,ls,或者edit之類的命令,這些可不是Python代碼。

  在Python代碼中確實有辦法來調用系統命令(例如os.system和os.popen),但可不是像直接輸入命令這麼直接。如果你想要在交互提示符中啟動一個Python文件,請用import file,而不是系統命令python file.py。

  2. Print語句(僅僅)是在文件中需要

  因為交互解釋器會自動的講表達式的結果輸出,所以你不需要交互的鍵入完整的print語句。這是個很棒的功能,但是記住在代碼文件裡,通常你只有用print語句才能看得到輸出。

  3. 小心Windows裡的自動擴展名

  如果你在Windows裡使用記事本來編輯代碼文件的話,當你保持的時候小心選擇「所有文件」(All Files)這個類型,並且明確的給你的文件加一個.py的後綴。不然的話記事本會給你的文件加一個.txt的擴展名,使得在某些啟動方法中沒法跑這個程序。

  更糟糕的是,像Word或者是寫字板一類的文字處理軟體還會默認的加上一些格式字符,而這些字符Python語法是不認的。

  所以記得,在Windows下總是選「所有文件」(All Files),並保存為純文本,或者使用更加「編程友好」的文本編輯工具,比如IDLE。在IDLE中,記得在保存時手動加上.py的擴展名。

  4. 在Windows下點擊圖標的問題

  在Windows下,你能靠點擊Python文件來啟動一個Python程序,但這有時會有問題。首先,程序的輸出窗口在程序結束的瞬間也就消失了,要讓它不消失,你可以在文件最後加一條raw_input()的調用。另外,記住如果有錯的話,輸出窗口也就立即消失了。

  要看到你的錯誤信息的話,用別的方法來調用你的程序:比如從系統命令行啟動,通過提示符下用import語句,或者IDLE菜單裡的選項,等等。

  5. Import只在第一次有效

  你可以在交互提示符中通過import一個文件來運行它,但是這只會在一個會話中起一次作用;接下來的import僅僅是返回這個已經加載的模塊。要想強制Python重新加載一個文件的代碼,請調用函數reload(module)來達到這個目的。注意對reload請使用括號,而import不要使用括號。

  6. 空白行(僅僅)在交互提示符中有作用

  在模塊文件中空白行和注釋統統會被忽略掉,但是在交互提示符中鍵入代碼時,空白行表示一個複合語句的結束。

  換句話說,空白行告訴交互提示符你完成了一個複合語句;在你真正完成之前不要鍵入回車。事實上當你要開始一個新的語句時,你需要鍵入一個空行來結束當前的語句——交互提示符一次只運行一條語句。

  02 代碼錯誤

  一旦你開始認真寫Python代碼了,接下來了一堆陷阱就更加危險了——這些都是一些跨語言特性的基本代碼錯誤,並常常困擾不細心的程式設計師。

  7. 別忘了冒號

  這是新手程式設計師最容易犯的一個錯誤:別忘了在複合語句的起始語句(if,while, for等語句的第一行)結束的地方加上一個冒號「:」。也許你剛開始會忘掉這個,但是到了很快這就會成為一個下意識的習慣。課堂裡75%的學生當天就可以記住這個。

  8. 初始化變量

  在Python裡,一個表達式中的名字在它被賦值之前是沒法使用的。這是有意而為的:這樣能避免一些輸入失誤,同時也能避免默認究竟應該是什麼類型的問題(0,None,」」,[],?)。記住把計數器初始化為0,列表初始化為[],以此類推。

  9. 從第一列開始

  確保把頂層的,未嵌套的代碼放在最左邊第一列開始。這包括在模塊文件中未嵌套的代碼,以及在交互提示符中未嵌套的代碼。Python使用縮進的辦法來區分嵌套的代碼段,因此在你代碼左邊的空格意味著嵌套的代碼塊。除了縮進以外,空格通常是被忽略掉的。

  10. 縮進一致

  在同一個代碼塊中避免講tab和空格混用來縮進,除非你知道運行你的代碼的系統是怎麼處理tab的。否則的話,在你的編輯器裡看起來是tab的縮進也許Python看起來就會被視作是一些空格。保險起見,在每個代碼塊中全都是用tab或者全都是用空格來縮進;用多少由你決定。

  11. 在函數調用時使用括號

  無論一個函數是否需要參數,你必須要加一對括號來調用它。即,使用function(),而不是function。Python的函數簡單來說是具有特殊功能(調用)的對象,而調用是用括號來觸發的。像所有的對象一樣,他們也可以被賦值給變量,並且間接的使用他們:x=function:x()。

  在Python的培訓中,這樣的錯誤常常在文件的操作中出現。通常會看到新手用file.close來關閉一個問題,而不是用file.close()。因為在Python中引用一個函數而不調用它是合法的,因此不使用括號的操作(file.close)無聲的成功了,但是並沒有關閉這個文件!

  12. 在Import時不要使用表達式或者路徑

  在系統的命令行裡使用文件夾路徑或者文件的擴展名,但不要在import語句中使用。即,使用import mod,而不是import mod.py,或者import dir/mod.py。

  在實際情況中,這大概是初學者常犯的第二大錯誤了。因為模塊會有除了.py以為的其他的後綴(例如,.pyc),強制寫上某個後綴不僅是不合語法的,也沒有什麼意義。

  和系統有關的目錄路徑的格式是從你的模塊搜索路徑的設置裡來的,而不是import語句。你可以在文件名裡使用點來指向包的子目錄(例如,import dir1.dir2.mod),但是最左邊的目錄必須得通過模塊搜索路徑能夠找到,並且沒有在import中沒有其他路徑格式。

  不正確的語句import mod.py被Python認為是要記在一個包,它先加載一個模塊mod,然後試圖通過在一個叫做mod的目錄裡去找到叫做py的模塊,最後可能什麼也找不到而報出一系列費解的錯誤信息。

  13. 不要在Python中寫C代碼

  以下是給不熟悉Python的C程式設計師的一些備忘貼士:

  在if和while中條件測試時,不用輸入括號(例如,if (X==1):)。如果你喜歡的話,加上括號也無妨,只是在這裡是完全多餘的。

  不要用分號來結束你的語句。從技術上講這在Python裡是合法的,但是這毫無用處,除非你要把很多語句放在同一行裡(例如,x=1; y=2; z=3)。

  不要在while循環的條件測試中嵌入賦值語句(例如,while ((x=next() != NULL))。在Python中,需要表達式的地方不能出現語句,並且賦值語句不是一個表達式。

  03 編程錯誤

  下面終於要講到當你用到更多的Python的功能(數據類型,函數,模塊,類等等)時可能碰到的問題了。由於篇幅有限,這裡儘量精簡,尤其是對一些高級的概念。要想了解更多的細節,敬請閱讀《Python學習手冊》。

  14. 打開文件的調用不使用模塊搜索路徑

  當你在Python中調用open()來訪問一個外部的文件時,Python不會使用模塊搜索路徑來定位這個目標文件。它會使用你提供的絕對路徑,或者假定這個文件是在當前工作目錄中。模塊搜索路徑僅僅為模塊加載服務的。

  15. 不同的類型對應的方法也不同

  列表的方法是不能用在字符串上的,反之亦然。通常情況下,方法的調用是和數據類型有關的,但是內部函數通常在很多類型上都可以使用。舉個例子來說,列表的reverse方法僅僅對列表有用,但是len函數對任何具有長度的對象都適用。

  16. 不能直接改變不可變數據類型

  記住你沒法直接的改變一個不可變的對象(例如,元組,字符串):

  T = (1, 2, 3)

  T[2] = 4 # 錯誤

  用切片,聯接等構建一個新的對象,並根據需求將原來變量的值賦給它。因為Python會自動回收沒有用的內存,因此這沒有看起來那麼浪費:

  T = T[:2] + (4,) # 沒問題了: T 變成了 (1, 2, 4)

  17. 使用簡單的for循環而不是while或者range

  當你要從左到右遍歷一個有序的對象的所有元素時,用簡單的for循環(例如,for x in seq:)相比於基於while-或者range-的計數循環而言會更容易寫,通常運行起來也更快。

  除非你一定需要,儘量避免在一個for循環裡使用range:讓Python來替你解決標號的問題。在下面的例子中三個循環結構都沒有問題,但是第一個通常來說更好;在Python裡,簡單至上。

  S = "lumberjack"

  for c in S: print c # 最簡單

  for i in range(len(S)): print S[i] # 太多了

  i = 0 # 太多了

  while i < len(S): print S[i]; i += 1

相關焦點

  • Python程式設計師最常犯的10個錯誤
    常見錯誤3:錯誤地指定異常代碼塊(exception block)的參數請看下面這段代碼:>>> try:...     l = ["a", "b"]...    但是,如果你是一名Python程式設計師,不管怎樣你都應該要了解這種解決方法。
  • Python程式設計師最常犯的10個錯誤,你中招了嗎?
    鑑於此,本文列出了Python開發人員常犯的10個小錯誤,資深程序猿也難免會中招哦。常見錯誤3:錯誤指定異常代碼塊的參數假設你有如下代碼:>>>常見錯誤4:錯誤理解Python中變量的作用域
  • 好程式設計師Python教程分享常見的Python面試題
    好程式設計師Python教程分享常見的Python面試題,程式設計師面試難免會需要進行筆試,筆試是考驗程式設計師基礎功底的重要環節,根據很多小夥伴的面試反饋,今天總結分享了一些常見的Python面試題,想要看Python面試是不是可以順利通過,這些常見的Python面試題你應該看看。
  • 初學Python常見異常錯誤
    初學Python常見錯誤忘記寫冒號誤用=錯誤 縮緊變量沒有定義中英文輸入法導致的錯誤
  • 程式設計師最愛的13個免費Python課程
    學習Python是個好主意。無論你是一個初學者還是C++或Java專家,都無需擔心其派不上用場。像學習Unix、SQL、數據結構和算法一樣,任何時間或金錢的投入都會帶來長期豐厚的回報。簡言之,Python經得起時間的檢驗,關鍵的二十年過去了,它仍屹立不倒。有人喜歡從免費課程開始學習,是個好想法。因為這能激勵人的探索欲。而且,免費並不代表劣質。
  • 新手常見的5個Python錯誤
    無論選擇哪種IDE,都可能會遇到一些錯誤。這些錯誤和問題的發生主要是由於判斷失誤,對特定主題缺乏深入的知識,或者僅僅可能是不小心導致的。本篇文章總結了一些初學者常犯的5種錯誤,這些錯誤雖然特別簡單,但是對於初學者來說可能會浪費比較多的時間在上面。而且由於每個人的編程習慣不同,錯誤狀態百出,有時候也不是能從網上直接搜索到錯誤原因。
  • 新手必看,17 個常見的 Python 運行時錯誤
    本文介紹了在Python運行時常見的 17 個錯誤,希望能夠幫助到大家。
  • Python程式設計師用文字加密的方式,給女程式設計師寫情書,一周後牽手回家
    誰說程式設計師不浪漫,尤其是Python程式設計師,對文字加密後,寫情書只有特定的人才能看懂。 ,這樣即使情書被別人看到,也看不懂,只有那位女程式設計師才能破解密碼,被拒絕也不會丟面子。
  • 致命錯誤!Python開發者的7個崩潰瞬間
    具有面向對象編程背景的開發人員容易忽略Python的慣用特性,很可能會濫用編程結構,從而產生不可預見且很難捕捉的錯誤。更糟糕的是,大多數錯誤很難發現,可能在後續工作中造成麻煩。下文匯總了程式設計師(尤其是新手)可能犯的常見錯誤,以及該如何糾正這些錯誤,編寫更好的、無錯誤的Python代碼。讓我們開始吧!
  • 看了這個鍵盤,你認為是什麼語言程式設計師?python程式設計師:不是我!
    從決定開始做程式設計師的那一刻,就註定了,今後的日子要與鍵盤長相廝守了,如果鍵盤是常年是嶄新的,那一定不是程式設計師的鍵盤,如果你是程式設計師,就很有可能從你的鍵盤上看到長期戰鬥的痕跡,這些痕跡往往是程式設計師常年鍾愛的哪些按鍵都被磨沒了,那麼程式設計師到底鍾愛哪些按鍵呢,有人說「;」鍵,也有人說「ctrl」,"
  • Python中Lambda的前4個錯誤
    如此之多,以至於許多Python程式設計師都想儘可能地使用它們。當然,lambda具有使我們的代碼簡潔的優勢,但是在項目中過度使用它們會導致濫用,從而降低我們代碼的可讀性和可維護性。在開始研究這些誤用是什麼之前,讓我們先快速回顧一下lambda。如果您對它們非常了解,則可以跳到下一部分。
  • 17個新手常見 Python 運行時錯誤
    1)忘記在 if , elif , else , for , while , class ,def 聲明末尾添加 :(導致 「SyntaxError :invalid syntax」)該錯誤將發生在類似如下代碼中:if spam == 42 print('Hello!')
  • 八行python代碼展現程式設計師從入門到大神的八種階段
    你敢想像你從入門python代碼、網絡達人、反重力怪才、愛情自由怪、資源盜獵者、頓悟入禪、無所不能或者卷鋪跑路8個狀態只用了簡簡單單的8行代碼嗎?這八種狀態也是一個程式設計師從入門到大神(跑路)的八個階段,每個階段對應一行代碼並且可以直接運行,看看你現在已經到了哪個階段1.初學pythonprint("Hello World!")
  • Python程式設計師進階之路:從新手到高手的100個模塊
    ,真實反映了 python 程式設計師在成長過程中的一些困惑。英漢小詞典pythoneer - 指所有用python語言開發程序的人pythonista - 意為資深的、追求質量和品味的python開發者本文所列舉的這100個模塊,是在工作和學習中用過的或者正在學習的,算是學習總結。希望對處在迷茫中的程式設計師有所幫助。
  • 好程式設計師Python培訓分享numpy簡介
    好程式設計師Python培訓分享numpy簡介:一、numpy簡介:NumPy是一個功能強大的Python庫,主要用於對多維數組執行計算。NumPy這個詞來源於兩個單詞-- Numerical和Python。NumPy提供了大量的庫函數和操作,可以幫助程式設計師輕鬆地進行數值計算。
  • 程式設計師翻車時的 30 種常見反應!第21個深有感觸
    花上幾個小時盯著代碼看,查找函數名或變量作用域中的錯誤,最後卻發現少了右括號,那種感覺很怪異。所有的時間都浪費在了一個很小的語法錯誤上,感覺自己真是個天才,也是個傻瓜。12.在敲了幾個小時的鍵盤之後,休息一會兒肯定有助於你思考。大多數的健康指南建議每 30 到 60 分鐘休息一次,但這完全取決於你的需要。如果總是在半途中斷,你可能也會感到惱怒。13.
  • 程式設計師Python編程必備5大工具,你用過幾個?
    Python是編程入門不錯的選擇,現在也有不少的程式設計師業餘時間會研究這門程式語言。學習Python有時候沒有第一時間找到好工具,會吃不少的苦頭。畢竟好的工具能將工作效率多倍速提升。它的自動補全非常好用,甚至用了它之後,很多程式設計師小夥伴們就不想再用自帶的Python shell啦!1、AnacondaAnaconda堪稱是數據分析的利器,附帶了一大批常用數據科學包,簡直是數據分析的標配。
  • 程式設計師翻車時的30種常見反應!第21個是不是深有感觸.
    花上幾個小時盯著代碼看,查找函數名或變量作用域中的錯誤,最後卻發現少了右括號,那種感覺很怪異。所有的時間都浪費在了一個很小的語法錯誤上,感覺自己真是個天才,也是個傻瓜。12.在敲了幾個小時的鍵盤之後,休息一會兒肯定有助於你思考。大多數的健康指南建議每 30 到 60 分鐘休息一次,但這完全取決於你的需要。如果總是在半途中斷,你可能也會感到惱怒。13.
  • 解決新手程式設計師學習中的常見困惑,以及給程式設計師新手們寫簡歷的一些...
    這種想法,在我們作為一名軟體開發人員剛進入工作領域的時候,非常常見。我也不例外。這種想法會讓人覺得自己不如其他的開發者,感覺自己是濫竽充數的,感覺自己像一個全面的傻瓜,當涉及到寫代碼的時候。做程式設計師這幾年來,接觸了不少要學習編程的小夥伴,經常提到的問題是XXX 語言怎麼入門、如何學好程式語言等問題。這裡我總結了初學者的一些困惑與大家分享。
  • 初學Python常見異常錯誤,總有一處你會遇到!
    初學Python常見錯誤忘記寫冒號誤用=