iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
自我挑戰組

玩程式新手村 – C和Python系列 第 25

第25天 - C 和 Python的較量 (五)

  • 分享至 

  • xImage
  •  

前篇文章末尾有簡單介紹 Python 的例外處理 (Exception Handling),我沒有打算深入說明 Python 的 try, except, else 和 finally 語法,但要從「編碼風格」角度 來看待 C 和 Python 如何處理可能錯誤或異常情況。

編碼風格的對抗

學習新的知識時,從書本後面的術語表 (glossary),可以快速瀏覽這些重要詞彙,找出沒有學到或是有興趣的知識點。

在Python術語表內有談論到 EAFP 和 LBYL 的編碼風格。

  • C 語言的 LBYL (Look before you leap) 原則:
    • LBYL 可以翻譯成「事前審查比事後追究好」,而在Python術語表譯成「三思而後行」
    • LBYL 原則是在進行操作之前檢查可能出現的問題。LBYL 的想法是預先檢查可能的錯誤或異常條件,然後再執行操作。
  • Python 的 EAFP (Easier to ask for forgiveness than permission) 原則:
    • EAFP 可以翻譯成「寧願請求寬恕而不是許可」,而在Python術語表譯成「請求寬恕比請求許可更容易」。
    • EAFP 原則會假設所需的操作會成功進行,並嘗試執行它們,然後在必要時捕捉可能發生的例外情況。如果操作失敗碰到問題,再處理例外情況。

以下舉例來比較這兩原則:

  • C LBYL 編碼風格:

    #include <stdio.h>
    
    int main() {
        int num;
    
        printf("請輸入一個整數:");
        if (scanf("%d", &num) == 1) { // scanf函數返回值為 1,表示整數成功轉換
            if (num != 0) {
                float result = 100.0 / num;
                printf("結果:%f\n", result);
            } else {
                printf("不能除以零\n");
            }
        } else {
            printf("無效的輸入\n");
        }
        return 0;
    }
    
  • Python EAFP 編碼風格:

    try:
        num = int(input("請輸入一個整數:"))
        result = 100 / num
    except (ValueError, ZeroDivisionError):
        print("無效的輸入或不能除以零")
    else:
        print(f"結果: {result}")
    
  • Python EAFP 原則是我喜歡的簡潔且快速的風格,因為它專注於「正常情況」。

    但如果改成 LBYL 原則,就可以看到許多if 條件語句在 Python 程式碼內:

    # 改用LBYL原則
    input_str = input("請輸入一個整數:")
    if input_str.isdigit():
        num = int(input_str)
        if num != 0:
            result = 10 / num
            print("結果:", result)
        else:
            print("不能除以零")
    else:
        print("無效的輸入")
    

編碼風格的結論:

  • 因為 C 語言缺少內建的例外處理機制,只用返回值 (exit code) 來處理 (或管理) 錯誤,所以 C 程式碼常用 LBYL 編碼風格。
  • Python 使用 try-except 機制來處理錯誤或例外情況,使得 Python程式碼 通常傾向於 EAFP 編碼風格。

Python術語表的傳送門

🌐 術語表 — Python 說明文件


上一篇
第24天 - C 和 Python的較量 (四)
下一篇
第26天 - C 和 Python函式的對抗 (一)
系列文
玩程式新手村 – C和Python30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言