Python的for循環
4.3迭代循環:for語句
Python中提供的另一個循環語句就是for,與while根據條件表達式的真假確定是否進行循環不同,Python中的for語句是通過迭代可迭代對象實現的循環。for接受序列或迭代器作為其參數,每次循環取出其中一個元素,循環的次數取決於序列或迭代器中元素的個數。
圖 for流程圖
for語句的語法如下:
for 變數 in 可迭代對象:
循環體
else:
語句
for語句的執行過程是:
1.程序執行到for,
2.變數從in後面的可迭代對象中取值,取到值則執行循環體;
3.循環體每次執行完後,再重複上一步,由此產生循環;
4.變數從可迭代對象中獲取不到值時,則不執行循環體,循環結束。
5.else的作用同while,也是可選項
Python中的內置數據類型列表、元組、字元串、字典、集合等都是可迭代對象(iterable),可以通過 for 語句進行迭代,所以我們經常會使用for來遍歷這些類型的數據,比如遍歷字元串:
4.3.1容器和迭代器
容器(container)是一種把多個元素組織在一起的數據結構,容器中的元素可以被逐個地迭代獲取,可以用in, not in關鍵字判斷元素是否包含在容器中。通常這類數據結構把所有的元素存儲在內存中(也有一些特例,並不是所有的元素都放在內存,比如迭代器和生成器對象)在Python中,常見的容器對象有:list,set, dict,tuple, str。
我們也可以自己創建一個容器,包含一系列元素,可以通過 for 語句依次循環取出每一個元素,這種容器叫迭代器(iterator)。
迭代器(iterator)簡單來說就像個機器一樣去生產數據,只是數據是事先定製好的,容器大多數時候是把數據放在內存中,而迭代器則是當有人去調用的時候才會在內存中記錄一個值。實際的調用是通過next()方法。迭代器的意義在於當序列長度很大時,可以減少內存消耗,因為每次只需要記錄一個值。而且有些時候只有迭代器是最好的選擇。
一個簡單的例子就可以看出來區別,比如你想循環一段程序一萬次,如果用for循環來實現,你會用像剛才遍歷「hello world」的例子那樣一個含有一萬個字元的字元串來當作可迭代對象嗎?顯然不會,這種情況我們通常用range函數,在Python 2.7 中分range和xrange。的區別就在於,range()會直接在內存中生成一個列表,而xrange()則是一個迭代器,當元素比較多時用xrange更省內存,所以在 Python 3 中range()的功能直接變成xrange(),而不再分成兩個。
range()的作用可以理解為可生成一個序列的迭代器,可指定起始值,終止值,步長值
在這個例子里,我們通過range()聲明了一個可以產生0到9十個數字的迭代器,我們直接列印是看不見的,但是通過for就可以迭代出每一個值,當然,你也可以直接把它轉化成一個列表,在Python2中比較range()和xrange()可以看得比較直觀。
range()還可以通過參數生成一些特定的序列,比如:
至於迭代器本身,實質是實現了next()方法的對象,常見的元組、列表、字典都是迭代器。迭代器中重點關注兩個方法就可以了(iter和next前後都是雙下劃線):
__iter__方法:返回迭代器自身。可以通過python內建函數iter()調用。
__next__方法:當next方法被調用的時候,迭代器會返回它的下一個值,如果next方法被調用,但迭代器沒有值可以返回,就會引發一個StopIteration異常。該方法可以通過 python 內建函數next()調用。
在這個例子中我們把字元串「12345」變成了一個迭代器,這樣,再去直接列印就看不到值了,因為這些值沒在內存上,我們就可以通過next()依次獲取裡面的值,也可以通過for去遍歷,當遍歷過後,實際已經去出了所有值,所以再次通過next()取之的時候就會拋出異常StopIteration停止迭代。
4.3.2實例:斐波納挈數列
斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為「兔子數列」,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……這個數列從第3項開始,每一項都等於前兩項之和。別小看這個看似簡單的數列,在現代物理、准晶體結構、化學等領域,斐波納契數列都有直接的應用。
用程序實現的方式很多,其實只要想清楚核心演算法就簡單得多了,純演算法的解決方式比如:
不過,相比較而言,使用迭代會更加高效,下面的例子會生成一個列表:
4.3.3循環嵌套
for循環中也可以嵌套if語句,實現更靈活的程序。循環的嵌套通常是指在一個循環中完整的包含另外一個完整的循環,也就是循環體中還有循環。while和for可以相互嵌套。
比較典型的循環嵌套的例子就是通過for循環的嵌套列印九九乘法表,寫這個程序之前我們先分析一下:
1.九九乘法表由9行組成;
2.每行的列數有規律的遞增一列;
3.表達式是「X*Y=Z」
4.X和Y的值分別由內循環和外循環控制
代碼如下:
上面的程序為了控制列印篇幅變成了六六乘法表,實際把調整哪裡變成九九乘法表你應該能找到吧。
這段程序中的邏輯關係是這樣,每次外循環i取值後進入內循環,內循環j的最大值等於i,內循環全部結束後回到外循環i繼續取下一個值,直到最後。
程序中為了控制列印效果,在內循環結束前不需要換行,而print()默認是列印結束後換行的,也就是end默認值是「 」,設置為空則不換行,而每行結束後需要換行,所以有最後一行代碼,如果你試的話可以多試試不同的列印效果,也可以有個直觀的印象。
結果如下:
4.3.4循環控制continue
除了前面介紹的break用來提前結束循環,有時我們只需要在某個條件下跳過當次循環,循環繼續。Python中提供的continue語句的作用就是:當循環遇到continue時,程序終止當前循環,並忽略continue之後的所有語句,然後回到循環頂端繼續下一次循環。一定要注意continue和break的區別,break是終止整個循環,continue只是忽略當次循環的剩餘語句,continue。
現在我想列印所有500以內可以被36整除的整數:
結果如下:
這段程序你也可以改成不用continue試一下,你會發現正好是相反的思路。
如果教程對你有幫助,請轉發給更多人
《瘋狂的Python》
同名視頻課程在網易雲課堂發布
購買《指南版》或《全能的Python》
更可以獲得老司機肉身答疑服務
※Python數據科學超強陣容書單
※Python之re模塊方法詳解
TAG:Python |