和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 的結果是 1B 的結果是 2。你答對了吧?

1.2 見證奇蹟:抽象一下

接下來見證奇蹟的時刻……再抽象一下,把上述語句中的布爾值的算式改成布爾值。下面兩段運行代碼後,將打印什麼呢?

代碼段 C

if True:      print('1')  else:      print('2')

代碼段 D

if False:      print('1')  else:      print('2')

你是毫不猶豫、脫口而出的說出正確答案的嗎?C 的結果是 1D 的結果是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 這個分支控制,還有 whilefor 兩個循環控制,在循環控制語句中,會有怎樣的規律呢?

打鐵要趁熱,不能停,我們繼續檢查自己的基礎功是否牢靠,然後梳理一下吧!——認知心理學有個結論是,知識點之間的聯想對照,具備非常好的學習效果。

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 基礎功的印象,——如果印象很淡,說明自己的複習間隔太久,最好能調整下使之符合記憶曲線;整理時,最好立即翻到書中對應章節複習;再結合前面自測代碼,有多種代碼實現,現在我可以試着總結:

  • forwhile 循環控制語句中,else 並非必備部分。
  • while 的循環體,僅在條件為 True 時觸發,條件一直為 True 就一直執行;條件為 False 或條件變成 False 時該部分才執行完畢。
  • for 的循環體,條件部分通常用於控制循環的次數或範圍,並不能使用布爾值。
  • 循環控制語句有時包含else 部分,該 else 屬於 while 整個循環控制的一部分。通常,else是當循環部分執行完畢後才觸發。例外情況是,如果循環部分包含 break 語句並被觸發,將跳出整個循環控制,即不執行 else 部分的代碼。

3. 簡短總結

對我個人而言,forwhile 循環控制語句,自測與複習都很輕鬆,暫時沒有發現什麼疑慮。最初令我迷惑的分支控制語句: if False 的條件為False,不為真,故該分支將不被執行。——如果流程控制語句中包含布爾運算,那麼僅在條件為真時才觸發對應語句塊。

你和我一起讀到這裡,是否檢測到自己哪些地方存有困惑?如有,不妨參考我的做法,試試代碼的不同寫法,立即運行它,發現和總結規律吧!最後劉阿姨再叮囑兩句:多理解,少死記硬背,遵循記憶曲線,及時複習,用歸納整理的方式鞏固加深影響喲~