如何使用 Python 的 for 循環(huán)
譯文【51CTO.com快譯】在Python中創(chuàng)建循環(huán)時,通常有兩個選擇:while循環(huán)和for循環(huán)。while很簡單:它只是重復(fù),直到給定的條件不再成立。for循環(huán)比較復(fù)雜,因而功能更強大:for循環(huán)語句集合中遍歷,而不必知道集合的詳細信息。
Python for 循環(huán)組件
Python for循環(huán)有兩個組件:
• 包含或產(chǎn)生要循環(huán)的元素的容器、序列或生成器。一般來說,任何支持 Python迭代器協(xié)議的對象都可以在for循環(huán)中使用。
• 保存容器/序列/生成器中每個元素的變量。
在下面的例子中,我們循環(huán)遍歷一個數(shù)字列表,并使用變量digit依次保存每個數(shù)字:
- for digit in [3,1,4,1,5,9]:
- print (digit)
這將打?。?/p>
- 3 1 4 1 5 9
如果要遍歷生成容器或序列的對象,可以使用 Python 的多重賦值語法將其解包。例如:
- for letter, number in [["a",1],["b",2]]:
- print (letter, number)
輸出:
- a 1
- b 2
常見的 Python for 循環(huán)
以下是 Python for 循環(huán)中使用的一些常見對象:
列表
上面的例子展示了如何使用for循環(huán)迭代列表。請注意,如果您有一個列表,則for循環(huán)提取的每個元素本身就是一個列表。for循環(huán)不會自動“展平”任何類型的嵌套結(jié)構(gòu)。
字符串
Python 中的字符串被認為是“序列”——它們可以被迭代,迭代字符串的結(jié)果是字符串中的每個字符。
- for letter in "Hello world":
- print (letter)
這將產(chǎn)生:
- H
- e
- l
- l
- o
- w
- o
- r
- l
- d
字典
使用for循環(huán)遍歷字典會生成字典中的每個鍵。
- d1 = {
- "a": 1,
- "b": 2
- }
- for key in d1:
- print (key)
這將產(chǎn)生:
- a
- b
如果要遍歷字典的值,請使用字典的.values()方法。還可以使用.items()一起遍歷鍵和值:
- d1 = {
- "a": 1,
- "b": 2
- }
- for key, value in d1.items():
- print (key, value)
這將產(chǎn)生:
- a 1
- b 2
生成器
生成器生成一系列的項,每次調(diào)用一個項。for循環(huán)中使用的生成器的一個常見示例是range。
- for n in range(50):
- print (n)
這將打印數(shù)字 0 到 49。
請注意,僅僅因為可以在for循環(huán)中使用生成器,并不意味著生成器最終會自行停止。例如,這個for循環(huán)將永遠運行:
- def forever():
- while True:
- yield 1
- for n in forever():
- print (n)
在這種情況下,需要采取措施確保循環(huán)可以終止。(參見下面的“流量控制”。)
在Python for循環(huán)中使用索引和枚舉
從 C、C++ 或 Java 等語言來到 Python 的開發(fā)人員通常會創(chuàng)建一個索引變量,用于逐步遍歷正在迭代的對象。舉個例子:
- x =[ 3 , 1 , 4 , 1 , 5 , 9 ]
- n = 0而n < len ( x ): print ( x [ n ])
- n += 1
這本身并沒有錯,但它忽略了 Python 的工作原理。Python 中的for循環(huán)不需要索引;它可以只遍歷要迭代的對象,而無需對其進行索引。
但是,有時需要在循環(huán)時跟蹤正在處理的元素。Python 的enumerate()實用程序?qū)Υ擞兴鶐椭K枰粋€可迭代對象,并在每次迭代時生成索引和該索引處的對象的元組:
- x = [3,1,4,1,5,9]
- for index, n in enumerate(x):
- print (index, n)
- 0 3
- 1 1
- 2 4
- 3 1
- 4 5
- 5 9
Python for 循環(huán)中的流量控制
for循環(huán)并不總是運行到完成,或完全按順序運行。假如想提前跳出一個for循環(huán),或者跳過循環(huán)中的某個項。為此,Python提供了兩個關(guān)鍵字:break和continue。
- for n in range(20):
- if n % 2 == 0: # if n is a multiple of 2
- continue # then skip it
- # everything after this point is not run
- # if `continue` is invoked
- print (n)
- print ("Done")
這將產(chǎn)生1 3 5 7 9 11 13 15 17 19,然后Done。請注意,當(dāng)循環(huán)結(jié)束時,程序在print(“Done”)處正常繼續(xù)。
- for n in range ( 20 ): if n == 10 : break # 完全離開循環(huán)print ( n ) print ( "Done" )
打印數(shù)字0到9,然后Done。
請注意,如果循環(huán)嵌套在其他循環(huán)中,break則只會影響當(dāng)前循環(huán)——它不會從所有循環(huán)級別退出。從多個for循環(huán)中退出需要不同的機制,如sentinel變量:
- done = False
- for n in range(20):
- for m in range(40):
- if n==10 and m==10:
- done = True
- if done: break
- if done: break
Python for 循環(huán)陷阱
在for循環(huán)中迭代對象的元素時,不要做任何會改變成員或序列長度的事情。例如,如果要在一個列表上迭代,則不要在迭代時從列表中添加或刪除元素。
如果迭代元素的原因是測試每個元素以查看是否需要添加或刪除某些內(nèi)容,那么有一個更好的解決方案。創(chuàng)建一個新的空容器,僅用要保留的元素填充它,然后用新容器替換舊容器。
下面是一個帶有列表的示例。這將創(chuàng)建一個只包含奇數(shù)的新列表:
- old_list = [1,2,3,4,5,6]
- new_list = []
- for n in old_list:
- if n % 2:
- new_list.append(n)
- old_list = new_list
【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】