循環語句(for、while)(一)

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循環結構:

 

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循環中的元組賦值

若是迭代元組序列,循環目標自己實際上能夠是目標元祖。這只是元組解包的賦值運算的一個例子而已。記住,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']