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 迴圈遍歷序列(元組或列表)中的元素。建立一個變數來表示序列中的物件。例如,
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
連結
- 4.2. for 語句,Python 教程,docs.python.org
- 4.3. range() 函式,Python 教程,docs.python.org
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 語句。
連結
- 3.2. 邁向程式設計的第一步,Python 教程,docs.python.org
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)
這將不會產生任何輸出。
如果迴圈中沒有遇到 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'
連結
- 4.1. if 語句,Python 教程,docs.python.org
這些迴圈、分支和函式呼叫可以以任何所需的方式巢狀。迴圈可以迴圈遍歷迴圈,分支可以再次分支,函式可以呼叫其他函式,甚至可以呼叫自身。
- 列印從 0 到 1000 的數字(包括 0 和 1000)。
- 列印從 0 到 1000 的數字,這些數字是 5 的倍數。
- 列印從 1 到 1000 的數字,這些數字是 5 的倍數。
- 使用巢狀的 for 迴圈列印下面的 3x3 乘法表
1 2 3
2 4 6
3 6 9
- 列印下面的 3x3 乘法表。
1 2 3
------
1|1 2 3
2|2 4 6
3|3 6 9
- 4. 更多控制流工具,Python 教程,docs.python.org