在3.2中,我們探索了當某個條件為真則執行相應**塊的if語句,實際上,我們還會遇到一些情況,當某個條件為真,則一直執行某項操作,直到條件為假;等看起來很複雜情況。實際上,計算機擅長處理人類覺著重複枯燥的事情。本文我們將來探索迴圈,感受一下計算機處理特定重複事情的簡潔與優雅。
1.while 迴圈
計算1+2+3+4+5或許我們會寫出:
print(1+2+3+4+5)
但如果想要計算1+2+3+4+...+100的值,將式子完整寫出來相當麻煩,而用省略號這種人類看得懂的語言,計算機也無法直接看懂,計算機有它自己的語言規則,可以這樣寫:
就像上面那樣做,並事情就變得簡單多了。計算機依次執行1,2行語句,來到第3行時,判斷while後面i<=100為真,則執行下方**塊的內容(第4,5行內容),而後再回到第3行while位置,判斷i<=100是否為真,若為真,則繼續執行下方**塊的內容,如此迴圈操作,直到最後一次i=101,而後再回到第3行while位置,此時i<=100為假,則跳出while迴圈(不再執行while語句的**塊),來到第6行,輸出s的值。
while語句非常靈活,可用於在條件為真時反覆執行**塊。
2.for 迴圈
對於迴圈,有時候我們可能想根據需要進行定製。比如,一種這樣的需求是為序列(或其他可迭代物件)中每個元素執行**塊。
注:基本上, 可迭代物件是可使用for迴圈進行遍歷的物件。就目前而言,只需將可迭代物件視為序列即可。如果你感興趣,可以自行搜尋可迭代物件和迭代器。
栗子1:
numbers = [0, 1, 2, 3]
for i in numbers:
print(i)
執行上述**,會依次列印列表numbers中的每乙個元素:
012
3
鑑於迭代(也就是遍歷)特定範圍內的數是一種常見的任務, python提供了乙個建立範圍的內建函式range。範圍類似於切片。它們包含起始位置(這裡為0),但不包含結束位置(這裡為4)。
使用range,如果想列印一定範圍內的數,會非常方便,如列印數1~ 100:
for i in range(101):
print(i)
注:只要能夠使用for迴圈,就不要使用while迴圈。
栗子2:
for i in t:
print(i)
執行上述**,會依次列印元組t中的每乙個元素:
banana
pear
栗子3:完成挑戰1.
栗子4:要遍歷字典的所有關鍵字,可像遍歷序列那樣使用普通的for語句。
d =
for key in d:
print(key)
若想遍歷字典的所有值,使用d[key]即可:
d =
for key in d:
print(d[key])
d =
for i in d:
print(d[i])
注:字典元素的排列順序是不確定的。換而言之,迭代字典的鍵或值時,一定會處理所有的鍵或值,但不知道處理的順序。如果順序很重要,可將鍵或值儲存在乙個列表中並對列表排序,再進行迭代。
3.內建函式zip
python提供了多個可幫助迭代序列(或其他可迭代物件)的函式,模組itertools中,還有一些內建函式使用起來也很方便。
有時候,可能想同時迭代兩個序列。假設有下面兩個列表(水果和**),要列印水果和對應的**,可以像下面這樣做::
p = [12, 6, 5, 9]
for i in range(len(f)):
print(f[i], '$', p[i])
執行結果為:
banana $ 6
pear $ 5
mango $ 9
乙個很有用的並行迭代工具是內建函式zip,它將兩個序列「縫合」起來,並返回乙個由元組組成的序列。返回值是乙個適合迭代的物件,要檢視其內容,可使用list將其轉換為列表。
p = [12, 6, 5, 9]
list(zip(f, p))
執行結果為:
"縫合"後,可在迴圈中將元組解包:
p = [12, 6, 5, 9]
for i, j in zip(f, p):
print(i, '$', j)
注:函式zip可用於「縫合」任意數量的序列。需要指出的是,當序列的長度不同時,函式zip將在最短的序列用完後停止「縫合」。
4.跳出迴圈
有些情況下,需要中斷迴圈、開始新迭代(進入「下一輪」**塊執行流程)或直接結束迴圈。
4.1 break:結束(跳出)迴圈。
在60以內的整數中,從1開始加,加到某個數字,和為120,找到這個值。找到這個值以後,無需再迭代,因此直接跳出迴圈。
sum = 0
for i in range(1,60):
sum = sum + i
if sum == 120:
print(i)
break
4.2 continue:結束當前迭代,並跳到下一次迭代開頭。
continue意味著跳過迴圈體中餘下的語句,但不結束迴圈,開啟下一次迴圈。
若果只列印10以內的奇數,可以用continue語句跳過某些迴圈:
for i in range(11):
if i % 2 == 0: # 如果i是偶數,執行continue語句
continue # continue語句會直接繼續下一輪迴圈,後續的print()語句不會執行
print(i)
5.迴圈中的 else 子句通常,在迴圈中使用break是「發現」了什麼或「出現」了什麼情況。要在迴圈提前結束時採取某種措施很容易,但有時候可能想在迴圈正常結束時才採取某種措施。如何判斷迴圈是提前結束還是正常結束的呢?一種簡單的辦法是在迴圈中新增一條else子句,它僅在沒有呼叫break時才執行。繼續前面討論break時的示例。
將題目稍稍修改,在60以內的整數中,從1開始加,加到某個數字,和為1200,看看能否到這個值?
sum = 0
for i in range(1,60):
sum = sum + i
if sum == 1200:
print(i)
break
else:
print("didn't find it!")
注:無論是在for迴圈還是while迴圈中,都可使用continue、 break和else子句。
剛興趣的小夥伴可以再瞅瞅:python易錯知識點:break 及break
語句
1.使用for迴圈依次列印出字串hello,world中的每乙個字元。
計算前一天,上乙個月
最笨的方法 declare timeend varchar 30 timestart varchar 30 subs varchar 2 計算統計的開始時間和結束時間 set time convert varchar 30 time,120 select timestart rtrim ltrim ...
取前一天或後一天 乙個月時間
時間操作參考鳥哥部落格,令人困惑的strtotime。date 格式化時間返回string型別。date y m d h i s 獲得當前時間 current date date y m d time weeklater date y m d strtotime current date 1 wee...
時間的處理(一年 多個月 乙個月 一天)
時間格式化 date.prototype.format function fmt if y test fmt fmt fmt.replace regexp.1,this.getfullyear substr 4 regexp.1.length for var k in o if new regexp...