作為初學(xué)者應(yīng)避免的四個常見 Python 錯誤
Python 對于初學(xué)者來說是一門優(yōu)秀的語言,但這并不意味著就不會犯錯誤。 尤其是在學(xué)習(xí)編程的早期階段,很容易編寫出技術(shù)上正確但風(fēng)格上很差的代碼。
如果您要學(xué)習(xí)編碼,那么學(xué)好它是至關(guān)重要的。 無論是在學(xué)術(shù)界還是工業(yè)界,代碼的質(zhì)量都很重要。 它不僅會影響您,還會影響將繼續(xù)閱讀和使用您的代碼的每一個人。 也許更自私的是,它還會影響您的招聘前景。
在本文中,我將討論介紹性 Python 程序員常犯的四個錯誤。 在我早期的 Python 時代學(xué)習(xí)這些陷阱對我非常有幫助,我希望它也能對你有用。
讓我們開始吧。
布爾條件語句
這是入門程序員常犯的錯誤。 這也是不那么入門的程序員所犯的錯誤,他們?nèi)狈φ降木幊瘫尘?,因為他們只是將代碼用作工具。 我在看著你,數(shù)據(jù)科學(xué)家。
Python 中的條件語句很有用,但并不總是必需的。 當(dāng)您檢查的條件已經(jīng)包含布爾值(真或假)時,尤其如此。
讓我用一個簡單的例子來說明。 假設(shè)我們要編寫代碼來確定一個數(shù)據(jù)集是否已經(jīng)被清理過。 對我們來說幸運的是,代碼庫包含一個名為 is_data_clean 的方便變量,它可以跟蹤這一點。 我們需要做的就是檢查它并返回正確的值。
作為第一次嘗試,我們可能會編寫如下內(nèi)容:
這已經(jīng)可以運行了,但它不必如此復(fù)雜。 你看到問題了嗎? 仔細看。
變量 is_data_clean 已經(jīng)是一個布爾值; 因此,它已經(jīng)包含了您需要返回的值! 代碼檢查它是否為 True,然后返回 True,如果它不是 True(意味著它為 False),則代碼返回 False。 這只是一大堆不必要的檢查。
我們可以將函數(shù)中的代碼簡化為一行:
好多了。
手動求和、均值或其他內(nèi)置操作
Python 具有比大多數(shù)人意識到的更多的內(nèi)置功能。 仍然使用循環(huán)來手動計算總和的人數(shù)實在是太多了。
如果我們在 Python 中有一個數(shù)字列表,我們絕對不應(yīng)該像這樣計算總和:
請改用內(nèi)置的求和函數(shù):
需要最小值還或最大值? 全宇宙都禁止你寫這樣的代碼:
這不是介紹性的計算機科學(xué)原理課程; 這是真實的世界。 停止重新發(fā)明輪子并使用內(nèi)置的 min 和 max 函數(shù):
?有關(guān)內(nèi)置函數(shù)的完整列表,請參閱 Python 文檔
獎勵:技術(shù)上不是內(nèi)置的內(nèi)置功能。
有些功能很難找到,但這并不意味著您不應(yīng)該找到它們。
例如,如果我們需要一列數(shù)字?的平均值(您可能會感覺到這是反復(fù)出現(xiàn)的主題),我們可以使用下面的第一個代碼片段,但我們應(yīng)該使用第二個:
通常,Python 會在模塊中提供有用的函數(shù)。 定位我們需要的模塊并導(dǎo)入函數(shù)可能需要一些額外的工作,但非常值得。
請記住 — Python 就是簡單性和可讀性。 內(nèi)置函數(shù)是你的朋友。 與你的人類朋友不同,他們永遠不會讓人失望。
不做無意義的事情
在我教授的一門 Python 入門課程中,學(xué)生的第一個項目是編寫一個簡單的決策算法。 這主要是一個條件練習(xí),要求學(xué)生定義一個問題和相關(guān)的評分系統(tǒng),以確定某人有資格回答這個問題的可能性。
例如,有人可能會問,“我應(yīng)該成為一名數(shù)據(jù)科學(xué)家嗎?” 然后,該算法可能包含以下問題,所有這些問題都會根據(jù)答案從最終輸出分數(shù)中增加或減少:
- 我是否有興趣使用數(shù)據(jù)來深入了解世界?
- 我愿意學(xué)習(xí) Python 嗎?
- 我喜歡與多學(xué)科團隊合作嗎?
等等。
在編寫算法的過程中,許多學(xué)生意識到在某些情況下,他們根本不想對總分做任何事情。 例如,他們可能會決定,如果有人愿意學(xué)習(xí) Python,那么他們的總分會增加 10 分,但如果他們不愿意,則分數(shù)保持不變。
大多數(shù)學(xué)生使用以下代碼實現(xiàn)它:
這是什么都不做的經(jīng)典案例。 讓我們分解一下 Python 在看到代碼行 score += 0 時必須執(zhí)行的所有操作:
- 它需要查找變量 score 的值。
- 它需要將 0 添加到該值。 這需要調(diào)用加法函數(shù),傳入兩個參數(shù)(當(dāng)前值和 0),并計算輸出。
- 將 score 變量重新分配給新值(顯然是相同的)。
所有這些代碼什么都不做。
當(dāng)然,這對計算機來說不是很大的工作量,也不會對代碼的效率產(chǎn)生任何有意義的影響。 也就是說,它毫無意義,而且有些不干凈,這是優(yōu)秀 Python 代碼所不具備的特征。
更好的解決方案是使用 Python 的 pass 關(guān)鍵字,它實際上告訴 Python 什么都不做,繼續(xù)前進。 它填充了一行不需要的代碼,但如果完全留空就會出錯。 我們甚至可以添加一點評論以提供進一步的清晰度:
更干凈、更清晰、更 Pythonic。
單一的條件變得瘋狂
條件語句可以說是標準編程中最強大和一致的結(jié)構(gòu)之一。 第一次學(xué)習(xí)它時,很容易忽略一個重要的微妙之處。
當(dāng)我們要檢查兩個或多個條件時,就會出現(xiàn)這種情況。 例如,假設(shè)我們正在審查一項調(diào)查,以獲取以下三種形式之一的回答:“Yes”、“No”或“Maybe”。
早期的 Python 程序員通常使用以下兩種方式之一對此進行編碼:
在這種情況下,這兩個代碼片段實際上是相同的。 它們的行為方式相同,理解起來并不特別混亂,并且它們實現(xiàn)了預(yù)期的目標。 當(dāng)人們錯誤地認為上面的兩個結(jié)構(gòu)總是等價時,問題就出現(xiàn)了。
這是錯誤的。 上面的第二個代碼片段是由多個部分組成的單個條件表達式,而第一個代碼片段由三個獨立的條件表達式組成,盡管它們看起來是相互關(guān)聯(lián)的。
為什么這很重要? 因為每當(dāng) Python 看到一個全新的 if 關(guān)鍵字(即一個新的條件表達式開始)時,它就會檢查關(guān)聯(lián)的條件。 另一方面,如果當(dāng)前條件表達式中的先前條件不滿足,Python 只會輸入 elif 或 else 條件。
讓我們看一個例子,看看為什么這很重要。 假設(shè)我們需要編寫代碼,根據(jù)學(xué)生在某項作業(yè)中的分數(shù)給他們打分。 我們在Python 文件中寫入以下代碼:
運行此代碼輸出以下內(nèi)容:
你看得到差別嗎? 在第二種情況下,我們得到了意想不到的輸出。 為什么? 因為 Python 將每個 if 語句作為一個新的條件來讀取,所以如果一個分數(shù)恰好小于多個數(shù)字檢查,則會為所有這些打印出相應(yīng)的字母等級。
現(xiàn)在,有多種方法可以使用多個 if 語句; 例如,我們可以讓條件檢查范圍而不僅僅是上限。 這個例子的重點不是爭論一個例子優(yōu)于另一個例子(盡管為了清楚起見,我個人傾向于使用 elif 和 else),而只是為了說明它們是不一樣的。
確保你明白這一點。
最后的想法和回顧
這是您的 Python 初學(xué)者備忘單:
- 當(dāng)您可以簡單地直接返回布爾值時,不要為布爾值設(shè)置不必要的條件。
- 內(nèi)置函數(shù)是您最好的朋友。
- 如果您需要告訴 Python 什么都不做,請使用 pass 關(guān)鍵字。
- 確保正確構(gòu)造條件表達式,理解 if 、 elif 和 else 關(guān)鍵字的含義。
你決定學(xué)習(xí) Python 真是太好了——我向你保證,這門語言會對你很好。