Python程式設計的16個壞習慣

业余砖家發表於2024-07-31

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 提供了一致的程式碼風格,有助於提高程式碼的可讀性,可維護性,以及團隊協作。

相關文章