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