深入 Python 流程控制語句
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?… 序列用于替代其它語言中的 swtich 或 case 語句。
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']
3.?range()?函數
如果你需要一個數值序列,內置函數?range()?會很方便,它生成一個等差級數鏈表:
>>> for i in range(5):
... print(i)
...
0
1
2
3
4
range(10)生成了一個包含 10 個值的鏈表,它用鏈表的索引值填充了這個長度為 10 的列表,所生成的鏈表中不包括范圍中的結束值。也可以讓?range()?操作從另一個數值開始,或者可以指定一個不同的步進值(甚至是負數,有時這也被稱為 “步長”):
range(5, 10)
5 through 9
range(0, 10, 3)
0, 3, 6, 9
range(-10, -100, -30)
-10, -40, -70
需要迭代鏈表索引的話,如下所示結合使 用?range()?和?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(),請參見?循環技巧。
如果你只是打印一個序列的話會發生奇怪的事情:
>>> print(range(10))
range(0, 10)
在不同方面?range()?函數返回的對象表現為它是一個列表,但事實上它并不是。當你迭代它時,它是一個能夠像期望的序列返回連續項的對象;但為了節省空間,它并不真正構造列表。
我們稱此類對象是?可迭代的,即適合作為那些期望從某些東西中獲得連續項直到結束的函數或結構的一個目標(參數)。我們已經見過的?for?語句就是這樣一個迭代器。list()?函數是另外一個(?迭代器?),它從可迭代(對象)中創建列表:
>>> list(range(5))
[0, 1, 2, 3, 4]
稍后我們會看到更多返回可迭代(對象)和以可迭代(對象)作為參數的函數。
4.?break?和?continue?語句, 以及循環中的?else?子句
break?語句和 C 中的類似,用于跳出最近的一級?for?或?while?循環。
循環可以有一個?else 子句;它在循環迭代完整個列表(對于?for?)或執行條件為 false (對于?while?)時執行,但循環被?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
(Yes, 這是正確的代碼。看仔細: else 語句是屬于?for?循環之中,?不是?if?語句。)
與循環一起使用時,else 子句與?try?語句的?else?子句比與?if?語句的具有更多的共同點:try?語句的?else?子句在未出現異常時運行,循環的?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
5.?pass?語句
pass?語句什么也不做。它用于那些語法上必須要有什么語句,但程序什么也不做的場合,例如:
>>> while True:
... pass # Busy-wait for keyboard interrupt (Ctrl+C)
...
這通常用于創建最小結構的類:
>>> class MyEmptyClass:
... pass
...
另一方面,pass?可以在創建新代碼時用來做函數或控制體的占位符。可以讓你在更抽象的級別上思考。pass?可以默默的被忽視:
>>> def initlog(*args):
... pass # Remember to implement this!
...
http://haohuigou.com/73198.html