2020年10月2日星期五

006 趣學Python程式設計 第1部分 學習程式設計 第6章 迴圈

 申明本站飛宇網 https://feiyetopro.blogspot.com/自網路收集整理之書籍文章影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]謝謝!



6章 迴圈

沒有什麼比不停地重複做同一件事情更糟糕的了。這就是為什麼人們在失眠的時候會數綿羊,不過這個道理其實並不是因為羊這種動物會讓人昏昏欲睡。這是因為不停地重複做一件事很無聊,當你沒有關注於某些有趣的事情時,你的大腦更容易入睡。

程式師們同樣也不喜歡重複地做事情,除非他們想馬上睡著。謝天謝地,大多數程式設計語言都有一種叫for迴圈的東西,它可以自動地重複其他的程式語句和語句塊代碼等。


在這一章中,我們會學習for迴圈,以及Python所提供的另一種迴圈:while迴圈。

6.1 使用for迴圈

Python裡,要列印五次hello,你可以這樣做:


可是這樣太囉嗦。其實你可以用for迴圈來減少需要輸入的字數和重複工作。就像這樣:


處的range函數用來創建一個數位的清單,它的範圍是從起始數位開始到結束數位之前。這聽起來可能有點令人困惑。讓我們把range函數和list函數結合起來看看它到底是怎麼工作的。range函數並不是真的創建了一個數字的清單,它返回的是一個反覆運算器,那是一種Python中專門用來與迴圈一起工作的物件。然而,如果我們把rangelist結合起來,我們會得到一個數字的清單。


在這個for迴圈的例子中 處實際上是告訴Python做下面這些事情。

  • 0開始數,在數到5之前結束。
  • 對於其中每個數都把每個數位的值存放到變數x中。

然後Python會執行代碼塊 。注意在這一行前面和第 行比起來多了四個空格。IDLE應該會自動幫你縮進。

當我們在第二行的後面按下回車鍵時,Python“hello”列印了五次。

我們也可以在print語句中用x來計算hello的個數:


如果我們再把for迴圈拿掉,代碼可能看上去就像這樣:



因此使用迴圈事實上幫我們少寫了8行額外的代碼。好的程式師不願意重複做同一件事情,因此for迴圈是程式設計語言中最常用的語句之一。

你不用非得在for迴圈中使用range或者list函數。你也可以使用一個已經創建好的列表,比如第3章中用到的採購清單,如下:


這段代碼就是說:對於wizard_list中的每個元素,把它的值放到變數i裡,然後列印出這個變數的內容。同樣,如果我們把for迴圈拿掉,我們就不得不這麼做:




所以這次迴圈又幫我們少打了很多字。

讓我們再建立一個迴圈。把下面的代碼輸入到Shell程式裡。它應該會自動幫你縮進代碼:

在第 行上,我們建立了一個清單,內容為 '巨大的''毛茸茸的''褲子'。在下麵一行 中,我們對清單中的元素進行迴圈,並把每個值都賦給變數i。在第 行和第 行中我們把變數中的內容列印了兩次。在後面的空行 按回車鍵來告訴Python這個語句塊結束了,然後代碼就會運行並把清單中的每個元素在 中列印兩次。


請記住如果你輸入的空格個數不對的話你將會得到一個錯誤資訊。如果你在上面的代碼的第 行多輸入一個空格,Python會顯示一個縮進錯誤給你:


正如你在第5章中所學到的,Python期望一個語句塊前的空格數是一致的。不論你插入多少個空格,只要對每一行都用同樣的數量就行(當然這還會讓代碼更易讀)。

下面是一段更複雜一點的for迴圈的例子,它有兩個語句塊:


這些語句塊在哪裡?第一個語句塊在第一個for迴圈中:


第二個語句塊是在第二個for迴圈中的那一行print語句:


你能搞明白這一小段代碼要做什麼嗎?

在第 行先創建了一個叫hugehairypants的列表,可以看得出在下面的兩行裡會按這個清單中的元素迴圈並列印。然而,在第 行會再次對這個列表進行迴圈,這次把值賦給變數j,然後在第 行再次把每個元素列印出來。代碼  仍是for迴圈的一部分,也就是說for迴圈在遍歷清單時每次都會執行它們。

因此,當這段代碼運行時,我們會看到巨大的後面跟著巨大的毛茸茸的褲子,然後是毛茸茸的,後面跟著巨大的毛茸茸的褲子,等等。

把代碼輸入到Python Shell程式中自己看看結果吧:


Python進入第一個迴圈並在 處列印出清單中的一個元素。接下來,它進入第二個迴圈並在 處列印出清單中的所有元素。然後它繼續執行print(i)命令,列印清單中的下一個元素,然後再用print(j)列印整個列表。在輸出中,標記了

 的行是由print(i)語句列印的。沒有標記的行是由print(j)列印的。

與其列印這些胡言亂語,不如做些更有意義的事情。還記得在第2章裡我們做的那個算式嗎?就是如果你用爺爺的瘋狂發明複製金幣的話,在一年後你將擁有多少金幣的那個算式。它看起來是這個樣子的:


它表示發現的20枚金幣,再加上10個魔法金幣,再乘以一年的365天,減去每週被烏鴉偷走的3枚金幣。


說不定你需要看到這堆金幣的每週是如何增長的。我們可以使用另一個for迴圈。但首先,我們需要改變變數magic_coins變數的值,讓它表示每週產生魔法金幣的總個數。那就是每天10個魔幣乘以一周的7天,所以magic_coins應該是70


我們可以看到,每週的財富增長是通過創建另一個叫作coins的變數,並使用一個迴圈:


在第 行,變數coins先裝入變數found_coins(發現的金幣)的值,這是我們起始的數字。在第 行建立for迴圈,它執行  組成的語句塊。每次迴圈,變數week(周)都會裝入從152中的一個數字。

 行有點複雜。簡單地說,每週我們要加上魔法創造的金幣個數並減去烏鴉偷走的個數。把變數coins想像成是一個裝寶貝的箱子。每一周,新的金幣都會被裝入箱子裡。所以這一行實際上的意思是:把變數coins的內容替換成當前的金幣數加上這周新造出來的數量。基本上,等於符號(=)相當於是一個發號施令的代碼,它命令先計算出右邊的某個結果,然後用左邊的名字保存這個結果供以後使用。

在第行的print語句使用了預留位置,它在螢幕上列印出周數和到目前為止的總金幣數。(如果你看不明白,請參見前面的在字串裡嵌入值。)所以,如果你運行這個程式,你會看到如圖6-1所示的結果。


6-1 程式運行結果

6.2 還有一種叫while的迴圈

for迴圈不是Python裡唯一的迴圈方式。還有while迴圈。for迴圈是針對指定長度的迴圈,而while迴圈則用於你事先不知道何時停止迴圈的情況。

想像一個樓梯有20個臺階。樓梯在室內,並且你知道爬20個臺階很容易。這就像是一個for迴圈。


接下來想像一個山坡上的樓梯。山非常高,你可能沒爬到山頂就沒力氣了,也可能天氣會突然變壞使你必須停下來。這就像是一個while迴圈。


如果你輸入並運行這段代碼,你會看到一個錯誤資訊。為什麼?這個錯誤是因為我們還沒有建立變數tired(累了)和badweather(壞天氣)。儘管這些代碼不足以真的運行起來,但它還是能給我們當作一個基本的while迴圈的例子。


我們一開始先創建一個叫step(步子,臺階)的變數。接下來,我們創建一個while迴圈,檢查變數step的值是不是小於10 000step <10 000),那就是從山腳到山頂的總臺階數。只要臺階數小於10 000Python就會執行其他的代碼。

我們通過print(step)列印變數的內容,然後用if tired == True:來檢查變數tired的值是否為真。(真,或者叫True,是一個布林值。我們將在第8章中學習)如果是真,我們用關鍵字break(打斷)來退出迴圈。關鍵字break用來立刻從迴圈中跳出來(或者說讓迴圈停下來),它對於for迴圈和while迴圈也同樣適用。在這裡它的作用是跳出語句塊並跳過step = step + 1那一行。

語句elif badweather == True:檢查變數badweather是否被設為真。如果是的,則用break關鍵字來退出迴圈。如果tiredbadweather都不為真,那麼我們用step = step + 1的方式把變數step1,然後繼續迴圈。

那麼while迴圈有以下幾個步驟。

1.檢查條件。

2.執行語句塊中的代碼。

3.重複。

更常見的情況是while迴圈由幾個條件組成,而不只是一個,例如:


這裡,在第 行我們創建了變數x,它的值是45,在第 行創建了變數y,它的值是80。在第 行的迴圈檢查兩個條件:x是否小於50以及y是否小於100。當兩個條件都為真時,接下來的幾行就會被執行,把兩個變數都加1並把它們列印出來。下面是這段代碼的輸出:


你能弄明白它是如何工作的嗎?

對於變數x我們從45開始計數,對於變數y80開始計數,然後它們每次迴圈的執行時都增加(每個變數加1)。只要x小於50並且y小於100迴圈就會執行。在迴圈了五次後(其間每次每個變數都會加1),x的值達到了50。現在,第一個條件(x < 50)不再為真,所以Python知道是時候停止迴圈了。

while迴圈的另一個作用是創建半永久的迴圈。這種迴圈可能會永遠執行下去,但實際上它會繼續直到代碼中有什麼事發生,然後從裡面跳出來。下面是一個例子:


這裡對於while迴圈的條件就是True,它會永遠為真,因此語句塊中的代碼總會被執行(所以這是一個永遠的迴圈)。只有當變數some_value為真時Python才會從迴圈中跳出來。在randint來挑選一個亂數裡你能看到一個更好的例子,但看這個例子之前你需要先看完第7章。

6.3 你學到了什麼

在這一章裡,我們用迴圈來執行重複的任務,這樣就不用做重複的勞動了。我們在迴圈裡面的代碼塊中告訴Python我們希望重複執行什麼任務。我們使用了兩種迴圈:for迴圈和while迴圈,它們很相似但使用方法不同。我們還使用了關鍵字break來停止迴圈,或者說跳出迴圈。

6.4 程式設計小測驗

下面是一些關於迴圈的例子,你可以自己試一試。答案可以在網站http://python-for-kids.com/ 上找到。

#1Hello迴圈

你認為下面這段代碼會做什麼?首先猜猜會發生什麼,然後在Python裡執行一下這段代碼來看看你猜的對不對。


#2
:偶數

創建一個迴圈來列印偶數,直到你的年齡為止。如果你的年紀是個奇數的話,就列印奇數直到你的年齡為止。例如,結果可能是這樣的:


#3
:我最喜愛的五種食材

創建一個列表,它包含五種不同的製作三明治的材料,比如:


現在創建一個迴圈來列印這個清單(包括數字):


#4
:你在月球上的體重

如果你現在正站在月球上,你的體重將只相當於在地球上的16.5%。你可以通過把你在地球上的體重乘以0.165來計算。

如果在接下來的15年裡,你每年增長一公斤,那麼在直到15年後的你每年裡訪問月球時的體重都是多少?用for迴圈寫一個程式,來列印出你每年在月球上的體重。

 

0 留言:

發佈留言