2026年8月30日 星期日

智慧養殖設備異常判斷——if、elif、巢狀判斷與in

Python一下|第5篇

智慧養殖設備異常判斷——if、elif、巢狀判斷與in

《從風土資料到智慧生活的程式設計》——讓Python根據資料選擇行動,也保留人的專業判斷。

本篇學習目標
  • 理解條件判斷與布林值的關係。
  • 撰寫單向、雙向及多向選擇結構。
  • 使用巢狀判斷處理資料品質與設備狀態。
  • 搭配andornotin組合條件。
  • 完成具備「資料檢查→設備檢查→數值判讀」層次的智慧養殖示範程式。

一、程式如何做選擇?

前一篇中,比較運算會產生TrueFalse。選擇結構則根據這個結果,決定是否執行某段程式。

取得感測資料形成判斷條件選擇程式分支顯示建議或紀錄
場域原則:Python的輸出是依規則產生的「提示」,不是自動取代養殖戶與專業人員的決策。真實系統還要考慮感測器校正、養殖物種、季節、池況、歷史趨勢及現場觀察。

二、單向選擇:符合條件才執行

單向選擇只有一個if。條件成立才執行縮排區塊;不成立便略過。

sensor_online = False

if not sensor_online:
    print("提醒:感測器目前離線,請先檢查連線。")

print("本次狀態檢查結束。")
語法重點:if條件後要有冒號;分支內程式必須縮排,通常使用4個空白。不要混用Tab與空白。

空白程式區塊使用pass

needs_review = True

if needs_review:
    pass  # 尚未決定處理方式,先保留合法區塊

三、雙向選擇:成立與不成立各做一件事

sensor_online = True

if sensor_online:
    print("感測器連線正常,可以讀取資料。")
else:
    print("感測器離線,請先檢查電源與網路。")

if分支

條件為True時執行

else分支

條件為False時執行

只走一條

兩個分支不會同時執行

最後匯合

分支後繼續執行共同程式

四、多向選擇:用if、elif、else分級

當情況不只兩種時,使用elif建立多個互斥分支。Python由上而下檢查,遇到第一個成立條件後,就不再檢查同一組後續分支。

water_temperature = float(input("請輸入水溫(°C):"))

if water_temperature < 25:
    print("教學判讀:低於示範範圍。")
elif water_temperature <= 30:
    print("教學判讀:位於示範範圍。")
else:
    print("教學判讀:高於示範範圍。")
邊界判讀:第二個條件只需寫<= 30,因為能走到這裡就代表第一個< 25不成立,也就是水溫已經大於或等於25。

條件順序會影響結果

temperature = 32

if temperature > 25:
    print("高於25°C")
elif temperature > 30:
    print("高於30°C")

當溫度是32時,第一個條件已成立,因此第二個分支永遠不會被執行。較嚴格或較特殊的條件通常要放前面。

五、使用and、or與not組合條件

運算子意義智慧養殖情境
and所有條件都成立水溫及溶氧都在教學範圍
or至少一個條件成立任一感測值需要留意
not反轉布林結果感測器不是在線狀態
temperature = 28.5
oxygen = 5.8
sensor_online = True

if sensor_online and 25 <= temperature <= 30 and oxygen >= 5:
    print("教學判讀:資料可用,示範條件皆成立。")
else:
    print("教學判讀:請檢查連線或數值。")
可讀性:條件太長時,先分別存入temperature_okoxygen_ok等布林變數,會比全部擠在同一行更容易除錯。

六、in與not in:檢查是否屬於允許集合

in可檢查資料是否存在於List、Tuple、Set、Dict鍵或字串中。

allowed_status = {"正常", "維護中", "離線"}
status = input("請輸入設備狀態:").strip()

if status in allowed_status:
    print(f"已記錄設備狀態:{status}")
else:
    print("輸入值不在允許的設備狀態中。")

Dict中的in檢查的是鍵

pond = {"水溫": 28.5, "溶氧": 5.8}

if "鹽度" not in pond:
    print("本筆資料缺少鹽度欄位。")

七、巢狀判斷:先確認資料,再判讀數值

巢狀判斷是在一個分支中再放入另一個if。智慧養殖資料不應一取得就直接比較數值;較合理的層次是先確認感測器在線,再確認資料是否缺漏,最後才判讀數值。

sensor_online = True
temperature = 28.5

if sensor_online:
    if temperature is not None:
        if 25 <= temperature <= 30:
            print("教學判讀:水溫位於示範範圍。")
        else:
            print("教學判讀:水溫超出示範範圍。")
    else:
        print("資料缺漏:沒有取得水溫。")
else:
    print("設備離線:暫不進行水溫判讀。")
不要用temperature == None判斷是否為None時,Python慣例使用is Noneis not None

八、避免過深的巢狀結構

巢狀太深會難以閱讀。可以先處理例外情況,再處理主要流程;學會函式後,也可把各項檢查拆成獨立函式。

sensor_online = True
temperature = None

if not sensor_online:
    message = "設備離線"
elif temperature is None:
    message = "水溫資料缺漏"
elif 25 <= temperature <= 30:
    message = "水溫位於教學示範範圍"
else:
    message = "水溫超出教學示範範圍"

print(message)

九、資料有效性不能只看合理範圍

「數值看起來正常」不等於「資料一定可靠」。至少要分辨:

層次問題示範檢查
連線感測器是否在線?sensor_online
缺漏是否取得資料?value is not None
型別資料能否轉為數值?型別轉換與例外處理
合理性是否落在物理可理解範圍?比較運算
管理門檻是否需要通知或現場確認?由專業人員設定規則

十、完整示範:智慧養殖分層判讀

allowed_ponds = {"一號池", "二號池", "三號池"}

pond_name = input("養殖池名稱:").strip()
sensor_status = input("感測器狀態(正常/維護中/離線):").strip()

if pond_name not in allowed_ponds:
    print("資料錯誤:養殖池名稱不在清單中。")
elif sensor_status == "離線":
    print("設備離線:請先檢查電源與網路,不進行數值判讀。")
elif sensor_status == "維護中":
    print("設備維護中:本筆資料暫不列入正式分析。")
elif sensor_status == "正常":
    temperature = float(input("水溫(°C):"))
    oxygen = float(input("溶氧(mg/L):"))

    temperature_ok = 25 <= temperature <= 30
    oxygen_ok = oxygen >= 5

    if temperature_ok and oxygen_ok:
        print("教學判讀:兩項示範條件皆成立。")
    elif not temperature_ok and not oxygen_ok:
        print("教學判讀:水溫與溶氧皆需進一步確認。")
    elif not temperature_ok:
        print("教學判讀:請進一步確認水溫。")
    else:
        print("教學判讀:請進一步確認溶氧。")
else:
    print("資料錯誤:設備狀態不在允許清單中。")
這段程式的判斷順序:養殖池名稱→設備狀態→輸入數值→各別布林判斷→組合結果。先確保資料值得判讀,再談是否需要留意。

十一、常見錯誤

錯誤原因修正
if x = 5:把指定運算子當比較運算子改用if x == 5:
漏掉冒號ifelifelse結尾需要冒號在行尾補上:
分支縮排不一致Tab與空白混用統一使用4個空白
if x == "A" or "B""B"本身會被視為真值使用x in {"A", "B"}
嚴格條件放在寬鬆條件後前面分支先攔截重新安排由特殊到一般的順序
直接以感測值控制設備未處理離線、缺漏及錯值先做資料有效性檢查並保留安全機制

十二、漸進式練習

基礎:單向與雙向

輸入感測器電量;低於教學門檻時顯示提醒,否則顯示可繼續監測。門檻值要在輸出中標示為示範。

進階:多向設備狀態

讓使用者輸入「正常、維護中、離線」;用if-elif-else輸出不同處理建議,並拒絕清單外的輸入。

USR挑戰:分開警示與控制

設計程式產生「正常、注意、需現場確認、資料不可用」四種訊息。程式只能提供通知,不直接啟閉真實設備;說明若要控制設備,還需要哪些人工確認、失效保護及操作紀錄。

十三、學習檢核

  1. 單向、雙向與多向選擇結構有何差異?
  2. 為什麼elif條件的排列順序很重要?
  3. in用在Dict時,檢查的是鍵還是值?
  4. 為什麼感測器離線時不應繼續解讀數值?
  5. temperature is None表示什麼?
  6. 真實智慧養殖系統為何不能只靠單一門檻自動控制設備?

十四、AI協作提示詞

請擔任Python選擇結構助教。
我要用智慧養殖情境練習if、elif、else、巢狀判斷與in。
請先問我:資料欄位、可能狀態、缺漏值、教學門檻及輸出訊息。

請依序設計:
1. 資料或設備狀態檢查;
2. 數值是否可用;
3. 教學門檻判讀;
4. 清楚但不誇大的提示訊息。

所有門檻都要標示為教學示範,不可宣稱是真實養殖標準;
不要直接產生控制真實設備的程式,也不要捏造場域成效。

十五、延伸閱讀

十六、本篇小結

選擇結構讓Python能根據不同資料走向不同分支。但真正可靠的場域判讀,不只是比較一個數字;它應先確認資料來源與設備狀態,再處理缺漏與合理性,最後才依專業規則提供提示。

好的智慧系統不是急著替人做決定,而是先確認資料可靠,再把判斷依據清楚交給人。
系列:《Python一下:從風土資料到智慧生活的程式設計》
上一篇:《水井村農漁產資料該用List、Tuple、Dict還是Set?》
下一篇:《巡查七座養殖場——break、continue與迴圈else》
教學定位:國立虎尾科技大學USR × 智慧養殖 × Python選擇結構 × 負責任資料判讀

沒有留言:

張貼留言