1、手動進行字串格式化
# 壞習慣
name = "Alice"
greeting = "Hello, " + name + "!"
# 好習慣
name = "Alice"
greeting = f"Hello, {name}!"
理由:使用+進行字串拼接會導致程式碼可讀性差,而且在複雜情況下容易出錯,f-string 可讀性更好
2、手動關閉檔案
# 壞習慣
file = open("example.txt", "r")
content = file.read()
file.close()
# 好習慣
with open("example.txt", "r") as file:
content = file.read()
理由:手動關閉檔案容易忘記,使用上下文管理器(with語句)會在程式碼執行完畢後自動關閉檔案,即使發生異常也會被正確處理,更加安全可靠
3、使用裸 except子句
# 壞習慣
try:
result = 10 / 0
except:
print("Error occurred")
# 好習慣
try:
result = 10 / 0
except ZeroDivisionError:
print("Error occurred")
理由:裸 except 會捕捉所有異常,包括系統退出訊號等。這可能會導致在處理異常時掩蓋真正的錯誤,使得排程變得更加困難。
4、預設引數使用可變物件
# 壞習慣
def add_item(item, items=[]):
items.append(item)
return items
# 好習慣
def add_item(item, items=None):
if items is None:
item = []
items.append(item)
return items
理由:預設引數在函式定義時被計算,而不是在每次函式呼叫時。這意味著如果預設引數是可變物件(如列表或字典),那麼它將在所有函式呼叫之間共享,導致意外的結果
5、不會使用推導式
# 壞習慣
squares = []
for i in range(5):
squares.append(i ** 2)
# 好習慣
squares = [i ** 2 for i in range(5)]
理由:推導式是一種簡潔,可讀性高的語法糖,可以減少程式碼行數,提高效率
6、使用 type(x) 檢查型別
# 壞習慣
value = 42
if type(value) is int:
print("It is an integer")
# 好習慣
value = 42
if isinstance(value, int):
print("It is an integer")
理由:type 不如 isintance 靈活,且無法處理繼承關係。
7、使用 ==判斷是否為 None, True 或 False
# 壞習慣
if x == None:
print("x is None")
# 好習慣
if x is None:
print("x is None")
理由:在Python中, None, True 或 False 是單例物件,使用 is 能確保比較的是物件的身份。另外,物件的 __eq__方法可以被過載,這就意味著 == 可能不總是按照我們的期望的方式進行比較。
8、使用 bool(...) 或 len(...) 進行條件檢查
# 壞習慣
my_list = [1, 2, 3]
if len(my_list) != 0:
print("List is not empty")
# 好習慣
my_list = [1, 2, 3]
if my_list:
print("List is not empty")
理由:在條件判斷時使用可讀性更高的表示式,不必顯式地檢查長度或真值。
9、使用 range(len(...)), 而不是 enumerate
# 壞習慣
my_list = ['apple', 'banana', 'orange']
for i in range(len(my_list)):
item = my_list[i]
print(i, item)
# 好習慣
my_list = ['apple', 'banana', 'orange']
for i, item in enumerate(my_list):
print(i, item)
理由:enumerate()提供了在迭代中同時獲取索引和值的優雅方式,比手動追蹤索引更好
10、不瞭解字典的 items 方法
# 壞習慣
my_dict = {'a': 1, 'b': 2, 'c':3}
for key in my_dict:
print(key, my_dict[key])
# 好習慣
my_dict = {'a': 1, 'b': 2, 'c':3}
for key, value in my_dict.items():
print(key, value)
理由:items() 提供了更直接的方式同時獲取鍵和值,避免了額外的字典查詢。
11、不使用元組解包
# 壞習慣
coordinates = (3, 5)
x = coordinates[0]
y = coordinates[1]
# 好習慣
coordinates = (3, 5)
x, y = coordinates
理由:元組解包能夠使程式碼更加簡潔,提高可讀性。
12、使用 time() 進行程式碼計時
# 壞習慣
start_time = time.time()
end_time = time.time()
# 好習慣
start_time = time.perf_counter()
end_time = time.perf_counter()
理由:perf_counter()提供了更高精度的計時,適用於測量小段程式碼的執行時間。time() 通常精度較低,可能不適合測量短時間間隔。
13、在生產環境使用 print 語句而不是日誌
# 壞習慣
result = calculate_result()
print("Result:", result)
# 好習慣
import logging
result = calculate_result()
logging.info("Result: %s", result)
理由:print 語句是排程的一種方式,但在生產環境中使用日誌更為合適,具備更多配置選項和級別
14、使用 import * 匯入模組
# 壞習慣
from module import *
# 好習慣
from module import specific_function_or_class
理由:匯入所有符號可能導致命名衝突,不利用程式碼維護。
15、不使用原始字串
# 壞習慣
regular_string = "C:\\Documnets\\file.txt"
# 好習慣
regular_string = r"C:\Document\file.txt"
理由:使用原始字串可以提高程式碼的可讀性,尤其是在處理路徑,正規表示式等需要反斜槓的情況下。原始字串告訴讀者不要解釋反斜槓為跳脫字元。
16、不遵循 PEP8 編碼規範
# 壞習慣
aVar=5
result=aVar+2
# 好習慣
a_var = 5
result = a_var + 2
理由:PEP8 提供了一致的程式碼風格,有助於提高程式碼的可讀性,可維護性,以及團隊協作。