编写python高质量python代码的59个有效方法
第1條:確認自己的python版本
第2條:遵循PEP8的風格
1.空格
- 對于 占據多行的長表達式來說, 除了首行之外的其余各行都應該在通常的縮進級別上再加4個空格。
- 每行字符數不應該超過79。
2.命名
- 受保護的實例屬性命名, 應該以單個下劃線開頭, 例如:_leading_underscore。
- 私有屬性的命名, 應該以雙下劃線開頭,例如: __leading_underscore。
- 模塊級別的常量,應該全部采用大寫字母來拼寫,各單詞之間以下劃線相連,例如:ALL_CAPS。
3.表達式和語句
- 采用內聯形式的否定詞,而不是要把否定詞放在整個表達式的前面,例如,應該寫if a is not b 而不是 if not a is b。
- 不要通過檢測長度的辦法(如 if len(somelist) == 0) 來判斷 somelist 是否為 [] 或 " 等空值, 而是應該采用 if not somelist 這種寫法來判斷, 它會假定:空值將自動評估為False。
- 檢測 somelist 是否為[1]或’hi’等非空值時,也應該如此,if somelist 語句默認會把非空的值判斷為True。
- 不要編寫單行的 if 語句、for 循環、while 循環及 except 復合語句,而是應該把這些語句分成多行來書寫,以示清晰。
- import 語句應該總是放在文件開頭。
- 引入模塊的時候,總是應該使用絕對名稱,而不應該根據當前模塊的路徑來使用相對名稱。例如,引入bar包中的foo模塊時,應該完整地寫出from bar import foo,而不應該簡寫為import foo。
- 如果一定要以相對名稱來編寫import語句,那就采用明確的寫法:from.import foo。
- 文件中那些import語句應該按順序劃分為三個部分,分別表示標準庫模塊、第三方模塊以及自用模塊。在每一部分之中,各import語句應該按模塊的字母順序來排列
第3條:了解bytes、str與unicode的區別
1.python3中解碼和轉碼方法的使用:
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # bytes解碼為str def to_str(bytes_to_str):if isinstance(bytes_to_str, bytes):value = bytes_to_str.decode('utf-8')else:value = bytes_to_strreturn value# str轉碼為bytes def to_bytes(str_to_bytes):if isinstance(str_to_bytes, str):value = str_to_bytes.encode()else:value = str_to_bytesreturn valueprint(to_str(b'/34ea/2323/udfe')) print(to_bytes('dkfjdkj'))2.從二進制讀取或寫入二進制文件時,應該總是以’rb’或者’wb’的方式來操作文件
第4條:用輔助函數來取代復雜的表達式(用if/else最簡寫的方式來取代or和and等)
第5條: 切片的操作細節
不要寫多余的代碼,當start的索引為0時,end的索引為序列的長度時,可以將其省略
start和end的索引可以越界, 例如:列表a長度為10 a[:20] , a[-20:]照樣會運行得到所需要的值
賦值表達式的左邊是一個列表的拷貝,而右邊是一個新列表時,則新列表將會覆蓋拷貝的列表。例如:a[:] = [101, 23, 34]
第6條: 在單次切片操作內,不要同時指定start、end和stride
1.盡量少使用start、end和stride共同存在的切片
2.如果非要使用,則start和end為空,stride為整數。盡量避免用負數做stride
3.根據上面兩點,如果完成比較復雜的切片,可以先做步進切割,然后范圍切割,或者先做范圍切割,然后進步切割。
4.根據第三點,如果要求不影響程序速度,使用內置itertools模塊中的islice
第7條: 用推導式代替map和filter函數
第8條: 不要使用有含有兩個以上表達式的列表推導
超過兩個表達式的列表推導是很難理解的,應該盡量避免
第9條: 用生成器表達式來改寫數據量較大的列表推導
1.當輸入的數據量較大時,列表推導可能會因為占用太多內存而出現問題
2.由生成器表達式所返回的迭代器,可以逐次產生輸出值,從而避免了內存用量問題
3.把某個生成器表達式所返回的迭代器,放在另一個生成器表達式的for子表達式中,即可將二者組合起來
4.串在一起的生成器表達式執行速度很快
# 列表推導 length = [len(x) for x in open('C:\\Users\\凌汪洪\\Desktop\\sql.txt', 'r')] print(length)# 當數據很多的時候,用生成器表達式 length = (len(x) for x in open('C:\\Users\\凌汪洪\\Desktop\\sql.txt', 'r')) print(list(length))第10條: 盡量用enumerate取代range
enumerate函數提供了一種精簡的寫法,可以在遍歷迭代器時獲知每個元素的索引
可以給enumerate提供第二個參數,以指定開始計數時使用的值(默認為0)
第11條: 用zip函數同時遍歷兩個迭代器
內置的zip函數可以平行地遍歷多個迭代器
如果提供的迭代器長度不等,那個zip就會自動提前終止
itertools內置模塊中的zip_longest函數可以平行地遍歷多個迭代器,而不用在乎他們的長度是否相等
第12條: 不要在for和while循環后面寫else塊
因為這種寫法既不直觀,又容易引人誤解
第13條: 合理利用try/except/else/finally結構中的每個代碼塊
無論try塊中的代碼是否異常,都可以利用try/finally復合語句中的finally來做清理操作
else塊可以用來縮減try塊中代碼量,并把沒有發生異常時所要執行的語句與try/except代碼塊隔開
第14條: 盡量用異常來表示特殊情況,而不要返回None
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def divice(a, b):try:return a / bexcept ZeroDivisionError as e:raise ValueError('輸入了無意義的數字') from ex, y = 12, 0 try:result = divice(x, y) except ValueError:print("輸入了無意義的數字") else:print('result: %d' % result)第15條: 了解如何在閉包里使用外圍作用域中的變量
除了那種比較簡單的函數,盡量不用nonlocal(而是封裝成一個類)
def sort_priority(values, group):found = Falsedef helper(x):if x in group:nonlocal foundfound = Truereturn (0, x)return (1, x)# 這里是根據元組的大小進行比較的values.sort(key=helper)return foundnumbers = [8, 3, 1, 2, 5, 4, 7, 6] group = {2, 3, 5, 7} sort_priority(numbers, group) print(numbers) ''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # 盡量不用nonlocalnumbers = [8, 3, 1, 2, 5, 4, 7, 6] group = {2, 3, 5, 7} class SortPriority:def __init__(self, group):self.group = groupself.found = Falsedef __call__(self, x):if x in group:self.found = Truereturn (0, x)return (1, x)sort_priority = SortPriority(group) numbers.sort(key=sort_priority) print(numbers)第16條: 考慮用生成器來改寫直接返回列表的函數
# 普通函數的用法 def index_text(text):result = []if text:result.append(0)for index, letter in enumerate(text):if letter == ' ':result.append(index + 1)return resulttext = 'Four years old' index = index_text(text) print(index)# 普通函數轉換為生成器函數 def index_text(text):if text:yield 0for index, letter in enumerate(text):if letter == ' ':yield index + 1text = 'Four years old' index = list(index_text(text)) print(index)總結
以上是生活随笔為你收集整理的编写python高质量python代码的59个有效方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python标准库 数学与随机数 (m
- 下一篇: Python的几种主动结束程序方式