您好,登錄后才能下訂單哦!
本篇內容主要講解“用Python進行編碼的技巧有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“用Python進行編碼的技巧有哪些”吧!
1. 可讀性的重要性
程序必須為了人們能夠讀懂而編寫,其次使機器能夠執行。
首先,遵循編程規范,使程序易于閱讀。編程規范是經驗豐富的程序員在編寫其代碼時所遵循的。除忽略這些規范外,沒有任何其他方式可以更快地證明您是位“新手”。其中一些規范特定于Python;其他則可由計算機程序員用于所有語言中。
從本質上講,可讀性一種特征,決定著他人理解您代碼某些部分的難易程度(而并非您本人!)。
舉例來說,我曾經不習慣用垂直對齊方式來編寫代碼,也不習慣用起始分隔符對齊函數參數。
# No, to avoid: func = long_function_name(var_one, var_two, var_three, var_four)#Yes, func = long_function_name(var_one, var_two, var_three, var_four)
查看Python代碼樣式指南(https://www.python.org/dev/peps/pep-0008/)中的其他示例,并確定哪個示例看起來最佳。
我們經常做的另一件重要事情是效仿曾看過或寫過的程序,這也是為何接觸可讀性強的程序對于編程學習十分重要的原因。
2. 避免無用條件
通常,一串if & elif & …. & else長條件是代碼需要重構的標志。這些條件使您的代碼冗長,且十分難于解釋。有時這些代碼可以被很容易地替換,例如,我曾經常這樣做過:
def f(): if condition: return True else: return False
這真是愚蠢!該函數返回一個布爾值,那么為什么還要首先使用if塊呢?正確的做法是:
def f(): return condition
在一項Hackerrank挑戰中,參賽者需要編寫一個函數來確定給定的年份是否為閏年。在公歷中,須考慮三個標準來確定閏年:
該年份可被4整除,為閏年,除非:
該年份同樣可被100整除,不是閏年,除非:
該年份也可被400整除。為閏年
在這項挑戰中,不要考慮ifs和elses條件,僅做如下即可:
def is_leap(year): return year % 4 == 0 and (year % 400 == 0 or year % 100 != 0)
3. 適當使用空白
切勿混淆鍵盤制表定位鍵與空格鍵
函數間進行一次換行
等級間進行兩次換行
在程序庫、列表、元組、自變量列表中的自變量的“,”后輸入空格,以及在程序庫的“:”后輸入空格。
在分配和比較前后放置空格(列表中的自變量除外)
括號前后或參數列表前無空格
def function(key, value=0): """Return a dictionary and a list...""" d = {key: value} l = [key, value] return d, l
4. 文檔字符串和注釋
文檔字符串= 如何使用代
注釋=為何代碼能(合理)執行和如何執行
文檔字符串解釋了如何使用代碼:
解釋函數用途,即使對您而言,這個用途十分明顯。但以后,其用途對他人來說,不一定同樣明顯。
描述期望參數、返回值及例外情況。
如果該類函數與單個Caller緊密耦合,請提及調用函數。
這些注釋向代碼維護人員說明維護需求。下面的示例也包括給自己的注釋,如:
# !!! BUG: …
# !!! FIX: This is a hack
# ??? Why is this here?
編寫良好的文檔字符串和注釋是您的責任,因此請始終使它們保持最新!在進行更改時,請確保注釋和文檔字符串與代碼一致。
您將在“文檔字符串慣例”
(https://www.python.org/dev/peps/pep-0257/)中找到專門用于文檔字符串的詳細PEP
5. 變量和分配
在其他編程語言中:
c = a a = b b = c
在Python中,最好將分配項放入一個代碼行中:
b, aa = a, b
您可能已經看到代碼,但您知道它如何執行嗎?
逗號是構造元組的句法。
在右側創建一個元組(元組包)。
元組是左側的目標(元組拆包)。
其他示例:
result = '' for s in colors: result += s
在結構化數據循環中很有用(已保留上述變量名):
result = ' '.join(colors)
也可以采取相反的方式,只需確保左右具有相同的結構即可:
>>> jan, (gname, gtitle, gphone) = people >>> gname 'German' >>> gtitle 'GBT' >>> gphone 'unlisted' >>> jan ['Jan', 'Gomez', '+1-888-222-1546']
6. 列表拼接&合并
首先從字符串列表開始:
colors = ['red', 'blue', 'green', 'yellow']
我們想將這些字符串連接在一起以創建一條長鏈。特別是當子字符串的數量很大時,請避免這樣做:
result = '' for s in colors: result += s
這樣做非常慢。且占用大量內存和性能。總和將累加、存儲、然后繼續進行每個中間步驟。
取而代之,執行以下操作:
colors = ['red', 'blue', 'green', 'yellow'] print ('Choose', ', '.join(colors[:-1]), \ 'or', colors[-1])>> Choose red, blue, green or yellow
join()函數可一次完成整個副本。當僅處理幾個字符串時,它與其他函數沒有什么區別。卻能使您養成使用最佳函數構建長鏈的習慣,因為面對成百上千的字符串,使用join()函數的確大有不同。
下面是使用join()函數的一些技巧。如果想使用空格作為分隔符:
# Do this : # And not this : if x: if x == True: pass pass# Do this : # And not this : if items: if len(items) != 0: pass pass# and especially not that : if items != []: pass
或逗號和空格:
result = ', '.join(colors)
為了使句子語法正確,除最后一個值之外的每個值之間都使用逗號(人們更喜歡使用“或”)。拆分列表的語法將完成其余工作。[:-1]返回除最后一個值外的所有內容,我們可以將其與逗號連接。
colors = ['red', 'blue', 'green', 'yellow'] print ('Choose', ', '.join(colors[:-1]), \ 'or', colors[-1])>> Choose red, blue, green or yellow
7. 測試真實條件
就布爾值而言,利用Python既簡潔又快速:
# Do this : # And not this : if x: if x == True: pass pass# Do this : # And not this : if items: if len(items) != 0: pass pass# and especially not that : if items != []: pass
8. 盡可能使用枚舉函數
枚舉函數獲取一個列表并返回數對(指數,數項):
items = ['zero', 'one', 'two', 'three'] >>> print list(enumerate(items)) [(0, 'zero'), (1, 'one'), (2, 'two'), (3, 'three')]
使用列表顯示結果是必要的,因為枚舉函數是一種惰性函數,僅在要求時才一次生成一個數項(一對)。for循環需要這種機制。一次Print函數不會得到任何結果,但必須擁有要顯示的完整消息。因此,在使用Print函數之前,我們應自動將生成器轉換為列表。
因此,使用下面的循環效果更佳:
>>> [(x, y) for x in (1, 2, 3, 4) if x % 2 == 0 for y in ['a', 'b'] if y == 'b'] [(2, 'b'), (4, 'b')]
使用枚舉函數的版本比其他兩個版本更短,更簡單。以上為表明枚舉函數返回迭代器的示例(生成器是迭代器的一種)。
9. 列表推導式
使用for和if的傳統方式:
讓我們對小于100的數字平方求和: # With a loop : total = 0 for num in range(1, 101): total += num * num
使用列表推導式:
new_list = [fn(item) for item in a_list if condition(item)]
列表推導式清晰直接。在同一個列表推導式中,可以包含幾個for循環和if條件,但如果超過兩個或三個,或條件十分復雜,我建議您使用普通的for循環。
例如,從0至9的二次冪列表:
>>> [n ** 2 for n in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
上個列表中的奇數列表:
>>> [n ** 2 for n in range(10) if n % 2] [1, 9, 25, 49, 81]
更多示例:
>>> [(x, y) for x in (1, 2, 3, 4) if x % 2 == 0 for y in ['a', 'b'] if y == 'b'] [(2, 'b'), (4, 'b')]
10. 生成器表達式
讓我們對小于100的數字平方求和:
讓我們對小于100的數字平方求和: # With a loop : total = 0 for num in range(1, 101): total += num * num
還可以使用sum函數,通過建立正確的序列來為我們更快地完成工作。
# With a list comprehension : total = sum([num * num for num in range(1, 101)])# With a generator expression : total = sum(num * num for num in xrange(1, 101))
生成器表達式類似于列表推導式,只是在計算時屬于懶惰型。列表推導式一次計算整個結果,然后將其存儲在列表中。必要時,生成器表達式一次計算一個值。當序列很長并且生成的列表只是中間步驟而不是最終結果時,生成器表達式特別有用。
例如,如果我們必須對數十億個整數的平方求和,使用列表推導會達到內存的飽和,但使用生成器表達式不會有任何問題。盡管這需要一段時間!
total = sum(num * num for num in range(1, 1000000000))
二者在語法上的差異是列表推導式帶有方括號,而生成器表達式則沒有。生成器表達式有時需要括號,因此您應始終使用它們。
簡而言之:
當期望結果為列表時使用列表推導式。
當列表僅為中間結果時使用生成器表達式。
到此,相信大家對“用Python進行編碼的技巧有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。