跳轉到內容

Python 程式設計/控制流

來自華夏公益教科書


與大多數命令式語言一樣,程式控制流主要分為三大類:

  • 迴圈
  • 分支
  • 函式呼叫

函式呼叫在下一節中介紹。

生成器和列表推導是程式控制流的進階形式,但這裡不涉及。

Python 中的控制流概覽

x = -6                              # Branching
if x > 0:                           # If
  print("Positive")
elif x == 0:                        # Else if AKA elseif
  print("Zero")
else:                               # Else
  print("Negative")
list1 = [100, 200, 300]
for i in list1: print(i)            # A for loop
for i in range(0, 5): print(i)      # A for loop from 0 to 4
for i in range(5, 0, -1): print(i)  # A for loop from 5 to 1
for i in range(0, 5, 2): print(i)   # A for loop from 0 to 4, step 2
list2 = [(1, 1), (2, 4), (3, 9)]
for x, xsq in list2: print(x, xsq)  # A for loop with a two-tuple as its iterator
l1 = [1, 2]; l2 = ['a', 'b']
for i1, i2 in zip(l1, l2): print(i1, i2) # A for loop iterating two lists at once.
i = 5
while i > 0:                        # A while loop
  i -= 1
list1 = ["cat", "dog", "mouse"]
i = -1 # -1 if not found
for item in list1:
  i += 1
  if item=="dog":
    break                           # Break; also usable with while loop
print("Index of dog:", i)
for i in range(1,6):
  if i <= 4:
    continue                        # Continue; also usable with while loop
  print("Greater than 4:", i)

在 Python 中,有兩種迴圈:'for' 迴圈和 'while' 迴圈。

For 迴圈

[編輯 | 編輯原始碼]

for 迴圈遍歷序列(元組或列表)中的元素。建立一個變數來表示序列中的物件。例如,

x = [100,200,300]
for i in x:
      print (i)

這將輸出

100
200
300

for 迴圈遍歷列表或迭代器中的每個元素,並將當前元素分配給給定的變數名。在上面的示例中,x 中的每個元素都分配給 i

一個名為 range 的內建函式可以更輕鬆地建立像上面這樣的連續列表。上面的迴圈等效於

l = range(100, 301,100)
for i in l:
    print (i)

與切片操作類似,在 range 函式中,第一個引數是起始整數(我們可以只傳遞一個引數給 range,它將被解釋為第二個引數,然後預設值:0 用於第一個引數),第二個引數是結束整數,但不包含在列表中。

>>> range(5)
range(0, 5)
>>> list(range(5)) #need to use list() to really print the list out
[0, 1, 2, 3, 4]
>>> set(range(5)) #we can also print a set out
{0, 1, 2, 3, 4}
>>> list(range(1,5))
[1, 2, 3, 4]
>>> list(range(1,1)) #starting from 1, but 1 itself is excluded from the list
[]

下面的示例使用了一個負步長(內建 range 函式的第三個引數,與切片操作類似)

for i in range(5, 0, -1):
    print (i)

這將輸出

5
4
3
2
1

負步長可以是 -2

for i in range(10, 0, -2):
    print (i)

這將輸出

10
8
6
4
2

如果 for 迴圈遍歷元組序列,則可以為元組的每個元素命名

l = [(1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
for x, xsquared in l:
    print(x, ':', xsquared)

這將輸出

1 : 1
2 : 4
3 : 9
4 : 16
5 : 25

連結

While 迴圈

[編輯 | 編輯原始碼]

while 迴圈會重複執行一系列語句,直到條件變為 false。例如

x = 5
while x > 0:
    print (x)
    x = x - 1

將輸出

5
4
3
2
1

Python 的 while 迴圈也可以有 'else' 子句,它是一段語句塊,當 while 條件計算結果為 false 時(一次)執行。while 迴圈中的 break 語句(參見下一節)不會將程式流程引導到 else 子句。例如

x = 5
y = x
while y > 0:
    print (y)
    y = y - 1
else:
    print (x)

這將輸出

5
4
3
2
1
5

與某些語言不同,這裡沒有後置條件迴圈。

當 while 條件永遠不會計算結果為 false,即始終為 true 時,我們就有一個無限迴圈。例如,

x = 1
while x > 0:
    print(x)
    x += 1

這將導致無限迴圈,它列印 1,2,3,4,... 。要停止無限迴圈,我們需要使用 break 語句。

連結

跳出和繼續

[編輯 | 編輯原始碼]

Python 包含語句以提前退出迴圈(for 迴圈或 while 迴圈)。要退出迴圈,請使用 break 語句

x = 5
while x > 0:
    print(x)
    break
    x -= 1
    print(x)

這將輸出

5

開始迴圈的下一輪迭代而不等待當前迴圈結束的語句是 'continue'。

l = [5,6,7]
for x in l:
    continue
    print(x)

這將不會產生任何輸出。

迴圈的 else 子句

[編輯 | 編輯原始碼]

如果迴圈中沒有遇到 break 語句,則會執行迴圈的 else 子句。

l = range(1,100)
for x in l:
    if x == 100:
        print(x)
        break
    else:
        print(x, " is not 100")
else:
    print("100 not found in range")


使用 break 語句和 else 語句的 while 迴圈的另一個示例

expected_str = "melon"
received_str = "apple"
basket = ["banana", "grapes", "strawberry", "melon", "orange"]
x = 0
step = int(raw_input("Input iteration step: "))
 
while received_str != expected_str:
    if x >= len(basket): print("No more fruits left on the basket."); break
    received_str = basket[x]
    x += step # Change this to 3 to make the while statement
              # evaluate to false, avoiding the break statement, using the else clause.
    if received_str==basket[2]: print("I hate", basket[2], "!"); break
    if received_str != expected_str: print("I am waiting for my ", expected_str,".")
else:
    print("Finally got what I wanted! my precious ", expected_str, "!")
print("Going back home now !")

這將輸出

Input iteration step: 2
I am waiting for my  melon .
I hate strawberry !
Going back home now !

Python 透過空白縮排來確定迴圈的重複位置。縮排的所有內容都是迴圈的一部分,下一個沒有縮排的條目不是。例如,下面的程式碼列印“1 1 2 1 1 2”

for i in [0, 1]:
    for j in ["a","b"]:
        print("1")
    print("2")

另一方面,下面的程式碼列印“1 2 1 2 1 2 1 2”

for i in [0, 1]:
    for j in ["a","b"]:
        print("1")
        print("2")

Python 中基本上只有一種分支,即 'if' 語句。if 語句的最簡單形式僅在給定謂詞為 true 時執行程式碼塊,如果謂詞為 false 則跳過它

例如,

>>> x = 10
>>> if x > 0:
...    print("Positive")
...
Positive
>>> if x < 0:
...    print("Negative")
...

您也可以在 if 語句中新增“elif”(“else if”的簡寫)分支。如果第一個“if”上的謂詞為 false,它將測試第一個 elif 上的謂詞,如果為 true 則執行該分支。如果第一個 elif 為 false,它將嘗試第二個,依此類推。但是請注意,一旦找到一個 true 謂詞,它將停止檢查分支,並跳過 if 語句的其餘部分。您也可以使用“else”分支結束 if 語句。如果其他分支都沒有執行,則 python 將執行此分支。

>>> x = -6
>>> if x > 0:
...    print("Positive")
... elif x == 0:
...    print("Zero")
... else:
...    print("Negative")
...
'Negative'

連結

這些迴圈、分支和函式呼叫可以以任何所需的方式巢狀。迴圈可以迴圈遍歷迴圈,分支可以再次分支,函式可以呼叫其他函式,甚至可以呼叫自身。

  1. 列印從 0 到 1000 的數字(包括 0 和 1000)。
  2. 列印從 0 到 1000 的數字,這些數字是 5 的倍數。
  3. 列印從 1 到 1000 的數字,這些數字是 5 的倍數。
  4. 使用巢狀的 for 迴圈列印下面的 3x3 乘法表
1 2 3 
2 4 6 
3 6 9
  1. 列印下面的 3x3 乘法表。
  1 2 3 
 ------
1|1 2 3 
2|2 4 6 
3|3 6 9
[編輯 | 編輯原始碼]
華夏公益教科書