低調但有料的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
15會員
129內容數
寫點東西自娛娛人
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
ysf的沙龍 的其他內容
就這樣,因為拖延症犯了想偷懶,結果是對dictionary的使用時機和使用方式,有了新的體會。原來,dictionary這樣用,也是可以的啦!
「蛤?!居然當機!」瞪著畫面凍結的螢幕,心裡一面嘀嘀咕咕,一面敲著鍵盤,企圖死馬當活馬醫,看看能不能免去重開機的麻煩。 一切的努力都是徒然,這是徹底的當機!滑鼠、鍵盤完全失去作用,只餘關電源強迫關機一條路可走。 在重開機的當兒,一面看著螢幕有沒有顯示異常的訊息,一面開始分析可能的當機原因。
看來這應該是pygame的bug,而不是自己寫的程式有問題。為了進一步證實這個猜測,重寫了一個單純只畫出圓球的程式,除了畫出不同位置的圓球之外,沒有任何其他作用
俗話說「萬事起頭難」還真是一點也沒錯,從開始動筆寫《The Nature of Code閱讀心得筆記——使用Python實作》,到寫完頭一章,再到把文章放上網站開始發表,總共隔了快三個月的時間。
不知道為什麼,原本相安無事的兩個人,突然間看對了眼,開始出雙入對、形影不離。這除了讓人看了很不順眼之外,也很浪費時間。雖然想盡辦法要拆散他們,但都沒成功。逼不得已,只好狠下心來,冒險將一切抹除,讓他們走完「成、住、壞、空」最後的階段,輪迴至下一輪的「成、住、壞、空」。只是沒想到
天啊!怎麼這麼混亂!網路上有一卡車的文章在談class、object、instance有什麼不同;在Stack Overflow中,關於object和instance間的差異,也一再有人問起。只是啊只是,看了一大堆的討論、解釋,似乎是懂了,但又總覺得不踏實,就好像漂蕩在太空中,明明目標就在眼前,但無
就這樣,因為拖延症犯了想偷懶,結果是對dictionary的使用時機和使用方式,有了新的體會。原來,dictionary這樣用,也是可以的啦!
「蛤?!居然當機!」瞪著畫面凍結的螢幕,心裡一面嘀嘀咕咕,一面敲著鍵盤,企圖死馬當活馬醫,看看能不能免去重開機的麻煩。 一切的努力都是徒然,這是徹底的當機!滑鼠、鍵盤完全失去作用,只餘關電源強迫關機一條路可走。 在重開機的當兒,一面看著螢幕有沒有顯示異常的訊息,一面開始分析可能的當機原因。
看來這應該是pygame的bug,而不是自己寫的程式有問題。為了進一步證實這個猜測,重寫了一個單純只畫出圓球的程式,除了畫出不同位置的圓球之外,沒有任何其他作用
俗話說「萬事起頭難」還真是一點也沒錯,從開始動筆寫《The Nature of Code閱讀心得筆記——使用Python實作》,到寫完頭一章,再到把文章放上網站開始發表,總共隔了快三個月的時間。
不知道為什麼,原本相安無事的兩個人,突然間看對了眼,開始出雙入對、形影不離。這除了讓人看了很不順眼之外,也很浪費時間。雖然想盡辦法要拆散他們,但都沒成功。逼不得已,只好狠下心來,冒險將一切抹除,讓他們走完「成、住、壞、空」最後的階段,輪迴至下一輪的「成、住、壞、空」。只是沒想到
天啊!怎麼這麼混亂!網路上有一卡車的文章在談class、object、instance有什麼不同;在Stack Overflow中,關於object和instance間的差異,也一再有人問起。只是啊只是,看了一大堆的討論、解釋,似乎是懂了,但又總覺得不踏實,就好像漂蕩在太空中,明明目標就在眼前,但無
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
今天小老闆交辦一項非我執掌的業務,我心想,負責這項工作的人不就坐在位置上嗎?為什麼指名要我處理?我心裡一堆問號?小老闆處事精明,深謀遠慮,他會這樣說一定有他的用意,我沒多問,準時完成。辦公室,水很深,少開口,多做事,保平安,小人散。
Thumbnail
前天跟朋友聊天聊到關於幸福人生使人妒忌的心態,因為她幸福之後,身邊的人變得很奇怪,甚至滿滿的仇恨嫉妒心態. 她不知為何她的幸福會令周遭的人難受... 在台灣這種小而緊密,還帶有華人封建思想的社會裡,大家對於彼此關注度很高 也共同承受社會的許多期待與壓力,在不那麼強調幸福的社會裡,你太幸福會讓身邊的人
Thumbnail
會來到這家位在東區小巷中的神祕酒吧,完全是應友人的邀請。我們想要在晚上暢聊又可以小酌一番,於是友人就找到了這家安靜、使人感到放鬆的酒吧-Book ing bar。
Thumbnail
他們的情感完全禁得起任何危機下的考驗。並且越是危急的時刻,他們越是能夠帶來讓人驚愕的感動。
Thumbnail
能力不一樣,格局不一樣,遇到的人也不一樣,什麼樣的人入什麼樣的圈子,要想藉力而行,就要強己強身,不是一路人,難入一路圈,有些事情不能強求,有些圈子不可強融。 我自己就是那種很低調的努力,非常悶聲發大財的人,因爲我覺得,講真的沒有什麽用,一個行動比100句講的話有用。很多時候我更加願意,直接去行動。
你眼中的攝影包應該是個什麼樣?記得在外出拍照時,筆者背著攝影包總會給人一種“一看就是玩攝影的”這樣的感覺。的確,市面上大多數攝影包的外觀設計都千篇一律,看起來總給人厚重之感,已經讓人審美疲勞瞭。不過樂攝寶Event Messenger系列則是個特例,近日這款Event Messenger 250單肩
Thumbnail
自從開始漫畫知識簡報隔日更後,我開始逐漸受到周遭人的關注,從他們的反饋裡面,我發現到原來輸出不是每個人都會選擇做的事,大家對於我的第一個讚美,通常都是:「哇!你好有毅力/行動力啊!」 我不禁想著,雖然恆常進行畫圖輸出的確需要毅力,但不固定頻率、或是純文字的輸出,是很需要毅力的事情嗎?我想其實不是
Thumbnail
由布院的介紹寫了很多,除了好逛的、好吃的,最重要的還是溫泉體驗。 在台灣,許多溫泉的玩法都是去泡湯,如果路途遙遠的會選擇住宿。到了日本,享受溫泉最棒的方式,應該還是一泊二食的方法吧。 住一晚,讓接待的溫泉旅館為你準備豐盛的晚餐,還有一頓美味的早餐,然後溫泉爽泡N輪。
在現代家庭的設計中,設計風格的選擇可以有很多種,例如現代簡約,歐式,山水田園式等等,不過近年來又興起了一種風格,那就是低調奢華設計風格,其實對於這種風格來說,並沒有一個固定的標準,而是很多人願意去選擇的一個對設計的整體評價,低調奢華裝飾風格並不像現代簡約那樣有著固定的模式。下面來介紹一下低調奢華設計
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
今天小老闆交辦一項非我執掌的業務,我心想,負責這項工作的人不就坐在位置上嗎?為什麼指名要我處理?我心裡一堆問號?小老闆處事精明,深謀遠慮,他會這樣說一定有他的用意,我沒多問,準時完成。辦公室,水很深,少開口,多做事,保平安,小人散。
Thumbnail
前天跟朋友聊天聊到關於幸福人生使人妒忌的心態,因為她幸福之後,身邊的人變得很奇怪,甚至滿滿的仇恨嫉妒心態. 她不知為何她的幸福會令周遭的人難受... 在台灣這種小而緊密,還帶有華人封建思想的社會裡,大家對於彼此關注度很高 也共同承受社會的許多期待與壓力,在不那麼強調幸福的社會裡,你太幸福會讓身邊的人
Thumbnail
會來到這家位在東區小巷中的神祕酒吧,完全是應友人的邀請。我們想要在晚上暢聊又可以小酌一番,於是友人就找到了這家安靜、使人感到放鬆的酒吧-Book ing bar。
Thumbnail
他們的情感完全禁得起任何危機下的考驗。並且越是危急的時刻,他們越是能夠帶來讓人驚愕的感動。
Thumbnail
能力不一樣,格局不一樣,遇到的人也不一樣,什麼樣的人入什麼樣的圈子,要想藉力而行,就要強己強身,不是一路人,難入一路圈,有些事情不能強求,有些圈子不可強融。 我自己就是那種很低調的努力,非常悶聲發大財的人,因爲我覺得,講真的沒有什麽用,一個行動比100句講的話有用。很多時候我更加願意,直接去行動。
你眼中的攝影包應該是個什麼樣?記得在外出拍照時,筆者背著攝影包總會給人一種“一看就是玩攝影的”這樣的感覺。的確,市面上大多數攝影包的外觀設計都千篇一律,看起來總給人厚重之感,已經讓人審美疲勞瞭。不過樂攝寶Event Messenger系列則是個特例,近日這款Event Messenger 250單肩
Thumbnail
自從開始漫畫知識簡報隔日更後,我開始逐漸受到周遭人的關注,從他們的反饋裡面,我發現到原來輸出不是每個人都會選擇做的事,大家對於我的第一個讚美,通常都是:「哇!你好有毅力/行動力啊!」 我不禁想著,雖然恆常進行畫圖輸出的確需要毅力,但不固定頻率、或是純文字的輸出,是很需要毅力的事情嗎?我想其實不是
Thumbnail
由布院的介紹寫了很多,除了好逛的、好吃的,最重要的還是溫泉體驗。 在台灣,許多溫泉的玩法都是去泡湯,如果路途遙遠的會選擇住宿。到了日本,享受溫泉最棒的方式,應該還是一泊二食的方法吧。 住一晚,讓接待的溫泉旅館為你準備豐盛的晚餐,還有一頓美味的早餐,然後溫泉爽泡N輪。
在現代家庭的設計中,設計風格的選擇可以有很多種,例如現代簡約,歐式,山水田園式等等,不過近年來又興起了一種風格,那就是低調奢華設計風格,其實對於這種風格來說,並沒有一個固定的標準,而是很多人願意去選擇的一個對設計的整體評價,低調奢華裝飾風格並不像現代簡約那樣有著固定的模式。下面來介紹一下低調奢華設計