[DA series - Learn Python with Steem #04] 迴圈

in da-learnpythonwithsteem •  6 years ago  (edited)

[DA series - Learn Python with Steem] 是DA(@deanliu & @antonsteemit)關於「從Python程式語言實做Steem區塊鏈的入門」的系列,歡迎趕緊入列學習!

前情提要:[DA series - Learn Python with Steem #03] 邏輯判斷

第#04堂課,今天我們來學習另一個也是非常重要的主題:迴圈

Python的迴圈 (Loop)

前一期說完了if-else判斷式,這一期來看看另一個重要的元素:迴圈。
迴圈簡單的說,就是讓電腦「重複執行某一動作」的語法。原因很簡單,我們使用電腦程式就是為了解決繁瑣的工作內容,而這種重複性很高的動作,我們可以透過迴圈的設定讓我們一個程式就執行完所有內容。舉個簡單的例子,若是我們未來要觀察區塊鏈上的內容,可以透過迴圈的方式不斷搜尋不同的block,不斷的回去翻找歷史直到第一個區塊為止。

迴圈又可以分為While迴圈For迴圈,其中只是是語法跟使用情境稍有不同,大部分的概念是一樣的。我們先來介紹While迴圈。

While Loop

While迴圈的使用情境是「面對我們不知道何時會中止的程式時」。可以用以下一個簡單的例子讓大家稍微看一下這個邏輯:

註:本篇教學的程式碼可以到GitHub觀看。

執行結果:

Stop!
2097152

While的執行邏輯是:每次執行while的範圍內的程式前,會先確認while後面的expression是否為True。如果是True的話就會執行內容,反之則跳過迴圈。這裡我們先使用一個布林變數continue_to_loop = True來當作「要不要繼續迴圈的指標」,稍後我們只要改變這個變數,迴圈就會中止。

if-else相同的是,被包含在while迴圈裡面要做的事情,我們一樣要使用縮排一層一層的包好,免得讓系統誤會。這裡我們一開始令 n = 1,在每次迴圈裡都把他乘以二,並且判斷這個新的n有沒有大於1312300。如果有的話,我們就把continue_to_loop這個變數設為False,藉此中止程式。

所以等程式不知道經過多少次迴圈後,2的某個次方數變成2097152,也就大於一開始設定的m了,迴圈因此中止,並且最後印出n:這時已經是 2097152。

這種先設計一個布林變數來看要不要停止迴圈的手法,通常這個變數會被稱為flag,因為它的True or False決定了迴圈的命運。這種手法在很多情況下很好用,也會讓程式的運作邏輯很淺顯易懂。不過其實我們這一個例題是不需要用到Flag的,如果只是單純的數字比較的話,我們可以做一些簡化:

這樣是不是簡單很多呢?我們將我們希望每個迴圈繼續執行的條件:n < m放在while的後面,而while迴圈的設計正好就是「不斷執行直到不滿足 n < m」,也就是在n >= m時就會自動停止了。

For Loop

另一個迴圈是for迴圈,原本在程式語言中通常是用來執行「可以預期什麼時候結束的迴圈」。跟while loop不同的地方在於,我們一開始就會告訴程式我們要loop的範圍或是次數。舉一個最最簡單的例子,就是印出1~15的數字:

執行結果:

0
1
2
...
14

在 for 的語法 公式就是 for x in o:,代表著:「走過o裡面所有的x」。上面的這段程式有一個新的部份叫做range(),專門用來產生這種一串的東西讓for迴圈走過。所以range(15)就會產生0,1,2,3,4,....,14 (從0開始直到大於等於15停止)(在預設情況下,只輸入一個數字n就是從零開始走到n,不含n)。如果我們想要指定從1開始走走到15,就可以寫成range(1,16)。

不過python好用的地方在於,我們往往不需要知道一個「O」裡面有多少個「x」,就可以直接很懶的使用for迴圈了。python的for迴圈很聰明,會自動幫我們想像「我們應該是要重複拿出裡面的某些東西」。

例如下列程式中,我們先把東西存在一個陣列(array)(後面我們會教更多關於陣列等等資料結構)裡面,然後就可以透過for迴圈「一個一個讀出來」。

執行結果:

apple is in your shopping list
orange is in your shopping list
lemon is in your shopping list
Xiaomi 6 Plus is in your shopping list
iPhoneX is in your shopping list

這段程式當中,我們先把shopping_list定義好,把一堆的字串存在這個陣列裡。接著我們利用for item in shopping_list的語法,來走遍每一個item。

python聰明的地方是,我們可以直接叫for loop跑完整個清單,每次回傳一個東西,並且這個回傳的東西叫做item。我們前面完全沒有告訴過python說過item是什麼,這一句 for item in shopping_list就好像:「遍歷shopping_list裡面的東西,每次拿出一個,稱為item」。所以在這個迴圈中,第一次 item = apple,第二次 item = orange ,以此類推。

不過這裡的print()裡面我們多了一個函式,稱為format(),是今天要教大家第二個好用的小技巧。format()是字串的一個class method (類別函式),也就是只有字串能夠用。我們可以用這樣的語法在字串中加入我們要的變數

 'The value of variable a is {}'.format(a)

意思就是把a的值,以字串的形式放入前面那一串子裡面的{}中。

所以上一段例子裡,每次我們會印出 ' {} is in your shopping list ',其中{}就會變成每次的item,也就是物品名子。這樣是不是在設計output的時候有比較方便阿!

Homework time:練習題!

好了,今天簡單的for, while介紹就到此為止了,也來給大家出一個練習題,同時也是程式設計裡面的經典:九九乘法表問題:請用迴圈在螢幕上列出99乘法表。提示:要使用雙重迴圈,也就是Loop in a Loop。

不過要完成這個作業,大家可能還需要一點新技能,就是關於print()函數的多一點認識。print()在沒有任何設定的情況下,會印出你輸入的內容並且換行。在印九九乘法表的時候,我們並不是每次印出數字就要換行,因此會需要使用print 函數裡面的end設定來變更這個預設的字莫換行
print(number, end = ' '),會在螢幕上印出number的值,並且不換行,而是在後面加上' '
如果想要印出
縮排**,也就是一個整齊的空格的話,可以設定end = '\t',如下:

print(number, end = '\t')

(在程式語法裡,通常使用\t來表示縮排(tab),而用\n表示換行)

接著就祝大家好運了,我們下回見~

寫完的朋友們,也歡迎來GitHub@antoncoding對對答案呀!不過這不是唯一的解法喔~

我們下篇文章再見囉~下課!

class-377117_1280.jpg
image - pixabay

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  
  ·  6 years ago 

恭喜你!您的这篇文章入选 @justyy 今日 (2018-08-01) 榜单 【优秀被错过的文章】, 回复本条评论24小时内领赏,点赞本评论将支持 @dailychina 并增加将来您的奖赏。

Congratulations! This post has been selected by @justyy as today's (2018-08-01) 【Good Posts You May Miss】, Steem On! Reply to this message in 24 hours to get rewards. Upvote this comment to support the @dailychina and increase your future rewards! ^_^

呵呵,被錯過?不敢這麼說....

  ·  6 years ago 

感谢刘前辈,明天开始去掉 “被错过”

image.png
发现好像python的很多符号和C很像,所以我试了下x++之类的,发现不认,哈哈哈~只能用x+=1这样的,真的没有x++这样的运算方法吗?

沒、沒有...
不知道Python為什麼要捨棄這樣的設計,做等其他大神來回答xD

看来这个问题知道的人不多呀,连老师都不知道~

OK 交作业

图片.png

作業是不是太簡單啦xD

不简单哦,基本功练扎实,很重要。

04-loop.png

這位大學生怎麼一直來交小學的課堂作業啊~~^_^

嗚...老師不要趕我走

不趕不趕,但你身高太高了,坐後面一點好嗎?不要擋到其他小朋友上課喔~~

遲交了的功課,那個Print 的空格怪怪的,有錯嗎?
hw4.png

看了上面的大學同學知道不用放end,就這樣print('\n')可以了😅😅

This is how I'll do:

for i in range (1,10):
line=''
for j in range (1,10):
line=line+str(i*j)+'\t'
print(line)

Results:

1   2   3   4   5   6   7   8   9   
2   4   6   8   10  12  14  16  18  
3   6   9   12  15  18  21  24  27  
4   8   12  16  20  24  28  32  36  
5   10  15  20  25  30  35  40  45  
6   12  18  24  30  36  42  48  54  
7   14  21  28  35  42  49  56  63  
8   16  24  32  40  48  56  64  72  
9   18  27  36  45  54  63  72  81