Python程式碼不只是寫給自己看的,如何提高程式碼的可讀性?
程式設計師寫程式碼,每一個語言都有每一個語言的特性
當然對於每一種語言都有語言的格式規範,也可以說是程式設計師的一種潛規則吧~
那麼小編今天帶大家看看Python程式碼應該怎麼寫,才能寫出好看的程式碼~
1.Python有兩種內建或使用者定義的型別
可變型別是允許就地修改內容的型別。典型的可變列表是列表和詞典:所有列表都有變異方法,如 list.append()或list.pop(),並且可以在適當的位置進行修改。詞典也是如此。
不可變型別不提供改變其內容的方法。例如,設定為整數6的變數x沒有“增量”方法。如果要計算x + 1,則必須建立另一個整數併為其指定名稱。
體會一下這Best這招,選擇是使用map函式,它可以將內建函式型別str對映到迭代器range。這會生成一個map物件,然後就可以像其他示例一樣join。在某些情況下,map函式甚至可能比列表理解更快,更簡潔!
2.一個語句只寫一行
每一行一個語句,尤其在複雜的邏輯表示式的時候,這樣會清晰很容易閱讀。
雖然列表推導等一些複合語句因其簡潔性和表達性而被允許和讚賞,但在同一行程式碼上有兩個脫節語句是不好的做法
3.保持語言的簡潔性
Python因為技巧性非常高,有的時候濫用一些黑魔法,過度的使用技巧而反而失去了程式碼本身的直觀性。
字典的更新有幾種方法,dict(**locals)本意是想生成一個新的字典返回。在上面的好程式碼中,顯式地從呼叫者接收x和y,並返回顯式字典
4.關於返回值的處理
當函式的複雜性增加時,在函式體內使用多個return語句並不罕見。但是,為了保持清晰的意圖和可持續的可讀性水平,最好避免從體內的許多輸出點返回有意義的值。
在函式中返回值有兩種主要情況:函式在正常處理時返回的結果,以及指示錯誤輸入引數的錯誤情況或函式無法完成其計算的任何其他原因或任務
def complex_function(a, b, c):
if not a:
return None # Raising an exception might be better
if not b:
return None # Raising an exception might be better
# Some complex code trying to compute x from a, b and c
# Resist temptation to return x if succeeded
if not x:
# Some Plan-B computation of x
return x # One single exit point for the returned value x will help
# when maintaining the code.
當一個函式在其正常過程中有多個主要出口時,除錯返回的結果變得很困難,因此最好保留一個退出點。這也將有助於分解一些程式碼路徑,如果函式有多個出口點,說明你的程式碼要進一步的重構。
5.解壓縮
如果知道列表或元組的長度,則可以通過解壓縮為其元素指定名稱。比如enumerate()將為列表中的每個項提供兩個元素的元組,一個下標一個值:
for index, item in enumerate(some_list):
# do something with index and item
也可以使用它來交換變數:
a, b = b, a
巢狀解包也適用Py3.x:
a, (b, c) = 1, (2, 3)
a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4
6.搜尋集合中的專案
有時我們需要搜尋一系列的東西。讓我們看看兩個選項:列表和集合。
以下面的程式碼為例:
s = set(['s', 'p', 'a', 'm'])
l = ['s', 'p', 'a', 'm']
def lookup_set(s):
return 's' in s
def lookup_list(l):
return 's' in l
即使兩個函式看起來都相同,因為lookup_set利用了Python中的集合是雜湊表的事實,兩者之間的查詢效能是非常不同的。
要確定專案是否在列表中,Python必須遍歷每個專案,直到找到匹配的專案。
這很費時,特別是對於長列表。另一方面,在集合中專案的雜湊將告訴Python在集合中的哪個位置尋找匹配專案。因此,即使集合很大,也可以快速完成搜尋。
7.檢查變數是否等於常數
您不需要顯式地將值與True或None或空進行比較 - 您只需將其新增到if語句即可。
8.訪問字典元素
不要使用該dict.has_key()方法。相反使用語法或傳遞預設引數 比如x in dict ,dict.get(k,default_value)
9.過濾列表
好的做法是使用filter函式,從Python 3.0開始,該filter()函式返回迭代器而不是列表。如果你真的需要一個列表,前面加一個list()即可!
10.Read From a File
使用語法從檔案中讀取,這將自動為您關閉檔案,一定要用with open
11.程式碼長度的持續
當我們的邏輯程式碼行長於可接受的限制時(PEP8規定是79個字元),需要將其拆分為多個物理行。
如果行的最後一個字元是反斜槓,Python直譯器將連線連續的行。這在某些情況下很有用,但通常應該避免因為它的脆弱性。
在反斜槓之後新增到行尾的空格會破壞程式碼並可能產生意外結果。
Bad:
my_very_big_string = """For a long time I used to go to bed early. Sometimes, \
when I had put out my candle, my eyes would close so quickly that I had not even \
time to say “I’m going to sleep.”"""
from some.deep.module.inside.a.module import a_nice_function, another_nice_function, \
yet_another_nice_function
Good:
my_very_big_string = (
"For a long time I used to go to bed early. Sometimes, "
"when I had put out my candle, my eyes would close so quickly "
"that I had not even time to say “I’m going to sleep.”"
)
from some.deep.module.inside.a.module import (
a_nice_function, another_nice_function, yet_another_nice_function)
更好的做法是在元素周圍使用括號。在行尾留下一個未閉合的括號,Python直譯器將加入下一行,直到括號被關閉。對於大括號和方括號,同樣的行為也適用。
文章就到這裡啦!
歡迎持續關注小編哦~
文章持續推送