智慧養殖設備異常判斷——if、elif、巢狀判斷與in
《從風土資料到智慧生活的程式設計》——讓Python根據資料選擇行動,也保留人的專業判斷。
- 理解條件判斷與布林值的關係。
- 撰寫單向、雙向及多向選擇結構。
- 使用巢狀判斷處理資料品質與設備狀態。
- 搭配
and、or、not與in組合條件。 - 完成具備「資料檢查→設備檢查→數值判讀」層次的智慧養殖示範程式。
一、程式如何做選擇?
前一篇中,比較運算會產生True或False。選擇結構則根據這個結果,決定是否執行某段程式。
二、單向選擇:符合條件才執行
單向選擇只有一個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_ok、oxygen_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 None或is 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: |
| 漏掉冒號 | if、elif、else結尾需要冒號 | 在行尾補上: |
| 分支縮排不一致 | Tab與空白混用 | 統一使用4個空白 |
if x == "A" or "B" | "B"本身會被視為真值 | 使用x in {"A", "B"} |
| 嚴格條件放在寬鬆條件後 | 前面分支先攔截 | 重新安排由特殊到一般的順序 |
| 直接以感測值控制設備 | 未處理離線、缺漏及錯值 | 先做資料有效性檢查並保留安全機制 |
十二、漸進式練習
基礎:單向與雙向
輸入感測器電量;低於教學門檻時顯示提醒,否則顯示可繼續監測。門檻值要在輸出中標示為示範。
進階:多向設備狀態
讓使用者輸入「正常、維護中、離線」;用if-elif-else輸出不同處理建議,並拒絕清單外的輸入。
USR挑戰:分開警示與控制
設計程式產生「正常、注意、需現場確認、資料不可用」四種訊息。程式只能提供通知,不直接啟閉真實設備;說明若要控制設備,還需要哪些人工確認、失效保護及操作紀錄。
十三、學習檢核
- 單向、雙向與多向選擇結構有何差異?
- 為什麼
elif條件的排列順序很重要? in用在Dict時,檢查的是鍵還是值?- 為什麼感測器離線時不應繼續解讀數值?
temperature is None表示什麼?- 真實智慧養殖系統為何不能只靠單一門檻自動控制設備?
十四、AI協作提示詞
請擔任Python選擇結構助教。
我要用智慧養殖情境練習if、elif、else、巢狀判斷與in。
請先問我:資料欄位、可能狀態、缺漏值、教學門檻及輸出訊息。
請依序設計:
1. 資料或設備狀態檢查;
2. 數值是否可用;
3. 教學門檻判讀;
4. 清楚但不誇大的提示訊息。
所有門檻都要標示為教學示範,不可宣稱是真實養殖標準;
不要直接產生控制真實設備的程式,也不要捏造場域成效。十五、延伸閱讀
十六、本篇小結
選擇結構讓Python能根據不同資料走向不同分支。但真正可靠的場域判讀,不只是比較一個數字;它應先確認資料來源與設備狀態,再處理缺漏與合理性,最後才依專業規則提供提示。
好的智慧系統不是急著替人做決定,而是先確認資料可靠,再把判斷依據清楚交給人。
沒有留言:
張貼留言