【Python基础】如何编写简洁美观的Python代码
作者 | ANIRUDDHA BHANDARI?
編譯 | VK?
來(lái)源 | Analytics Vidhya
概述
Python風(fēng)格教程將使你能夠編寫(xiě)整潔漂亮的Python代碼
在這個(gè)風(fēng)格教程中學(xué)習(xí)不同的Python約定和Python編程的其他細(xì)微差別
介紹
你有沒(méi)有遇到過(guò)一段寫(xiě)得很糟糕的Python代碼?我知道你們很多人都會(huì)點(diǎn)頭的。
編寫(xiě)代碼是數(shù)據(jù)科學(xué)家或分析師角色的一部分。另一方面,編寫(xiě)漂亮整潔的Python代碼完全是另一回事。作為一個(gè)精通分析或數(shù)據(jù)科學(xué)領(lǐng)域(甚至軟件開(kāi)發(fā))的程序員,這很可能會(huì)改變你的形象。
那么,我們?nèi)绾尉帉?xiě)這種所謂漂亮的Python代碼呢?
歡迎學(xué)習(xí)Python風(fēng)格教程
數(shù)據(jù)科學(xué)和分析領(lǐng)域的許多人來(lái)自非編程背景。我們先從學(xué)習(xí)編程的基礎(chǔ)知識(shí)開(kāi)始,接著理解機(jī)器學(xué)習(xí)背后的理論,然后開(kāi)始征服數(shù)據(jù)集。
在這個(gè)過(guò)程中,我們經(jīng)常不練習(xí)核心編程,也不注意編程慣例。
這就是本Python風(fēng)格教程將要解決的問(wèn)題。我們將回顧PEP-8文檔中描述的Python編程約定,你將成為一個(gè)更好的程序員!
目錄
為什么這個(gè)Python風(fēng)格的教程對(duì)數(shù)據(jù)科學(xué)很重要?
什么是PEP8?
了解Python命名約定
Python風(fēng)格教程的代碼布局
熟悉正確的Python注釋
Python代碼中的空格
Python的一般編程建議
自動(dòng)格式化Python代碼
為什么這個(gè)Python風(fēng)格的教程對(duì)數(shù)據(jù)科學(xué)很重要
有幾個(gè)原因使格式化成為編程的一個(gè)重要方面,尤其是對(duì)于數(shù)據(jù)科學(xué)項(xiàng)目:
可讀性
好的代碼格式將不可避免地提高代碼的可讀性。這不僅會(huì)使你的代碼更有條理,而且會(huì)使讀者更容易理解程序中正在發(fā)生的事情。如果你的程序運(yùn)行了數(shù)千行,這將特別有用。
你會(huì)有很多的數(shù)據(jù)幀、列表、函數(shù)、繪圖等,如果不遵循正確的格式準(zhǔn)則,你甚至?xí)苋菀资?duì)自己代碼的跟蹤!
協(xié)作
如果你在一個(gè)團(tuán)隊(duì)項(xiàng)目上合作,大多數(shù)數(shù)據(jù)科學(xué)家都會(huì)這樣做,那么好的格式化就成了一項(xiàng)必不可少的任務(wù)。
這樣可以確保代碼被正確理解而不產(chǎn)生任何麻煩。此外,遵循一個(gè)通用的格式模式可以在整個(gè)項(xiàng)目生命周期中保持程序的一致性。
Bug修復(fù)
當(dāng)你需要修復(fù)程序中的錯(cuò)誤時(shí),擁有一個(gè)格式良好的代碼也將有助于你。錯(cuò)誤的縮進(jìn)、不恰當(dāng)?shù)拿榷己苋菀资拐{(diào)試成為一場(chǎng)噩夢(mèng)!
因此,最好是以正確的編寫(xiě)風(fēng)格來(lái)開(kāi)始編寫(xiě)你的程序!
考慮到這一點(diǎn),讓我們快速概述一下本文將介紹的PEP-8樣式教程!
什么是PEP-8
PEP-8或Python增強(qiáng)建議是Python編程的風(fēng)格教程。它是由吉多·范羅森、巴里·華沙和尼克·科格蘭寫(xiě)的。它描述了編寫(xiě)漂亮且可讀的Python代碼的規(guī)則。
遵循PEP-8的編碼風(fēng)格將確保Python代碼的一致性,從而使其他讀者、貢獻(xiàn)者或你自己更容易理解代碼。
本文介紹了PEP-8指導(dǎo)原則中最重要的方面,如如何命名Python對(duì)象、如何構(gòu)造代碼、何時(shí)包含注釋和空格,最后是一些很重要但很容易被大多數(shù)Python程序員忽略的一般編程建議。
讓我們學(xué)習(xí)編寫(xiě)更好的代碼!
官方PEP-8文檔可以在這里找到。
https://www.python.org/dev/peps/pep-0008/
了解Python命名約定
莎士比亞有句名言:“名字里有什么?”. 如果他當(dāng)時(shí)遇到了一個(gè)程序員,他會(huì)很快得到一個(gè)答復(fù)——“很多!”.
是的,當(dāng)你編寫(xiě)一段代碼時(shí),你為變量、函數(shù)等選擇的名稱對(duì)代碼的可理解性有很大的影響。看看下面的代碼:
#?函數(shù)?1 def?func(x):a?=?x.split()[0]b?=?x.split()[1]return?a,?b print(func('Analytics?Vidhya'))#?函數(shù)?2 def?name_split(full_name):first_name?=?full_name.split()[0]last_name?=?full_name.split()[1]return?first_name,?last_name print(name_split('Analytics?Vidhya')) #?輸出 ('Analytics',?'Vidhya') ('Analytics',?'Vidhya')這兩個(gè)函數(shù)的作用是一樣的,但是后者提供了一個(gè)更好的直覺(jué)讓我們知道發(fā)生了什么,即使沒(méi)有任何注釋!
這就是為什么選擇正確的名稱和遵循正確的命名約定可以在編寫(xiě)程序時(shí)可以產(chǎn)生巨大的不同。話雖如此,讓我們看看如何在Python中命名對(duì)象!
開(kāi)頭命名
這些技巧可以應(yīng)用于命名任何實(shí)體,并且應(yīng)該嚴(yán)格遵守。
遵循相同的模式
避免使用長(zhǎng)名字,同時(shí)也不要太節(jié)儉的名字
使用合理和描述性的名稱。這將有助于以后你記住代碼的用途
避免使用以數(shù)字開(kāi)頭的名字
避免使用特殊字符,如@、!、#、$等
變量命名
變量名應(yīng)始終為小寫(xiě)
對(duì)于較長(zhǎng)的變量名,請(qǐng)使用下劃線分隔單詞。這提高了可讀性
盡量不要使用單字符變量名,如“I”(大寫(xiě)I字母)、“O”(大寫(xiě)O字母)、“l(fā)”(小寫(xiě)字母l)。它們與數(shù)字1和0無(wú)法區(qū)分。看看:
全局變量的命名遵循相同的約定
函數(shù)命名
遵循小寫(xiě)和下劃線命名約定
使用富有表現(xiàn)力的名字
如果函數(shù)參數(shù)名與關(guān)鍵字沖突,請(qǐng)使用尾隨下劃線而不是縮寫(xiě)。例如,將break轉(zhuǎn)換為break_u而不是brk
類名命名
遵循CapWord(或camelCase或StudlyCaps)命名約定。每個(gè)單詞以大寫(xiě)字母開(kāi)頭,單詞之間不要加下劃線
如果類包含具有相同屬性名的子類,請(qǐng)考慮向類屬性添加雙下劃線
這將確保類Person中的屬性__age被訪問(wèn)為 _Person__age。這是Python的名稱混亂,它確保沒(méi)有名稱沖突
class?Person:def?__init__(self):self.__age?=?18obj?=?Person()? obj.__age??#?錯(cuò)誤 obj._Person__age??#?正確對(duì)異常類使用后綴“Error”
類方法命名
實(shí)例方法(不附加字符串的基本類方法)的第一個(gè)參數(shù)應(yīng)始終為self。它指向調(diào)用對(duì)象
類方法的第一個(gè)參數(shù)應(yīng)始終為cls。這指向類,而不是對(duì)象實(shí)例
包和模塊命名
盡量使名字簡(jiǎn)短明了
應(yīng)遵循小寫(xiě)命名約定
對(duì)于長(zhǎng)模塊名稱,首選下劃線
避免包名稱使用下劃線
常量命名
常量通常在模塊中聲明和賦值
常量名稱應(yīng)全部為大寫(xiě)字母
對(duì)較長(zhǎng)的名稱使用下劃線
Python風(fēng)格教程的代碼布局
現(xiàn)在你已經(jīng)知道了如何在Python中命名實(shí)體,下一個(gè)問(wèn)題應(yīng)該是如何用Python構(gòu)造代碼!
老實(shí)說(shuō),這是非常重要的,因?yàn)槿绻麤](méi)有適當(dāng)?shù)慕Y(jié)構(gòu),你的代碼可能會(huì)出問(wèn)題,對(duì)任何評(píng)審人員來(lái)說(shuō)都是最大的障礙。
所以,不用再多費(fèi)吹灰之力,讓我們來(lái)了解一下Python中代碼布局的基礎(chǔ)知識(shí)吧!
縮進(jìn)
它是代碼布局中最重要的一個(gè)方面,在Python中起著至關(guān)重要的作用。縮進(jìn)告訴代碼塊中要包含哪些代碼行以供執(zhí)行。缺少縮進(jìn)可能是一個(gè)嚴(yán)重的錯(cuò)誤。
縮進(jìn)確定代碼語(yǔ)句屬于哪個(gè)代碼塊。想象一下,嘗試編寫(xiě)一個(gè)嵌套的for循環(huán)代碼。在各自的循環(huán)之外編寫(xiě)一行代碼可能不會(huì)給你帶來(lái)語(yǔ)法錯(cuò)誤,但你最終肯定會(huì)遇到一個(gè)邏輯錯(cuò)誤,這可能會(huì)在調(diào)試方面耗費(fèi)時(shí)間。
遵循下面提到的縮進(jìn)風(fēng)格,以獲得一致的Python腳本風(fēng)格。
始終遵循4空格縮進(jìn)規(guī)則
建議用空格代替制表符
建議用空格代替制表符。但是當(dāng)代碼已經(jīng)用制表符縮進(jìn)時(shí),可以使用制表符。
if?True:print('4?spaces?of?indentation?used!')將大型表達(dá)式拆分成幾行
處理這種情況有幾種方法。一種方法是將后續(xù)語(yǔ)句與起始分隔符對(duì)齊。
#?與起始分隔符對(duì)齊。 def?name_split(first_name,middle_name,last_name)#?另一個(gè)例子。 ans?=?solution(value_one,?value_two,value_three,?value_four)第二種方法是使用4個(gè)空格的縮進(jìn)規(guī)則。這將需要額外的縮進(jìn)級(jí)別來(lái)區(qū)分參數(shù)和塊內(nèi)其他代碼。
#?利用額外的縮進(jìn)。 def?name_split(first_name,middle_name,last_name):print(first_name,?middle_name,?last_name)最后,你甚至可以使用“懸掛縮進(jìn)”。懸掛縮進(jìn)在Python上下文中是指包含圓括號(hào)的行以開(kāi)括號(hào)結(jié)束的文本樣式,后面的行縮進(jìn),直到括號(hào)結(jié)束。
#?懸掛縮進(jìn) ans?=?solution(value_one,?value_two,value_three,?value_four)縮進(jìn)if語(yǔ)句可能是一個(gè)問(wèn)題
帶有多個(gè)條件的if語(yǔ)句自然包含4個(gè)空格。如你所見(jiàn),這可能是個(gè)問(wèn)題。隨后的行也將縮進(jìn),并且無(wú)法區(qū)分if語(yǔ)句和它執(zhí)行的代碼塊。現(xiàn)在,我們?cè)撛趺崔k?
好吧,我們有幾種方法可以繞過(guò)它:
#?這是個(gè)問(wèn)題。 if?(condition_one?andcondition_two):print(“Implement?this”)一種方法是使用額外的縮進(jìn)!
#?使用額外的縮進(jìn) if?(condition_one?andcondition_two):print(“Implement?this”)另一種方法是在if語(yǔ)句條件和代碼塊之間添加注釋,以區(qū)分這兩者:
#?添加注釋。 if?(condition_one?andcondition_two):#?此條件有效print(“Implement?this”)括號(hào)的閉合
假設(shè)你有一個(gè)很長(zhǎng)的字典。你將所有的鍵值對(duì)放在單獨(dú)的行中,但是你將右括號(hào)放在哪里?是在最后一行嗎?還是跟在最后一個(gè)鍵值對(duì)?如果放在最后一行,右括號(hào)位置的縮進(jìn)是多少?
也有幾種方法可以解決這個(gè)問(wèn)題。
一種方法是將右括號(hào)與前一行的第一個(gè)非空格字符對(duì)齊。
#? learning_path?=?{‘Step?1’?:?’Learn?programming’,‘Step?2’?:?‘Learn?machine?learning’,‘Step?3’?:?‘Crack?on?the?hackathons’}第二種方法是把它作為新行的第一個(gè)字符。
learning_path?=?{‘Step?1’?:?’Learn?programming’,‘Step?2’?:?‘Learn?machine?learning’,‘Step?3’?:?‘Crack?on?the?hackathons’ }在二元運(yùn)算符前換行
如果你試圖在一行中放入太多的運(yùn)算符和操作數(shù),這肯定會(huì)很麻煩。相反,為了更好的可讀性,把它分成幾行。
現(xiàn)在很明顯的問(wèn)題是——在操作符之前還是之后中斷?慣例是在操作符之前斷行。這有助于識(shí)別操作符和它所作用的操作數(shù)。
#?在操作符之前斷行 gdp?=?(consumption+?government_spending+?investment+?net_exports)使用空行
將代碼行聚在一起只會(huì)使讀者更難理解你的代碼。使代碼看起來(lái)更整潔、更美觀的一個(gè)好方法是在代碼中引入相應(yīng)數(shù)量的空行。
頂層函數(shù)和類應(yīng)該用兩個(gè)空行隔開(kāi)
類中的方法應(yīng)該用一個(gè)空格行分隔
盡量不要在具有相關(guān)邏輯和函數(shù)的代碼段之間包含空行
可以在函數(shù)中少用空行來(lái)分隔邏輯部分。這使得代碼更容易理解
行最大長(zhǎng)度
一行不超過(guò)79個(gè)字符
當(dāng)你用Python編寫(xiě)代碼時(shí),不能在一行中壓縮超過(guò)79個(gè)字符。這是限制,應(yīng)該是保持聲明簡(jiǎn)短的指導(dǎo)原則。
你可以將語(yǔ)句拆分為多行,并將它們轉(zhuǎn)換為較短的代碼行
導(dǎo)入包
許多數(shù)據(jù)科學(xué)家之所以喜歡使用Python,部分原因是因?yàn)橛刑嗟膸?kù)使得處理數(shù)據(jù)更加容易。因此,我們假設(shè)你最終將導(dǎo)入一堆庫(kù)和模塊來(lái)完成數(shù)據(jù)科學(xué)中的任何任務(wù)。
應(yīng)該始終位于Python腳本的頂部
應(yīng)在單獨(dú)的行上導(dǎo)入單獨(dú)的庫(kù)
導(dǎo)入應(yīng)按以下順序分組:
標(biāo)準(zhǔn)庫(kù)導(dǎo)入
相關(guān)第三方進(jìn)口
本地應(yīng)用程序/庫(kù)特定導(dǎo)入
在每組導(dǎo)入后包括一個(gè)空行
可以在一行中從同一模塊導(dǎo)入多個(gè)類
熟悉正確的Python注釋
理解一段未注釋的代碼可能是一項(xiàng)費(fèi)力的工作。即使是代碼的原始編寫(xiě)者,也很難記住一段時(shí)間后代碼行中到底發(fā)生了什么。
因此,最好及時(shí)對(duì)代碼進(jìn)行注釋,這樣讀者就可以正確地理解你試圖用這段代碼實(shí)現(xiàn)什么。
一般提示
注釋總是以大寫(xiě)字母開(kāi)頭
注釋?xiě)?yīng)該是完整的句子
更新代碼時(shí)更新注釋
避免寫(xiě)顯而易見(jiàn)之事的注釋
注釋的風(fēng)格
描述它們后面的代碼段
與代碼段有相同的縮進(jìn)
從一個(gè)空格開(kāi)始
內(nèi)聯(lián)注釋
這些注釋與代碼語(yǔ)句位于同一行
應(yīng)與代碼語(yǔ)句至少分隔兩個(gè)空格
以通常的#開(kāi)頭,然后是空格
不要用它們來(lái)陳述顯而易見(jiàn)的事情
盡量少用它們,因?yàn)樗鼈儠?huì)分散注意力
文檔字符串
用于描述公共模塊、類、函數(shù)和方法
也稱為“docstrings”
它們之所以能在其他注釋中脫穎而出,是因?yàn)樗鼈兪怯萌匾?hào)括起來(lái)的
如果docstring以單行結(jié)尾,則在同一行中包含結(jié)束符“””
如果docstring分為多行,請(qǐng)?jiān)谛滦兄屑由辖Y(jié)束符“””
Python代碼中的空格
在編寫(xiě)漂亮的代碼時(shí),空格常常被忽略為一個(gè)微不足道的方面。但是正確使用空格可以大大提高代碼的可讀性。它們有助于防止代碼語(yǔ)句和表達(dá)式過(guò)于擁擠。這不可避免地幫助讀者輕松地瀏覽代碼。
關(guān)鍵
避免將空格立即放在括號(hào)內(nèi)
不要在逗號(hào)、分號(hào)或冒號(hào)前加空格
字符和左括號(hào)之間不要包含空格
使用多個(gè)運(yùn)算符時(shí),只在優(yōu)先級(jí)最低的運(yùn)算符周圍包含空格
在分片中,冒號(hào)充當(dāng)二進(jìn)制運(yùn)算符
它們應(yīng)該被視為優(yōu)先級(jí)最低的運(yùn)算符。每個(gè)冒號(hào)周圍必須包含相等的空格
#?正確 df_valid?=?df_train[lower_bound+5?:?upper_bound-5]應(yīng)避免尾隨空格
函數(shù)參數(shù)默認(rèn)值不要在=號(hào)周圍有空格
請(qǐng)始終在以下二進(jìn)制運(yùn)算符的兩邊用單個(gè)空格括起來(lái):
賦值運(yùn)算符(=,+=,-=,等)
比較(=,<,>!=,<>,<=,>=,輸入,不在,是,不是)
布爾值(and,or,not)
Python的一般編程建議
通常,有很多方法來(lái)編寫(xiě)一段代碼。當(dāng)它們完成相同的任務(wù)時(shí),最好使用推薦的編寫(xiě)方法并保持一致性。我在這一節(jié)已經(jīng)介紹了其中的一些。
與“None”之類的進(jìn)行比較時(shí),請(qǐng)始終使用“is”或“is not”。不要使用相等運(yùn)算符
不要使用比較運(yùn)算符將布爾值與TRUE或FALSE進(jìn)行比較。雖然使用比較運(yùn)算符可能很直觀,但沒(méi)有必要使用它。只需編寫(xiě)布爾表達(dá)式
與其將lambda函數(shù)綁定到標(biāo)識(shí)符,不如使用泛型函數(shù)。因?yàn)閷ambda函數(shù)分配給標(biāo)識(shí)符違背了它的目的。回溯也會(huì)更容易
捕獲異常時(shí),請(qǐng)命名要捕獲的異常。不要只使用一個(gè)光禿禿的例外。這將確保當(dāng)你試圖中斷執(zhí)行時(shí),異常塊不會(huì)通過(guò)鍵盤(pán)中斷異常來(lái)掩蓋其他異常
與你的返回語(yǔ)句保持一致。也就是說(shuō),一個(gè)函數(shù)中的所有返回語(yǔ)句都應(yīng)該返回一個(gè)表達(dá)式,或者它們都不應(yīng)該返回表達(dá)式。另外,如果return語(yǔ)句不返回任何值,則返回None而不是什么都不返回
如果要檢查字符串中的前綴或后綴,請(qǐng)使用“.startswith()”和“.endswith()",而不是字符串切片。它們更干凈,更不容易出錯(cuò)
#?正確 if?name.endswith('and'):print('Great!')自動(dòng)格式化Python代碼
當(dāng)你編寫(xiě)小的程序時(shí),格式化不會(huì)成為一個(gè)問(wèn)題。但是想象一下,對(duì)于一個(gè)運(yùn)行成千行的復(fù)雜程序,必須遵循正確的格式規(guī)則!這絕對(duì)是一項(xiàng)艱巨的任務(wù)。而且,大多數(shù)時(shí)候,你甚至不記得所有的格式規(guī)則。
我們?nèi)绾谓鉀Q這個(gè)問(wèn)題呢?好吧,我們可以用一些自動(dòng)格式化程序來(lái)完成這項(xiàng)工作!
自動(dòng)格式化程序是一個(gè)程序,它可以識(shí)別格式錯(cuò)誤并將其修復(fù)到位。Black就是這樣一種自動(dòng)格式化程序,它可以自動(dòng)將Python代碼格式化為符合PEP8編碼風(fēng)格的代碼,從而減輕你的負(fù)擔(dān)。
BLACK:https://pypi.org/project/black/
通過(guò)在終端中鍵入以下命令,可以使用pip輕松安裝它:
pip?install?black但是讓我們看看black在現(xiàn)實(shí)世界中有多大的幫助。讓我們用它來(lái)格式化以下類型錯(cuò)誤的程序:
現(xiàn)在,我們要做的就是,前往終端并鍵入以下命令:
black?style_script.py完成后,black可能已經(jīng)完成了更改,你將收到以下消息:
一旦再次嘗試打開(kāi)程序,這些更改將反映在程序中:
正如你所看到的,它已經(jīng)正確地格式化了代碼,在你不小心違反格式化規(guī)則的情況下它會(huì)有幫助。
Black還可以與Atom、Sublime Text、visualstudio代碼,甚至Jupyter Notebook集成在一起!這無(wú)疑是一個(gè)你永遠(yuǎn)不會(huì)錯(cuò)過(guò)的插件。
除了black,還有其他的自動(dòng)格式化程序,如autoep8和yapf,你也可以嘗試一下!
結(jié)尾
我們已經(jīng)在Python風(fēng)格教程中討論了很多關(guān)鍵點(diǎn)。如果你在代碼中始終遵循這些原則,那么你將最終得到一個(gè)更干凈和可讀的代碼。
另外,當(dāng)你作為一個(gè)團(tuán)隊(duì)在一個(gè)項(xiàng)目中工作時(shí),遵循一個(gè)共同的標(biāo)準(zhǔn)是有益的。它使其他合作者更容易理解。開(kāi)始在Python代碼中加入這些風(fēng)格技巧吧!
原文鏈接:https://www.analyticsvidhya.com/blog/2020/07/python-style-guide/
?------------------------------------------------
看到這里,說(shuō)明你喜歡這篇文章,請(qǐng)點(diǎn)擊「在看」或順手「轉(zhuǎn)發(fā)」「點(diǎn)贊」。
往期精彩回顧適合初學(xué)者入門(mén)人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開(kāi):https://t.zsxq.com/662nyZF本站qq群1003271085。加入微信群請(qǐng)掃碼進(jìn)群:總結(jié)
以上是生活随笔為你收集整理的【Python基础】如何编写简洁美观的Python代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【算法基础】十大经典排序算法(动图)
- 下一篇: 【Python基础】Jupyter No