### 4. 控制流
除了前面介紹的 [while](#)語句,Python 也有其它語言常見的流程控制語句,但是稍有不同。
### 4.1. [if](#) 語句
也許最知名的語句類型是[if](#)語句。例如:
~~~
>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
... x = 0
... print('Negative changed to zero')
... elif x == 0:
... print('Zero')
... elif x == 1:
... print('Single')
... else:
... print('More')
...
More
~~~
可以有零個或多個 [elif](#) 部分,[else](#) 部分是可選的。關鍵字 '[elif](#)' 是 ?'else if' 的簡寫,可以有效避免過深的縮進。[if](#)...[elif](#) ...[elif](#) ... 序列用于替代其它語言中 switch 或case 語句。
### 4.2. [for](#) 語句
Python 中的[for](#)語句和你可能熟悉的 C 或 Pascal 中的有點不同。和常見的依據一個等差數列迭代(如 Pascal),或讓用戶能夠自定義迭代步驟和停止條件(如 C)不一樣,Python 的 [for](#) 語句按照元素出現的順序迭代任何序列(列表或字符串)。例如(沒有雙關意):
~~~
>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
... print(w, len(w))
...
cat 3
window 6
defenestrate 12
~~~
如果要在循環內修改正在迭代的序列(例如,復制所選的項目),建議首先制作副本。迭代序列不會隱式地創建副本。?使用切片就可以很容易地做到:
~~~
>>> for w in words[:]: # Loop over a slice copy of the entire list.
... if len(w) > 6:
... words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']
~~~
### 4.3.?[range()](# "range") 函數
如果你確實需要遍歷一個數字序列,內置函數[range()](# "range")很方便。它會生成等差序列:
~~~
>>> for i in range(5):
... print(i)
...
0
1
2
3
4
~~~
給定的終點永遠不會在生成的序列中;若要依據索引迭代序列,你可以結合使用[range()](# "range")和[len()](# "len") ,如下所示:也可以讓 range 函數從另一個數值開始,或者可以指定一個不同的步進值(甚至是負數,有時這也被稱為‘步長’):
~~~
range(5, 10)
5 through 9
range(0, 10, 3)
0, 3, 6, 9
range(-10, -100, -30)
-10, -40, -70
~~~
若要依據索引迭代序列,你可以結合使用[range ()](# "range") 和[len()](# "len") ,如下所示:
~~~
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
... print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb
~~~
然而,在這種情況下,大部分時候使用[enumerate()](# "enumerate")函數會更加方便,請參見[*Looping Techniques*](#)。
如果你只打印range,會出現奇怪的結果:
~~~
>>> print(range(10))
range(0, 10)
~~~
[range()](# "range")返回的對象的行為在很多方面很像一個列表,但實際上它并不是列表。當你迭代它的時候它會依次返回期望序列的元素,但是它不會真正產生一個列表,因此可以節省空間。
我們把這樣的對象稱為*可迭代的*,也就是說它們適合期望連續獲得元素的函數和構造器,直到窮盡。我們已經看到[for](#)語句是這樣的一個*迭代器*。[list()](# "list")函數是另外一個;它從可迭代對象創建列表。
~~~
>>> list(range(5))
[0, 1, 2, 3, 4]
~~~
后面我們會看到更多返回可迭代對象和以可迭代對象作為參數的函數。
### 4.4. [break](#) 和 [continue](#) 語句,以及循環中 [else](#) 字句
[Break](#) 語句和 C 中的類似,用于跳出最近的[for](#) 或 [while](#) 循環。
循環語句可以有一個 else 子句;當 ([for](#)) 循環迭代完整個列表或([while](#))循環條件變為 false,而非由[break](#) 語句終止時,它會執行。下面循環搜索質數的代碼例示了這一點:
~~~
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print(n, 'equals', x, '*', n//x)
... break
... else:
... # loop fell through without finding a factor
... print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
~~~
(是的,這是正確的代碼。看仔細:else子句屬于[for](#)?循環,**不**屬于 [if](#) 語句。)
當使用一個循環, else子句已更像的else子句的[try](#)語句而不是,[if](#)語句: [try](#)語句的else子句時未發生任何異常,和一個循環else子句運行不會中斷發生時運行。
更多關于[try](#)語句和異常的內容,請參見[*處理異常*](#)。
[continue](#) 語句,也是從 C 語言借來的,表示繼續下一次迭代:
~~~
>>> for num in range(2, 10):
... if num % 2 == 0:
... print("Found an even number", num)
... continue
... print("Found a number", num)
Found an even number 2
Found a number 3
Found an even number 4
Found a number 5
Found an even number 6
Found a number 7
Found an even number 8
Found a number 9
~~~
- Python 2 教程
- 1. 吊吊你的胃口
- 2. Python 解釋器
- 3. Python簡介
- 4. 控制流
- 5. 數據結構
- 6. 模塊
- 7. 輸入和輸出
- 8. 錯誤和異常
- 9. 類
- 10. 標準庫概覽
- 11. 標準庫概覽 — 第II部分
- 12.現在怎么辦?
- 13. 交互式輸入的編輯和歷史記錄
- 14. 浮點數運算:問題和局限
- Python 2 標準庫
- 1. 引言
- 2. 內建函數
- 3. 不太重要的內建函數
- 4. 內建的常量
- 5. 內建的類型
- 6. 內建的異常
- 7. String Services
- 8. Data Types
- 9. Numeric and Mathematical Modules
- 10. File and Directory Access
- 11. Data Persistence
- 13. File Formats
- 14. Cryptographic Services
- 15. Generic Operating System Services
- 16. Optional Operating System Services
- 17. Interprocess Communication and Networking
- 18. Internet Data Handling
- 20. Internet Protocols and Support
- 26. Debugging and Profiling
- 28. Python Runtime Services
- Python 2 語言參考
- 1. 簡介
- 2. 詞法分析
- 3. 數據模型
- 4. 執行模型
- 5. 表達式
- 6. 簡單語句
- 7. 復合語句
- 8. 頂層的組件
- 9. 完整的語法規范
- Python 3 教程
- 1. 引言
- 2. Python 解釋器
- 3. Python簡介
- 4. 控制流
- 5. 數據結構
- 6. 模塊
- 7. 輸入和輸出
- 8. 錯誤和異常
- 9. 類
- 10. 標準庫概覽
- 11. 標準庫概覽 — 第II部分
- 12.現在怎么辦?
- 13. 交互式輸入的編輯和歷史記錄
- 14. 浮點數運算:問題和局限