2024年9月14日 星期六

The Zen of Python 更多的核心理念

前一篇文章: Python 之禪,import this是有趣的彩蛋

以下程式也是由ChatGPT產生。

範例一、Flat is better than nested. (平坦勝於嵌套)

當代碼的邏輯結構過於嵌套時,代碼變得難以閱讀和維護,應盡量保持平坦的結構:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 不好的嵌套
def process(data):
    if data is not None:
        if isinstance(data, list):
            if len(data) > 0:
                return data[0]
    return None

# 改進版
def process(data):
    if data is None or not isinstance(data, list) or len(data) == 0:
        return None
    return data[0]

這樣使邏輯更簡單、清晰,減少了不必要的嵌套。

範例二、Sparse is better than dense. (稀疏勝於密集)
代碼不應該過於緊湊,應使用適當的空白和換行來提高可讀性:

1
2
3
4
5
6
# 過於緊湊的代碼
def add(x):return x+1

# 改進版
def add(x):
    return x + 1

在改進版中,分行和空白使得代碼更具可讀性。

範例三、In the face of ambiguity, refuse the temptation to guess. (面對模糊性,拒絕猜測的誘惑)
當邏輯不明確時,應該避免猜測,並明確地處理所有可能的情況:

1
2
3
4
5
6
7
8
9
# 不好的做法:猜測邏輯
def divide(a, b):
    return a / b  # 這會導致在 b 為 0 時拋出錯誤

# 改進版:處理所有情況
def divide(a, b):
    if b == 0:
        return "Division by zero is not allowed."
    return a / b

這樣可以避免不明確的行為,並處理潛在的錯誤情況。

範例四、 There should be one-- and preferably only one --obvious way to do it. (應該有一種——最好只有一種——明顯的方法來做事)
代碼應該具有唯一明顯的解決方案,而不是多種實現方式。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 壞例子:有多種方式來訪問字典的鍵
my_dict = {'a': 1, 'b': 2, 'c': 3}

# 方法1
if my_dict.has_key('a'):
    print(my_dict['a'])

# 方法2
if 'a' in my_dict:
    print(my_dict['a'])

# 好例子:統一使用推薦方式
if 'a' in my_dict:
    print(my_dict['a'])

Python 的設計哲學強調應該有一種最合適的方法來完成任務,以保持一致性和可讀性。

範例五、Now is better than never. (現在勝於永不)
在某些情況下,延遲過多反而無益,應儘早解決問題。例如:

1
2
3
4
5
6
7
# 永不實現的壞例子
def feature():
    pass  # 這個功能永遠不會被實現

# 好例子:即使是簡單的功能,也應該儘早實現
def feature():
    print("This is a placeholder function. To be implemented.")

即使功能還未完善,讓它以某種形式存在,可能比等待更好。

範例六、Namespaces are one honking great idea -- let's do more of those! (命名空間是一個非常棒的主意——讓我們多使用它們吧!)
使用命名空間可以避免命名衝突,讓代碼更加結構化、組織化。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 沒有使用命名空間,容易發生命名衝突
x = 10

def func():
    x = 20
    return x

# 使用命名空間
import math

x = 10

def calculate_area(radius):
    return math.pi * radius ** 2

在這裡,我們使用了 math 命名空間來調用 pi,而不是定義自己的常數,這有助於減少命名衝突並保持代碼乾淨。

沒有留言:

張貼留言