和35歲劉阿姨一起自測 Python 流程控制基本功
- 2019 年 11 月 10 日
- 筆記
0、突然降臨的困惑
流程控制語句、布爾值、布爾值操作符都屬於 python
的基礎功。大好周末我寫這篇筆記,不是為了整理這些基礎知識點,而是記錄幾個令我突然迷惑的代碼段。——代碼本身很簡單,但即便已經掌握了基礎功,陡然看到其中某個代碼段,編程初學者還是容易困惑!
你,要不要隨我一起讀完全文,檢查下自己是否牢牢掌握了 python
的流程控制語句?現在開始吧。
1、流程控制語句之 if 分支控制
1.1 開胃小菜:幾段簡單的代碼
運行下面代碼段,將打印什麼呢?
代碼段 A
if 1 + 2 == 3 : print('1') else: print('2')
代碼段 B
if 1 + 3 == 3 : print('1') else: print('2')
上述 python
代碼簡單,且寫法都很常見。A
的結果是 1
,B
的結果是 2
。你答對了吧?
1.2 見證奇蹟:抽象一下
接下來見證奇蹟的時刻……再抽象一下,把上述語句中的布爾值的算式改成布爾值。下面兩段運行代碼後,將打印什麼呢?
代碼段 C
if True: print('1') else: print('2')
代碼段 D
if False: print('1') else: print('2')
你是毫不猶豫、脫口而出的說出正確答案的嗎?C
的結果是 1
,D
的結果是2
。這次你依然都答對了嗎?
1.3 原則:多理解,少死記硬背
我的真實情況是,前兩天做xue.cn的答題挑戰時,看到代碼段 D
這種代碼,突然思維打結。你會不會也遇到過明明早就掌握,但突然對某個知識點又理解無能的返祖情況?
我知道這是常見現象,所以沒有焦慮感。我苦思冥想,嘗試用理解而非死記硬背來徹底掌握這個知識點。
我是這樣理解的。代碼段 D
首個分支是 False
,其它分支被放到 else
,其它分支相當於首個分支的補集,即 not False
也就是 True
,於是代碼段 D
等同於:
代碼段 E
if False: print('1') elif True: print('2')
如法炮製,代碼段 C
等同於:
代碼段 F
if True: print('1') elif False: print('2')
從中可發現: if
分支控制語句,只會觸發 條件為 True
的那個分支,條件為 False
的語句不會觸發。
本來,這篇筆記整理到這裡似乎也能收尾。但我立即聯想到:流程控制語句,除了 if
這個分支控制,還有 while
和 for
兩個循環控制,在循環控制語句中,會有怎樣的規律呢?
打鐵要趁熱,不能停,我們繼續檢查自己的基礎功是否牢靠,然後梳理一下吧!——認知心理學有個結論是,知識點之間的聯想對照,具備非常好的學習效果。
2、流程控制語句之 while 與 for 循環控制
2.1 上菜:讀代碼,自測基礎功
代碼段 G:
while False: print('1') break # 測試代碼,加這句是為了用於跳出循環,避免無限循環 else: print('2')
代碼段 H:
while True: print('1') break # 測試代碼,加這句是為了用於跳出循環,避免無限循環 else: print('2')
代碼段 I:
a = 1 while a < 4: print(a) a = a + 1 else: print('haha')
代碼段 G
的結果為 2
,代碼段 H
的結果為 1
。代碼段 I
的結果為 1 2 3 haha
。
現在再看看 for
循環。
代碼段 J:
for True: print(『1』) else: print('2')
代碼段 K:
for i in range(4): print(i) else: print('aha')
代碼段 J
將報錯,提示語法錯誤。代碼段 K
結果為 0 1 2 3 aha
2.2 整理總結:基於理解,整理加深印象
結合之前用《自學是門手藝》學 python 基礎功的印象,——如果印象很淡,說明自己的複習間隔太久,最好能調整下使之符合記憶曲線;整理時,最好立即翻到書中對應章節複習;再結合前面自測代碼,有多種代碼實現,現在我可以試着總結:
- 在
for
和while
循環控制語句中,else
並非必備部分。 while
的循環體,僅在條件為True
時觸發,條件一直為True
就一直執行;條件為False
或條件變成False
時該部分才執行完畢。for
的循環體,條件部分通常用於控制循環的次數或範圍,並不能使用布爾值。- 循環控制語句有時包含
else
部分,該else
屬於while
整個循環控制的一部分。通常,else
是當循環部分執行完畢後才觸發。例外情況是,如果循環部分包含break
語句並被觸發,將跳出整個循環控制,即不執行else
部分的代碼。
3. 簡短總結
對我個人而言,for
和 while
循環控制語句,自測與複習都很輕鬆,暫時沒有發現什麼疑慮。最初令我迷惑的分支控制語句: if False
的條件為False
,不為真,故該分支將不被執行。——如果流程控制語句中包含布爾運算,那麼僅在條件為真時才觸發對應語句塊。
你和我一起讀到這裡,是否檢測到自己哪些地方存有困惑?如有,不妨參考我的做法,試試代碼的不同寫法,立即運行它,發現和總結規律吧!最後劉阿姨再叮囑兩句:多理解,少死記硬背,遵循記憶曲線,及時複習,用歸納整理的方式鞏固加深影響喲~