資料內(nèi)容:
2.2 for 語句
在 python 中的 for 語句可能有以前你在 C 或者 pascal 中所用的有點(diǎn)小差別。她既不像
Pascal 語言中常常遍歷數(shù)組的算法過程,也不像在 C 語言中給用戶自己定義遍歷步驟或模糊
條件的能力,python 中的 for 語句可以按照元素在序列(列表或者字符串)中出現(xiàn)的順序逐
步地遍歷它們。例如:
>>> # Measure some strings:
... a = [’cat’, ’window’, ’defenestrate’]
>>> for x in a:
... print(x, len(x))
...
cat 3
window 6
defenestrate 12
在循環(huán)語句中修改正在遍歷的序列是不安全的(這種情況僅僅發(fā)生在可變類型中,如列表)。
如果你需要修改你正在遍歷的列表(例如,想復(fù)制選中項(xiàng))你必須首先復(fù)制 list。然后利用
分片符號很方便實(shí)現(xiàn)它。
>>> for x in a[:]: # make a slice copy of the entire list
... if len(x) > 6: a.insert(0, x)
...
>>> a
[’defenestrate’, ’cat’, ’window’, ’defenestrate’]
2.3 range()方法
如果你想迭代一個(gè)數(shù)字序列,內(nèi)置方法 range()可以很方便實(shí)現(xiàn)它。它可以生成連續(xù)
的數(shù)字:
>>> for i in range(5):
... print(i)
...
0
1
2
3
4
方法中給出的結(jié)點(diǎn)不是產(chǎn)生序列中的一部分。Range(10)就是產(chǎn)生為長度為 10 序列中每個(gè)元
素產(chǎn)生 10 個(gè)合法的索引值。該方法也可以讓范圍從其他數(shù)字開始,或者指定不同的增長數(shù)
(甚至是負(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()結(jié)合起來,例如:
>>> 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
但是,在許多情況下,運(yùn)用 enumerate()方法會更加方法,具體參照 Looping Techniques.
如果你想打印一個(gè)范圍,奇怪的現(xiàn)象將會出現(xiàn)。
>>> print(range(10))
range(0, 10)
在很多情況下利用 range()返回對象表現(xiàn)像列表,但實(shí)際上它不是列表。盡管當(dāng)你迭代期望
序列時(shí),它能夠依次地返回元素,但是它沒有真正生成列表,因此節(jié)省空間。
我們可以把對象成為是可迭代的,就是指它很適合作為預(yù)期得到有序元素事情的方法和結(jié)構(gòu)
的對象。 我們已經(jīng)知道 for 語句就是這種迭代器。方法 list()也算一個(gè),它可以產(chǎn)生有序列
表。
>>> list(range(5))
[0, 1, 2, 3, 4]
稍后我們會看到更多能返回迭代對象和把迭代對象當(dāng)做內(nèi)容的方法。
2.4 break 和 continue 語句和在循環(huán)中的 else 子句
與在 C 語言中一樣,Break 語句將會跳出離它最近的 for 或者 while 循環(huán)。
Continue 語句也是從 C 中借鑒而來,繼續(xù)開始循環(huán)的下一步。
循環(huán)語句中有時(shí)含有 else 的子句。當(dāng)通過遍歷結(jié)束導(dǎo)致循環(huán)終止(for)或者當(dāng)循環(huán)條件變
為 false(如 while),它將會執(zhí)行。但是當(dāng)循環(huán)被 break 語句所終止,它不會被執(zhí)行。下面通
過查詢質(zhì)數(shù)這個(gè)例子來學(xué)習(xí):