深入 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
可能會(huì)有零到多個(gè)?elif?部分,else?是可選的。關(guān)鍵字 ‘elif’ 是 ’else if’ 的縮寫,這個(gè)可以有效地避免過深的縮進(jìn)。if?…?elif?…?elif?… 序列用于替代其它語言中的 swtich 或 case 語句。
2.?for?語句
Python 中的?for?語句和 C 或 Pascal 中的略有不同。通常的循環(huán)可能會(huì)依據(jù)一個(gè)等差數(shù)值步進(jìn)過程(如 Pascal),或由用戶來定義迭代步驟和中止條件(如 C ),Python 的?for?語句依據(jù)任意序列(鏈表或字符串)中的子項(xiàng),按它們?cè)谛蛄兄械捻樞騺磉M(jìn)行迭代。例如(沒有暗指):
>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
... print(w, len(w))
...
cat 3
window 6
defenestrate 12
在迭代過程中修改迭代序列不安全(只有在使用鏈表這樣的可變序列時(shí)才會(huì)有這樣的情況)。如果你想要修改你迭代的序列(例如,復(fù)制選擇項(xiàng)),你可以迭代它的復(fù)本。使用切割標(biāo)識(shí)就可以很方便的做到這一點(diǎn):
>>> 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()?函數(shù)
如果你需要一個(gè)數(shù)值序列,內(nèi)置函數(shù)?range()?會(huì)很方便,它生成一個(gè)等差級(jí)數(shù)鏈表:
>>> for i in range(5):
... print(i)
...
0
1
2
3
4
range(10)生成了一個(gè)包含 10 個(gè)值的鏈表,它用鏈表的索引值填充了這個(gè)長度為 10 的列表,所生成的鏈表中不包括范圍中的結(jié)束值。也可以讓?range()?操作從另一個(gè)數(shù)值開始,或者可以指定一個(gè)不同的步進(jìn)值(甚至是負(fù)數(shù),有時(shí)這也被稱為 “步長”):
range(5, 10)
5 through 9
range(0, 10, 3)
0, 3, 6, 9
range(-10, -100, -30)
-10, -40, -70
需要迭代鏈表索引的話,如下所示結(jié)合使 用?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(),請(qǐng)參見?循環(huán)技巧。
如果你只是打印一個(gè)序列的話會(huì)發(fā)生奇怪的事情:
>>> print(range(10))
range(0, 10)
在不同方面?range()?函數(shù)返回的對(duì)象表現(xiàn)為它是一個(gè)列表,但事實(shí)上它并不是。當(dāng)你迭代它時(shí),它是一個(gè)能夠像期望的序列返回連續(xù)項(xiàng)的對(duì)象;但為了節(jié)省空間,它并不真正構(gòu)造列表。
我們稱此類對(duì)象是?可迭代的,即適合作為那些期望從某些東西中獲得連續(xù)項(xiàng)直到結(jié)束的函數(shù)或結(jié)構(gòu)的一個(gè)目標(biāo)(參數(shù))。我們已經(jīng)見過的?for?語句就是這樣一個(gè)迭代器。list()?函數(shù)是另外一個(gè)(?迭代器?),它從可迭代(對(duì)象)中創(chuàng)建列表:
>>> list(range(5))
[0, 1, 2, 3, 4]
稍后我們會(huì)看到更多返回可迭代(對(duì)象)和以可迭代(對(duì)象)作為參數(shù)的函數(shù)。
4.?break?和?continue?語句, 以及循環(huán)中的?else?子句
break?語句和 C 中的類似,用于跳出最近的一級(jí)?for?或?while?循環(huán)。
循環(huán)可以有一個(gè)?else 子句;它在循環(huán)迭代完整個(gè)列表(對(duì)于?for?)或執(zhí)行條件為 false (對(duì)于?while?)時(shí)執(zhí)行,但循環(huán)被?break?中止的情況下不會(huì)執(zhí)行。以下搜索素?cái)?shù)的示例程序演示了這個(gè)子句:
>>> 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, 這是正確的代碼??醋屑?xì): else 語句是屬于?for?循環(huán)之中,?不是?if?語句。)
與循環(huán)一起使用時(shí),else 子句與?try?語句的?else?子句比與?if?語句的具有更多的共同點(diǎn):try?語句的?else?子句在未出現(xiàn)異常時(shí)運(yùn)行,循環(huán)的?else?子句在未出現(xiàn)?else?時(shí)運(yùn)行。更多關(guān)于?try?語句和異常的內(nèi)容,請(qǐng)參見?異常處理。
continue?語句是從 C 中借鑒來的,它表示循環(huán)繼續(xù)執(zhí)行下一次迭代:
>>> 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)
...
這通常用于創(chuàng)建最小結(jié)構(gòu)的類:
>>> class MyEmptyClass:
... pass
...
另一方面,pass?可以在創(chuàng)建新代碼時(shí)用來做函數(shù)或控制體的占位符。可以讓你在更抽象的級(jí)別上思考。pass?可以默默的被忽視:
>>> def initlog(*args):
... pass # Remember to implement this!
...
http://www.vfuj.cn/73198.html