低調但有料的for... else語法

更新於 發佈於 閱讀時間約 5 分鐘
因應原書於2024年改版後授權範圍改變,故改版為《The Nature of Code閱讀心得與Python實作》
文中提到的練習題,在改版之後已刪除。

寫《The Nature of Code閱讀心得筆記——使用Python實作》第二章的第七節摩擦力部分時,有個練習題,是要在畫面中創造一些口袋區域。這些口袋區域有個特性,就是當物體不在其中時,會受到重力和風力的作用,但當物體穿過其中時,就只會受到摩擦力的作用。另外,每個口袋區域的摩擦係數不同,所以物體在不同的口袋區域,感受到的摩擦力會不一樣大。

假設在畫面中跑來跑去的物體叫mover,而所有的口袋區域都放在pockets這個list中。因為要讓mover在口袋區域內和口袋區域外所受的作用力不同,所以必須先檢查mover是不是在某一個口袋區域內,然後再決定哪種作用力會作用在它身上。順著這個思路,主程式的架構可以寫成這樣:

in_pocket = False
for pocket in pockets:
    if mover.isinside(pocket):
        in_pocket = True
        mover.apply_force(friction)
        break

if not in_pocket:
    mover.apply_force(gravity)
    mover.apply_force(wind)

這樣的寫法雖然沒什麼問題,可是不管怎麼看,都覺得拖泥帶水、醜不啦嘰的,實在是讓人沒法就這麼let it be。尤其是那個in_pocket,不知道為什麼,看了就討厭,總覺得欲除之而後快。

其實以前碰到類似問題的時候都是這麼寫的。用迴圈搭配條件判斷,來看看一大堆東西中,是不是有符合條件的。如果有,就做這件事;如果都沒有,就做那件事。但迴圈結束之後,要怎麼知道到底有沒有符合條件的?那就只好用根旗子(flag)來紀錄檢查的結果,如果有符合條件的,就把旗子豎起來。前面程式中的in_pocket,就是這個作用。

說來奇怪,以前使用其他程式語言時,這樣寫都不覺得怎樣,可是現在用python這樣寫,卻覺得很彆扭,看著程式,總覺得那根旗子實在是很礙眼。

看著那根旗子好一會兒,忽然覺得,似乎、彷彿、好像、應該有個for... else語法,可以讓程式漂亮一點。

「還真的有耶!」當真的確定有for... else語法的時候,還真是打從心裡讚嘆了一下。說真的,先前完全不記得有看過這個語法,所以當確定它的確存在時,實在覺得挺神奇的。或許這就跟張三丰教張無忌太極拳一樣,一直到張無忌說全忘光了,張三丰才認為張無忌已經學會了。以前應該有看過for... else這個語法,可是已經沈潛到潛意識中而忘掉了,等到臨陣對戰有需要的時候,那蟄伏在潛意識中的記憶,自然而然就甦醒了。所謂的「靈感」,或許也就是這麼回事吧。

那這個for... else語法,到底是怎麼個運作法呢?來看看下面這段程式:

for i in box:
    if i > 10:
        print(i)
        break
else:
    print('The End!')

如果

box = [1, 9, 15, 8, 18, 2, 0] 

這段程式執行之後,會印出數字「15」。但如果

box = [1, 9, 5, 8, 3, 2, 0] 

則執行之後,會印出「The End!」。從這樣的結果可以知道,這個for就是平常for迴圈的for,沒啥特別的。但是,當for執行完之後,會繼續執行else後面的東西。如果不想要執行else後面的東西,那就在for裡頭用break跳出整個迴圈。

利用for... else語法,那個練習題主程式的架構,可以改寫成這樣:

for pocket in pockets:
    if mover.isinside(pocket):
        mover.apply_force(friction)
        break
else:
    mover.apply_force(gravity)
    mover.apply_force(wind)


少了那根旗子,嗯,感覺上清爽多了!

留言
avatar-img
留言分享你的想法!
avatar-img
ysf的沙龍
19會員
156內容數
寫點東西自娛娛人
ysf的沙龍的其他內容
2025/04/14
花了些時間,靜下心來,仔仔細細地研究了一番,總算把Python呼叫函數時引數的傳遞方式給徹底搞清楚了。
2025/04/14
花了些時間,靜下心來,仔仔細細地研究了一番,總算把Python呼叫函數時引數的傳遞方式給徹底搞清楚了。
2024/05/08
呼!折騰了好久,終於徹底搞清楚pygame的各個blend mode所用的計算式,到底是長啥樣子了。
2024/05/08
呼!折騰了好久,終於徹底搞清楚pygame的各個blend mode所用的計算式,到底是長啥樣子了。
2023/12/20
在寫《The Nature of Code閱讀心得筆記——使用Python實作》的[第四章]4.3節時,原書提到,在使用Java的ArrayList時,如果用迴圈一面走訪一面又移除其中的元素,那會有難以察覺的問題存在。寫個小程式測試的結果發現,Python的list也會有一樣的問題。
Thumbnail
2023/12/20
在寫《The Nature of Code閱讀心得筆記——使用Python實作》的[第四章]4.3節時,原書提到,在使用Java的ArrayList時,如果用迴圈一面走訪一面又移除其中的元素,那會有難以察覺的問題存在。寫個小程式測試的結果發現,Python的list也會有一樣的問題。
Thumbnail
看更多
你可能也想看
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
Thumbnail
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
Thumbnail
在程式語言裡,對應到多重選擇路徑判斷的語法, 最通俗也最常見的就是if ... else ... 語法。 今天,我們將從最基本的 若A條件成立 則...否則 ... 的 if ... else ...開始講起, 搭配幾個範例做說明,最後以一個經典的閏年判定最為結尾的Demo
Thumbnail
在程式語言裡,對應到多重選擇路徑判斷的語法, 最通俗也最常見的就是if ... else ... 語法。 今天,我們將從最基本的 若A條件成立 則...否則 ... 的 if ... else ...開始講起, 搭配幾個範例做說明,最後以一個經典的閏年判定最為結尾的Demo
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
這篇內容,將會講解什麼是「if else」,以及與「if else」相關的知識。包括if else的簡介、if、if else、else if、套娃式的if。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 while 語句,以及控制迴圈執行流程的語句和標籤概念。該章節目的在於讓讀者深入掌握流程控制功能,進一步提升編程技巧。
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 while 語句,以及控制迴圈執行流程的語句和標籤概念。該章節目的在於讓讀者深入掌握流程控制功能,進一步提升編程技巧。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News