Python 的流程控制仰賴條件判斷與程式碼區塊的互動作用。條件判斷透過布林表示式決定程式碼區塊是否執行,而程式碼區塊則由縮排組織而成,包含一組相關的程式碼行。這樣的機制讓程式得以根據不同情況執行不同程式碼,實作更複雜的邏輯。常見的流程控制工具包括 ifelifelse 等條件判斷陳述式,以及 whilefor 迴圈,這些工具讓開發者能精確控制程式的執行路徑,實作各種功能。理解這些基本概念對於撰寫有效率且功能完善的 Python 程式至關重要。

流程控制的基礎

流程控制是程式設計中的一個重要概念,決定了程式的執行流程。流程控制的核心是條件和程式碼塊。條件是布林表示式,評估為 True 或 False,而程式碼塊則是由一組相關的程式碼行組成。

條件

條件是布林表示式,可以評估為 True 或 False。它們通常用於流程控制陳述式中,以決定是否執行某段程式碼。例如:

spam = 4
condition = 2 + 2 == spam and not 2 + 2 == (spam + 1) and 2
print(condition)  # Output: True

在這個例子中,條件 condition 是一個布林表示式,評估為 True。

程式碼塊

程式碼塊是由一組相關的程式碼行組成,可以用縮排來表示。程式碼塊可以包含其他程式碼塊。以下是程式碼塊的四個規則:

  1. 當縮排增加時,新的程式碼塊開始。
  2. 程式碼塊可以包含其他程式碼塊。
  3. 當縮排減少到零或包含程式碼塊的縮排時,程式碼塊結束。
  4. Python 期望在以冒號結尾的陳述式後面立即開始一個新的程式碼塊。

範例

下面是一個小程式的範例,展示了程式碼塊的使用:

username = 'Mary'
password = 'swordfish'

if username == 'Mary':
    print('Hello, Mary')

if password == 'swordfish':
    print('Access granted.')
else:
    print('Access denied.')

在這個範例中,有兩個程式碼塊:一個是 if username == 'Mary': 的程式碼塊,另一個是 if password == 'swordfish': 的程式碼塊。每個程式碼塊都包含了一組相關的程式碼行,用縮排來表示。

內容解密:

在這個範例中,我們使用了兩個 if 陳述式,每個陳述式都有一個條件和一個程式碼塊。如果條件為 True,則執行相應的程式碼塊。否則,則跳過該程式碼塊。這種結構允許我們根據不同的條件執行不同的程式碼。

圖表翻譯:

@startuml
:開始; --> :B;
:B; --> [True] :True;
:B; --> [False] :False;
:A; --> :E;
:E; --> [True] :True;
:E; --> [False] :False;
@enduml

這個圖表展示了程式的流程控制結構,根據不同的條件執行不同的程式碼塊。

流程控制的基礎

流程控制是指程式在執行過程中,根據特定條件或情況改變執行流程的能力。它使得程式可以根據輸入、資料或其他因素做出不同的反應。在本章中,我們將探討流程控制的基本概念和語法,包括 if 陳述式和 else 陳述式。

程式執行

在前面的章節中,我們學習了 Python 的基本語法和資料型別。現在,我們來看看程式如何被執行。程式執行是指 Python 解譯器逐步執行程式碼的過程。你可以想象成用手指跟著程式碼,一行一行地執行。

流程控制陳述式

流程控制陳述式是程式中用來控制執行流程的陳述式。它們使得程式可以根據特定條件或情況改變執行流程。最常見的流程控制陳述式是 if 陳述式。

if 陳述式

if 陳述式用於根據條件執行特定的程式碼。如果條件為真,則執行 if 陳述式後面的程式碼。如果條件為假,則跳過 if 陳述式後面的程式碼。

name = 'Alice'
if name == 'Alice':
    print('Hi, Alice.')

在這個例子中,如果 name 變數的值是 'Alice',則執行 print('Hi, Alice.') 陳述式。

else 陳述式

else 陳述式用於指定如果 if 陳述式的條件為假時要執行的程式碼。

name = 'Bob'
if name == 'Alice':
    print('Hi, Alice.')
else:
    print('Hello, stranger!')

在這個例子中,如果 name 變數的值不是 'Alice',則執行 print('Hello, stranger!') 陳述式。

圖表解釋

下面是 if 陳述式的流程圖:

@startuml
:開始; --> :B;
:B; --> [真] :真;
:B; --> [假] :假;
:C; --> :結束;
:D; --> :E;
@enduml

圖表翻譯:

這個流程圖顯示了 if 陳述式的執行流程。如果條件為真,則執行 if 程式碼。如果條件為假,則執行 else 程式碼。最終,程式執行結束。

條件判斷與流程控制

在程式設計中,條件判斷和流程控制是非常重要的概念。它們允許我們根據不同的條件執行不同的動作,從而實作更複雜的邏輯。

if 陳述式

if 陳述式是最基本的條件判斷陳述式。它的基本結構如下:

if 條件:
    # 執行的程式碼

如果條件為真,則執行程式碼。如果條件為假,則跳過程式碼。

else 陳述式

else 陳述式用於指定如果 if 條件為假時要執行的程式碼。它的基本結構如下:

if 條件:
    # 執行的程式碼
else:
    # 執行的程式碼

如果 if 條件為真,則執行 if 下的程式碼。如果 if 條件為假,則執行 else 下的程式碼。

範例:姓名檢查

name = 'Alice'
if name == 'Alice':
    print('Hi, Alice.')
else:
    print('Hello, stranger.')

這個範例檢查變數 name 是否為 'Alice'。如果是,則印出 'Hi, Alice.'。否則,印出 'Hello, stranger.'

elif 陳述式

elif 陳述式是「else if」的簡寫。它用於指定多個條件,並根據條件執行不同的動作。它的基本結構如下:

if 條件1:
    # 執行的程式碼
elif 條件2:
    # 執行的程式碼

如果條件1為真,則執行 if 下的程式碼。如果條件1為假,則檢查條件2。如果條件2為真,則執行 elif 下的程式碼。

範例:姓名和年齡檢查

name = 'Alice'
age = 33
if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')

這個範例檢查變數 name 是否為 'Alice',如果是,則印出 'Hi, Alice.'。如果不是,則檢查變數 age 是否小於 12。如果是,則印出 'You are not Alice, kiddo.'

圖表翻譯:

@startuml
:開始; --> :B;
:B; --> [name == 'Alice'] :name;
:B; --> [name!= 'Alice'] :name;
:D; --> [age < 12] :age;
:D; --> [age >= 12] :age;
@enduml

這個圖表展示了姓名和年齡檢查的流程。

多個 elif 陳述式

可以使用多個 elif 陳述式來指定多個條件。

name = 'Carol'
if name == 'Alice':
    print('Hi, Alice.')
elif name == 'Bob':
    print('Hi, Bob.')
elif name == 'Carol':
    print('Hi, Carol.')

這個範例檢查變數 name 是否為 'Alice''Bob''Carol',並根據條件印出不同的訊息。

圖表翻譯:

@startuml
:開始; --> :B;
:B; --> [name == 'Alice'] :name;
:B; --> [name!= 'Alice'] :name;
:D; --> [name == 'Bob'] :name;
:D; --> [name!= 'Bob'] :name;
:F; --> [name == 'Carol'] :name;
:F; --> [name!= 'Carol'] :name;
@enduml

這個圖表展示了多個 elif 陳述式的流程。

條件判斷的重要性

在程式設計中,條件判斷是非常重要的,因為它可以根據不同的情況執行不同的動作。然而,條件判斷的順序也非常重要,因為它會影響到程式的執行結果。

條件判斷的順序

讓我們來看一個例子。假設我們有一個變數 age,它的值是 3000,我們想要根據這個值來判斷是否該人是 Alice。如果 age 大於 100,我們就會印出 “You are not Alice, grannie.",但如果 age 大於 2000,我們就會印出 “Unlike you, Alice is not an undead, immortal vampire."。

age = 3000

if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
elif age > 100:
    print('You are not Alice, grannie.')
elif age > 2000:
    print('Unlike you, Alice is not an undead, immortal vampire.')

在這個例子中,因為 age 大於 100,所以程式會印出 “You are not Alice, grannie.",而不會印出 “Unlike you, Alice is not an undead, immortal vampire."。這是因為條件判斷的順序很重要,一旦找到一個條件為真的判斷,就會停止執行後面的條件判斷。

內容解密:

  • if 陳述式用於判斷是否滿足某個條件,如果滿足就執行相應的程式碼。
  • elif 陳述式用於在 if 陳述式之後新增更多的條件判斷,如果前面的條件不滿足,就會繼續判斷 elif 後面的條件。
  • 條件判斷的順序非常重要,因為它會影響到程式的執行結果。

Mermaid 圖表:

@startuml
:開始; --> :B;
:B; --> [是] :是;
:B; --> [否] :否;
:D; --> [是] :是;
:D; --> [否] :否;
:F; --> [是] :是;
:F; --> [否] :否;
:H; --> [是] :是;
@enduml

圖表翻譯:

  • 這個 Mermaid 圖表展示了條件判斷的流程。
  • 首先,程式會判斷 name 是否為 ‘Alice’,如果是,就會印出 “Hi, Alice."。
  • 如果 name 不是 ‘Alice’,程式就會繼續判斷 age 是否小於 12,如果是,就會印出 “You are not Alice, kiddo."。
  • 如果 age 不小於 12,程式就會繼續判斷 age 是否大於 100,如果是,就會印出 “You are not Alice, grannie."。
  • 如果 age 不大於 100,程式就會繼續判斷 age 是否大於 2000,如果是,就會印出 “Unlike you, Alice is not an undead, immortal vampire."。

條件判斷與流程控制

在程式設計中,條件判斷和流程控制是非常重要的概念。它們允許我們根據不同的條件執行不同的動作,從而使程式更加智慧和靈活。

if 陳述式

if 陳述式是最基本的條件判斷陳述式。它的基本語法如下:

if 條件:
    # 執行程式碼

如果條件為真,則執行程式碼。

elif 陳述式

elif 陳述式是 if 陳述式的延伸。它允許我們檢查多個條件,並執行相應的程式碼。

if 條件1:
    # 執行程式碼1
elif 條件2:
    # 執行程式碼2

如果條件1為真,則執行程式碼1;否則,如果條件2為真,則執行程式碼2。

else 陳述式

else 陳述式是 if 和 elif 陳述式的補充。它允許我們指定一個預設動作,如果所有條件都為假時執行。

if 條件1:
    # 執行程式碼1
elif 條件2:
    # 執行程式碼2
else:
    # 執行預設程式碼

如果條件1和條件2都為假,則執行預設程式碼。

流程控制

流程控制是指程式的執行順序。它可以透過 if、elif 和 else 陳述式來控制。以下是一個例子:

name = 'Carol'
age = 3000

if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
else:
    print('You are neither Alice nor a little kid.')

這個程式首先檢查 name 是否為 ‘Alice’,如果是,則執行 print(‘Hi, Alice.’);否則,如果 age 小於 12,則執行 print(‘You are not Alice, kiddo.’);否則,執行 print(‘You are neither Alice nor a little kid.’)。

程式範例:Opposite Day

以下是一個簡單的程式範例,示範如何使用 if 和 else 陳述式來實作 Opposite Day 的功能:

today_is_opposite_day = True

if today_is_opposite_day:
    say_it_is_opposite_day = False
else:
    say_it_is_opposite_day = True

if say_it_is_opposite_day:
    print('Today is Opposite Day.')
else:
    print('Today is not Opposite Day.')

這個程式首先設定 today_is_opposite_day 的值為 True 或 False,然後根據這個值設定 say_it_is_opposite_day 的值。最後,根據 say_it_is_opposite_day 的值決定是否印出 ‘Today is Opposite Day.’ 或 ‘Today is not Opposite Day.’。

內容解密:

  • if 和 elif 陳述式可以用來檢查多個條件,並執行相應的程式碼。
  • else 陳述式可以用來指定一個預設動作,如果所有條件都為假時執行。
  • 流程控制可以透過 if、elif 和 else 陳述式來控制。
  • 程式範例:Opposite Day 示範如何使用 if 和 else 陳述式來實作 Opposite Day 的功能。

圖表翻譯:

@startuml
:開始; --> :B;
:B; --> [True] :True;
:B; --> [False] :False;
:C; --> :E;
:D; --> :E;
:E; --> [True] :True;
:E; --> [False] :False;
@enduml

這個流程圖示範了 Opposite Day 程式的流程控制。首先,程式設定 today_is_opposite_day 的值,然後根據這個值設定 say_it_is_opposite_day 的值。最後,根據 say_it_is_opposite_day 的值決定是否印出 ‘Today is Opposite Day.’ 或 ‘Today is not Opposite Day.’。

進一步分析程式碼

首先,我們看到了一個簡單的程式碼,用於判斷今天是否為相反日(Opposite Day)。程式碼使用了一個布林變數 today_is_opposite_day 來表示今天是否為相反日,如果為 True,則將 say_it_is_opposite_day 設為 False,否則設為 True。接下來,程式碼使用了一個 if-else 陳述式來判斷是否要印出 “Today is Opposite Day.” 或 “Today is not Opposite Day."。

然後,我們看到了一個名為 dishonestcapacity.py 的程式碼,用於計算硬碟或快閃記憶體記憶體的實際容量與廣告容量之間的差異。程式碼首先詢問使用者輸入廣告容量的單位(TB 或 GB),然後根據使用者的輸入計算實際容量與廣告容量之間的差異。

Dishonest Capacity Calculator 程式碼分析

程式碼使用了一個 if-elif 陳述式來根據使用者輸入的單位計算差異。如果使用者輸入 “TB” 或 “tb”,則計算差異為 1000000000000 / 1099511627776。如果使用者輸入 “GB” 或 “gb”,則計算差異為 1000000000 / 1073741824。

然後,程式碼詢問使用者輸入廣告容量,並將其轉換為浮點數。最後,程式碼可以使用計算出的差異和使用者輸入的廣告容量來計算實際容量。

程式碼最佳化

為了最佳化程式碼,我們可以將 if-elif 陳述式合併為一個單一的 if 陳述式,使用布林運算元來簡化條件判斷。此外,我們可以使用函式來封裝計算差異和實際容量的邏輯,以提高程式碼的可讀性和可維護性。

Mermaid 圖表

@startuml
:開始; --> :詢問使用者輸入單位;
:B; --> :計算差異;
:C; --> :詢問使用者輸入廣告容量;
:D; --> :計算實際容量;
:E; --> :印出結果;
@enduml

圖表翻譯

此圖表展示了 Dishonest Capacity Calculator 程式碼的流程。程式碼首先詢問使用者輸入單位,然後根據使用者的輸入計算差異。接下來,程式碼詢問使用者輸入廣告容量,並使用計算出的差異和使用者輸入的廣告容量來計算實際容量。最後,程式碼印出結果。

內容解密

Dishonest Capacity Calculator 程式碼使用了一個 if-elif 陳述式來根據使用者輸入的單位計算差異。差異是透過將廣告容量除以實際容量來計算的。例如,如果使用者輸入 “TB”,則差異為 1000000000000 / 1099511627776。如果使用者輸入 “GB”,則差異為 1000000000 / 1073741824。

然後,程式碼使用計算出的差異和使用者輸入的廣告容量來計算實際容量。實際容量是透過將廣告容量乘以差異來計算的。

硬碟容量計算與真實容量差異

在購買硬碟或隨身碟時,我們常常會看到廣告宣稱的容量,但真實容量往往會有所不同。這是因為硬碟製造商使用的計算單位與我們日常使用的單位不同。

容量計算

硬碟製造商使用的計算單位是以 1000 為基數,而非 1024。因此,當我們看到一個 1TB 的硬碟時,其實它的真實容量只有約 931GB。

# 定義廣告宣稱的容量
advertised_capacity = 1

# 定義單位(TB 或 GB)
unit = 'TB'

# 計算真實容量
if unit == 'TB' or unit == 'tb':
    discrepancy = 1000000000000 / 1099511627776
elif unit == 'GB' or unit == 'gb':
    discrepancy = 1000000000 / 1073741824

real_capacity = advertised_capacity * discrepancy

print('真實容量:' + str(round(real_capacity, 2)) + ' GB')

真實容量差異

真實容量差異是由於硬碟製造商使用的計算單位與我們日常使用的單位不同所致。這種差異可能會導致我們購買的硬碟容量小於廣告宣稱的容量。

處理無效單位

如果使用者輸入無效單位,程式應該顯示錯誤訊息並終止執行。

# 定義廣告宣稱的容量
advertised_capacity = 1

# 定義單位(TB 或 GB)
unit = 'MB'

# 計算真實容量
if unit == 'TB' or unit == 'tb':
    discrepancy = 1000000000000 / 1099511627776
elif unit == 'GB' or unit == 'gb':
    discrepancy = 1000000000 / 1073741824
else:
    print('錯誤:無效單位。請輸入 TB 或 GB。')
    sys.exit()

流程控制的基礎:條件判斷和邏輯運算

在 Python 中,條件判斷和邏輯運算是流程控制的基礎。它們使得程式可以根據不同的情況做出不同的決策和執行動作。

布林值(Boolean)

布林值是一種基本的資料型別,代表了真(True)或假(False)兩種狀態。在 Python 中,布林值可以透過比較運算子(如 ==!=<><=>=)來取得。

邏輯運算子

邏輯運算子包括 andornot,用於組合布林值表示式。這些運算子可以用來建立更複雜的條件判斷。

條件判斷

條件判斷是透過比較運算子和邏輯運算子來建立的布林值表示式,用於控制程式的流程。Python 使用縮排(indentation)來定義程式碼塊,這些塊可以用於 ifelifelse 陳述式中。

練習題

  1. 布林值的兩個可能值是什麼?如何書寫它們?
  2. 布林邏輯運算子有哪三種?
  3. 寫出每個布林邏輯運算子的真值表。
  4. 下列表達式的評估結果是什麼?
    • (5 > 4) and (3 == 5)
    • not (5 > 4)
    • (5 > 4) or (3 == 5)
    • not ((5 > 4) or (3 == 5))
    • (True and True) and (True == False)
    • (not False) or (not True)
  5. 比較運算子有哪六種?
  6. 等於運算子和指定運算子之間的差異是什麼?
  7. 說明什麼是條件以及在哪裡使用它。
  8. 在以下程式碼中,識別出三個程式碼塊:

spam = 0 if spam == 10: print(’eggs’)


#### 內容解密:
上述程式碼中,條件判斷是透過 `if` 陳述式實作的,當 `spam` 的值等於 10 時,則執行 `print('eggs')`。這裡的 `if` 陳述式就是一個程式碼塊,透過縮排來定義。

#### 圖表翻譯:
```plantuml
@startuml
:開始; --> :B;
:B; --> [True] :True;
:B; --> [False] :False;
:C; --> :結束;
:D; --> :E;
@enduml

這個流程圖展示了條件判斷的過程,根據條件的真假決定是否執行特定的程式碼。

瞭解迴圈(Loops)及其應用

在前一章中,您學習瞭如何控制程式的流程,決定哪些區塊要執行,哪些要跳過。在這一章中,您將會學習到如何使用迴圈(Loops)來重複執行程式碼區塊。Python 的兩種迴圈:whilefor,能夠讓您自動化任務,因為它們可以在每秒內執行數百萬行程式碼。

While 迴圈

您可以使用 while 陳述式來使一區塊程式碼不斷地執行,直到指定的條件為 Falsewhile 陳述式的基本結構如下:

  1. while 關鍵字
  2. 條件(即評估為 TrueFalse 的表示式)
  3. 冒號
  4. 從下一行開始的縮排程式碼區塊(稱為 while 子句或 while 區塊)

下面是一個使用 if 陳述式和 while 迴圈的例子,兩者都使用相同的條件並根據該條件採取相同的動作:

# if 陳述式
spam = 0
if spam < 5:
    print('Hello, world.')
    spam = spam + 1

# while 迴圈
spam = 0
while spam < 5:
    print('Hello, world.')
    spam = spam + 1

在這兩個例子中,當 spam 小於 5 時,都會印出 “Hello, world."。但是,if 陳述式只會執行一次,而 while 迴圈會不斷地執行,直到 spam 不再小於 5。

內容解密:

在上面的例子中,while 迴圈的條件是 spam < 5。當這個條件為 True 時,迴圈內的程式碼就會被執行。當條件為 False 時,迴圈就會終止。變數 spam 在每次迴圈迭代中都會增加 1,直到它不再小於 5。

實際應用

迴圈在許多實際應用中非常有用,例如:

  • 重複執行某個任務,直到某個條件被滿足。
  • 處理大資料集,逐一處理每個元素。
  • 建立遊戲或動畫,需要不斷更新和渲染畫面。

圖表翻譯:

@startuml
:開始; --> :初始化變數;
:B; --> :檢查條件;
:C; --> [True] :True;
:D; --> :更新變數;
:E; --> :C;
:C; --> [False] :False;
@enduml

在這個圖表中,我們可以看到 while 迴圈的流程:初始化變數,檢查條件,如果條件為 True,就執行迴圈內的程式碼,並更新變數。直到條件為 False,迴圈才終止。

從效能最佳化視角來看,流程控制的效率直接影響程式碼的執行速度和資源消耗。理解條件判斷的順序和不同迴圈型別的特性對於編寫高效能程式碼至關重要。while 迴圈的靈活性使其適用於條件不確定的情況,但需要謹慎處理迴圈條件,避免無限迴圈。if-elif-else 結構則適合處理多個條件分支,清晰的邏輯有助於提高程式碼的可讀性和可維護性。然而,過多的條件分支可能會影響效能,因此需要權衡程式碼結構和執行效率。對於硬碟容量計算的程式碼,雖然簡潔,但缺乏錯誤處理機制,例如使用者輸入非預期單位時,程式應能妥善處理並提示使用者。此外,程式碼可以進一步模組化,將容量計算邏輯封裝成函式,提高程式碼的重用性和可測試性。展望未來,隨著硬體效能的提升和編譯器最佳化技術的發展,流程控制的效能瓶頸將會逐步減弱。然而,程式碼的邏輯清晰度和可維護性將變得更加重要。對於開發者而言,掌握流程控制的最佳實務,例如減少迴圈巢狀、使用適當的資料結構和演算法,將是提升程式碼效能的關鍵。玄貓認為,深入理解流程控制的原理和技巧,並結合實際應用場景進行最佳化,才能編寫出高效、穩健且易於維護的程式碼。