2016-12-18數據庫
while循環結構;數據結構
while語句是Python語言中最通用的迭代結構。app
while語句最完整的書寫格式是:首行以及測試表達式,有一列或多列縮進語句的主體以及一個可選的else部分(控制oop
權離開循環而又沒有碰到Break語句時會執行)。Python會一直計算開頭的測試,而後執行循環主體內的語句,直到測試返回值爲假。性能
1 while <test>: #Loop test 2 <statements1> #Loop body 3 else: #Optional else 4 <statements2> #Run if didn't exit loop with break
下面的例子會不斷切掉字符串第一個字符,直到字符串爲空返回假爲止。這樣直接測試對象,而不是使用更冗長的等效寫法(while != ‘’),能夠說是一種典型的寫法。測試
1 x = 'spam' 2 while x: #while x is not empty 3 print (x, end=' ') 4 x = x[1:] #strip first character off x
這裏使用end=' '關鍵字參數,使全部輸出都出如今同一行,之間用空格隔開。ui
Python中沒有其餘語言中所謂的「do...until(while)」循環語句。不過能夠在循環主體底部以一個測試和break來實現相似的功能。spa
1 while True: 2 ...loop body... 3 if exitTest():break
break:跳出最近所在的循環(跳過整個循環語句);code
continue:跳到最近所在循環的開頭出(來到循環的首行);對象
1 x = 10 2 while x: 3 x = x-1 4 if x % 2 != 0:continue 5 print (x, end= ' ')
continue應該謹慎使用。
上述代碼的等效替換:
1 x = 10 2 while x: 3 x = x-1 4 if x % 2 == 0: 5 print (x, end= ' ')
pass:什麼事也不作,只是一個佔位語句;
循環else塊:只有當循環正常離開時才執行(也就是沒有碰到break語句)。
加入break和continue語句後while循環的通常格式:
1 while <test1>: 2 <statements1> 3 if <test2>:break #Exit loop now,skip else 4 if <test3>:continue #Go to of loop now,to test1 5 else: 6 <statements2> #Run if we didn't hit a 'break'
break和continue語句能夠出如今while(或for)循環主體的任何地方,但一般會進一步嵌套在if語句中,根據默寫條件採起對應的操做。
for循環在Python中是一個通用的序列迭代器:能夠遍歷任何有序的序列對象內的元素。for語句可用於字符串、列表、元組以及其餘內置可迭代對象以及可以
經過類所建立的新對象。
Python for循環的首行定義了一個賦值目標(或一些目標),以及你想遍歷的對象。
1 for <target> in <object>: #Assign object items to target 2 <statements> #Repeated loop body:use target 3 else: 4 <statements> #if we didn't hit a 'break'
for循環的完整格式:
1 for <target> in <object>: #Assign object items to target 2 <statements> 3 if <test> : break #Exit loop now : skip else 4 if <test> : continue #Go to top of loop now 5 else: 6 <statements>
若是迭代元組序列,循環目標自己實際上能夠是目標元祖。這只是元組解包的賦值運算的一個例子而已。記住,for循環把序列對象元素賦值給目標,
而賦值運算在任何地方工做起來都是相同的。
T = [(1,2),(3,4),(5,6)] for (a,b) in T: #Tuple assignment at work print (a,b)
這種形式一般和zip一塊兒調用,以實現並行遍歷。在Python中,它一般還和SQL數據庫一塊兒使用,其中,查詢結果表做爲這裏使用的列表這樣的序列的序列而返回——外圍的
列表就是數據庫表,嵌套的元組是表中的行,元組賦值和列對應。
for循環中的元組是的使用items方法來遍歷字典中的鍵和值變得很方便,而沒必要再遍歷鍵並手動地索引以獲取值:
1 D = {'a':1,'b':2,'c':3} 2 for key in D: 3 print(key,'=>',D[key]) #Use dict keys iterator and index
注意:for循環中的元組賦值並不是是一種特殊狀況,這一點很重要;單詞for以後的任何賦值目標在語法上都是有效。儘管咱們老是在for循環中手動地賦值以解包:
1 T = [(1,2),(3,4),(5,6)] 2 for both in T: 3 a,b = both #Manual assignment equivalent 4 print(a,b)
任何嵌套的序列結構均可以按照這種方式解包,只不過由於序列賦值是如此通用:
for ((a,b),c) in [((1,2),3),['xy',6]]: print(a,b,c)
在Python3.0之後的的版本中,因爲一個序列能夠賦值給一組更爲通用的名稱(其中有一個帶有星號的名稱收集多個元素),咱們能夠在for循環中使用一樣的語法來提取
嵌套的序列的部分:
1 for (a,*b,c) in [(1,2,3,4),(5,6,7,8)]: 2 print (a,b,c) 3 4 輸出結果: 5 1 [2, 3] 4 6 5 [6, 7] 8
這種方式能夠用來表示爲嵌套序列的數據的行中選取多個列。
嵌套for循環:
本例是在for中示範循環else分句以及語句嵌套。考慮到對象列表(元素)以及鍵列表(測試),這段代碼會在對象列表中搜索每一個鍵,而後報告其搜索結果。
1 items = ["aaa",111,(4,5),2.01] 2 tests = [(4,5),3.14] 3 for key in tests: 4 for item in items: 5 if item == key: 6 print (key,"was found") 7 break 8 else:print(key,"not found!") 9 10 11 12 運行結果 13 (4, 5) was found 14 3.14 not found!
由於這裏的嵌套if會在找到相符結果時執行break,而循環else分句是認定若是來到此處,搜索就失敗了。注意這裏的嵌套。當這段代碼執行時,同時有兩個循環在運行:外層
循環掃描鍵列表,而內層循環爲每一個鍵掃描元素列表。循環else分句的嵌套是很關鍵的,其縮進至和內層for循環首行相同的層次,因此是和內層循環相關聯的(而不是if或外層
的for)。
注意:若是咱們採用in運算符測試成員關係,這個示例就會比較易於編寫。由於in會隱形的掃描列表來找到匹配,所以能夠取代內層循環。
1 for key in tests: 2 if key in items: 3 print(key, "was found") 4 else: 5 print(key, "not found") 6 7 8 輸出結果: 9 (4, 5) was found 10 3.14 not found
通常來講,基於對簡潔和性能的考慮,讓Python儘量多作一點工做。
本例子以for執行典型的數據結構任務:收集兩個序列(字符串)中相同元素。這差很少是簡單的集合交集的例程。在循環執行後,res引用的列表中包含seq1和seq2中
找到的全部元素。
1 res = [] #start empty 2 for x in seq1: #Scan first sequence 3 if x in seq2: #Common item? 4 res.append(x) #Add to result end 5 6 運行結果: 7 res 8 ['s', 'a', 'm']