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,而不是定義自己的常數,這有助於減少命名衝突並保持代碼乾淨。

Python 之禪,import this是有趣的彩蛋

 

在Python IDLE的交談視窗中,可以輸入import this,您將獲得一顆有趣的彩蛋。我們試著用ChatGPT把下面文字,翻譯成中文。
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

使用ChatGPT英譯中,獲得下列文章。

Python之禪,作者:Tim Peters

美麗勝於醜陋。
明確勝於隱晦。
簡單勝於複雜。
複雜勝於繁瑣。
平坦勝於嵌套。
稀疏勝於密集。
可讀性很重要。
特例不足以打破規則。
雖然實用性勝於純粹性。
錯誤絕不應該默默無聲地通過。
除非明確地靜音。
面對模糊性,拒絕猜測的誘惑。
應該有一種——最好只有一種——明顯的方法來做事。
雖然這種方法一開始可能不明顯,除非你是荷蘭人。
現在勝於永不。
雖然永不往往比立刻好。
如果實現很難解釋,那就是個壞主意。
如果實現容易解釋,可能是個好主意。
命名空間是一個非常棒的主意——讓我們多使用它們吧!

我們再用ChaptGPT幫我們舉例。

範例一、Beautiful is better than ugly. (美麗勝於醜陋)
代碼應該清晰、美觀,結構合理。例如,選擇具描述性的變量名勝過短而不明確的名稱:

1
2
3
4
5
# 醜陋
x = 100

# 美麗
number_of_apples = 100

範例二、Explicit is better than implicit. (明確勝於隱晦)
寫代碼時應該避免隱晦的行為,讓代碼的意圖清晰可見。例如,選擇顯式地轉換類型,而不是隱式的:

1
2
3
4
5
6
7
# 隱晦
x = "42"
y = x + 1  # 這會拋出錯誤

# 明確
x = "42"
y = int(x) + 1  # 顯式地轉換類型

範例三、Simple is better than complex. (簡單勝於複雜)
代碼應保持簡單,不應為了「炫技」而引入不必要的複雜性。例如,使用簡單的 for-loop 而不是嵌套和過度複雜的邏輯:

1
2
3
4
5
6
7
8
# 複雜
result = [x**2 for x in range(10) if x % 2 == 0]

# 簡單
result = []
for x in range(10):
    if x % 2 == 0:
        result.append(x**2)


範例四、Readability counts. (可讀性很重要)
代碼可讀性極為重要,這是維護性和協作開發中的關鍵。例如,適當地縮進、添加註釋讓代碼更具可讀性:

1
2
3
4
5
6
7
# 難以閱讀
def f(x):return x**2+1

# 易於閱讀
def square_plus_one(x):
    """返回數字 x 的平方加 1"""
    return x**2 + 1

範例五、Errors should never pass silently. (錯誤絕不應該默默無聲地通過)
當出現錯誤時,應該明確處理或顯示,而不是忽略。例如,使用 try...except 來捕捉並處理異常:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 錯誤被靜默忽略
try:
    result = 1 / 0
except:
    pass  # 沒有任何反應

# 明確處理錯誤
try:
    result = 1 / 0
except ZeroDivisionError:
    print("不能除以零")

範例六、If the implementation is hard to explain, it's a bad idea. (如果實現很難解釋,那就是個壞主意)
如果代碼實現非常複雜且難以解釋,應考慮重新設計。代碼應該易於理解:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 難以理解
def foo(lst):
    return {x:lst.count(x) for x in lst}

# 易於理解
def count_occurrences(lst):
    """計算列表中每個元素的出現次數"""
    occurrences = {}
    for item in lst:
        if item in occurrences:
            occurrences[item] += 1
        else:
            occurrences[item] = 1
    return occurrences

以上這些例子展示了 The Zen of Python 的核心理念,即保持代碼簡單、明確、可讀,並避免不必要的複雜性。

2024年9月13日 星期五

Python一下雲林的農業發展

資料來源:農情報告資源網

1.Python IDE程式下載:https://www.python.org/downloads/,進行安裝。
2.打開Python IDLE程式,在File/New File選單,即可以開始編輯程式。

範例一、輸出指令,print(),把括號內的字串印出來,字串可以放在兩個單引號或兩個雙引號中間。
print("依照農情報告資源網的統計資料顯示雲林縣在梗稻、雜糧和蔬菜的種植面積高居全國第一。")

執行結果:
依照農情報告資源網的統計資料顯示雲林縣在梗稻、雜糧和蔬菜的種植面積高居全國第一。

範例二、變數,指一個符號可以用來儲存資料,可以是字串,也可以是數字。下例的str即為子串的變數。
str="依照農情報告資源網的統計資料顯示雲林縣在梗稻、雜糧和蔬菜的種植面積高居全國第一。"
print(str)

執行結果:
依照農情報告資源網的統計資料顯示雲林縣在梗稻、雜糧和蔬菜的種植面積高居全國第一。

範例三、使用%格式
str1="依照農情報告資源網的統計資料顯示%s在梗稻、雜糧和蔬菜的種植面積高居全國第一。"
str2="雲林縣"
print(str1 % str2)

執行結果:
依照農情報告資源網的統計資料顯示雲林縣在梗稻、雜糧和蔬菜的種植面積高居全國第一。

範例四、使用fromat格式
str1="依照農情報告資源網的統計資料顯示%s在{}、雜糧和蔬菜的種植面積高居全國第一。"
str2="雲林縣"
str3="梗稻"
print(str1.format(str3) % str2)

執行結果:
依照農情報告資源網的統計資料顯示雲林縣在梗稻、雜糧和蔬菜的種植面積高居全國第一。

範例五、使用名稱來指定變數就可以變換順序
str1="依照農情報告資源網的統計資料顯示%s在{A}、{B}和{C}的種植面積高居全國第一。"
str2="雲林縣"
雜糧="雜糧"
梗稻="梗稻"
蔬菜="蔬菜"
print(str1.format(A=梗稻, B=雜糧, C=蔬菜) % str2)

執行結果:
依照農情報告資源網的統計資料顯示雲林縣在梗稻、雜糧和蔬菜的種植面積高居全國第一。

範例六、格式化字串本文
str1=f"依照農情報告資源網的統計資料顯示%s在{A}、{B}和{C}的種植面積高居全國第一。"
str2="雲林縣"
B="雜糧"
A="梗稻"
C="蔬菜"
print(str1 % str2)

執行結果:
Traceback (most recent call last):
  File "C:/Users/cheng-min/AppData/Local/Programs/Python/Python311/test.py", line 1, in <module>
    str1=f"依照農情報告資源網的統計資料顯示%s在{A}、{B}和{C}的種植面積高居全國第一。"
NameError: name 'A' is not defined

範例七、格式化字串本文
B="雜糧"
A="梗稻"
C="蔬菜"
str1=f"依照農情報告資源網的統計資料顯示%s在{A}、{B}和{C}的種植面積高居全國第一。"
str2="雲林縣"
print(str1 % str2)

執行結果:
依照農情報告資源網的統計資料顯示雲林縣在梗稻、雜糧和蔬菜的種植面積高居全國第一。

範例八、百分比
year="112"
A="落花生"
B=17153.57
C=12445.34
D=C/B
str=f"依照農情報告資源網{year}年統計資料顯示全國{A}種植面積為{B}公頃其中雲林縣為{C}佔全國的{D:2.2%}。"
print(str)

執行結果:
依照農情報告資源網112年統計資料顯示全國落花生種植面積為17153.57公頃其中雲林縣為12445.34佔全國的72.55%。