Blog8

基本觀念之6~函式與遞迴

1-6:函式與遞迴 Function這個英文字,我們原本是使用「函數」這個中譯,但因為它在程式裡面,除了數據的計算外,還會處理資料的存取,或者是格式的轉換等,所以更常使用「函式」這個名詞。 函式通常是在程式碼開頭先做定義,隨後在主程式中呼叫它。它就像是一個忠實的僕人,隨叫隨到、使命必達,但又有點懶,事情做完一次就休息,除非你又給它第二次指令。 主程式在呼叫它的時候,得傳遞明確的訊息,它可憑此訊息進行一系列的後續處理,之後再將結果傳回主程式。 上圖中,第1行的關鍵字def,是用來定義一個函式名稱叫做singer,後面小括弧裡面的 a, b,稱為參數(parameter),要承接主程式傳過來的引數(argument),再放進第2、3行縮排的指令中處理。 第5行進入主程式中,呼叫singer函式,小括弧當中的 “Taylor” , “Leonardo”,就是引數。參數和引數的關係,就好像是變數名稱和變數值的關係,a=”Taylor”,b=”Leonardo”。 第7行到第10行,是將程式執行後輸出結果,用註解行標示出來,方便讀者閱讀。 函式裡面,要將運算結果回傳給主程式,有一個指令return很是重要。我們把先前for迴圈的加總計算,定義成函式forloop,其參數為n,它會回傳從1累加到n的總和給主程式。 上圖第7行,在主程式中呼叫forloop,並傳遞引數100給參數 n;它會從forloop函式中,利用return指令將運算結果5050回傳,指定給變數getsumm,然後再將其輸出。 return這個指令,如果能善用它,就可以建立起功能進階的遞廻函式。 所謂遞廻函式,就是函式之中的程式碼被執行的時候,又會再次呼叫函式它自己,但使用的是不同的引數。正整數階乘的計算,是個遞迴運算的典型範例。 上圖第1行定義函式fact(n),程式執行到第5行時會回傳函式本身,其參數值為n-1,外面再乘上n,這時候得到的fact(n-1),會再回傳 (n-1)*fact(n-2),而fact(n-2)又再回傳 (n-2)*fact(n-3),如此反覆呼叫fact,直到fact(1)為止,這時候已滿足第2行條件,回傳值就只有1了。執行第7行之完整遞迴過程如第11~16行所示。 先前提到的增強式學習當中,可以看到遞迴的身影。在循環修正行動值函數的時候,是援用自下一狀態的獎勵及其行動值函數,並據此援用下下次狀態,以至於最終的狀態…..。 遞廻程式的技巧,據說是在19世紀由艾達女仕所提出的,為表彰她對計算機演算法的貢獻,美國國防部開發的程式語言Ada,就是以她來命名。艾達有個大名鼎鼎的父親,英國詩人拜倫。 我們有關Python程式設計基本概念的部份,先在這裡告一段落,日後會不定期撰寫這方面的進階題材。接下來,我們將進入到「英語檢定」單元,介紹多益測驗的學習要領,歡迎有興趣的朋友繼續閱讀本社團貼文。

基本觀念之6~函式與遞迴 Read More »

基本觀念之5~巢狀結構與輸出格式

1-5:巢狀結構與輸出格式 如果有兩個以上迴圈包含在一起,其中內部迴圈縮排,從屬於外部迴圈,則稱此種迴圈為巢狀結構。很多情況會用到此種結構,例如一張圖片中像素值的處理,就要用到一個二維串列,再搭配上巢狀迴圈。另外,如果在選擇敘述 if 式子裡面,還有其它縮排的 if 敘述,也可稱為巢狀結構。 在這裡,我們使用大家都知道的九九乘法表,來舉例說明巢狀迴圈的特點,並且結合數據字串輸出設定,讓乘法表能夠格式化整齊排列。 巢狀結構,外層迴圈變數每變化一個值,內層迴圈變數值就要全部變化一次,所以可以戲稱:「外圈慢慢走,內圈跑斷腿。」。 上圖中,第1行的外層迴圈變數 i ,當其取出值為1或2或3或其他,內層迴圈變數 j 就要從1到9全部變化一次。所以外層迴圈變數 i 總共從1到9只跑一遍,但內層迴圈變數 j 從1到9跑了九遍。請讀者思考第3、4行兩個print( )的縮排位置不同之原因。 第3行print(f”{ j }*{ i }={ i*j:2d }”,end=” “)的小括弧中,後面的end=” “,表示每次輸出後會空一格再接續下次輸出,比較重要的,是前面 f”{ j }*{ i }={ i*j:2d }” 的部份。 左右兩個雙引號 “…..” 表示,當中的…..被視為輸出字串,但 f”…..” 又再特別表示,其內的成對大括弧 { i }、{ j }, 是要將 i、j 所代表的變數值取出,f”…..” 的f代表格式化(format)的意思。 甚至{ i*j : 2d}還更進一步要求,i*j 的變數值輸出,必須合乎 2d 的格式,要預留兩個字元空位給預設靠右對齊的整數,所以乘法表中等號右邊的值,其個位數才能夠垂直對齊。2d的d,原文是decimal,表十進位的整數。 在上圖第1行中的7d,表預留7個字元空位給整數123輸出,123靠右對齊後,左邊會留下4個空格。第2行的7.2f,表預留7個字元空位給浮點數123.456輸出,而且小數點第2位以下四捨五入。第3行的7s,表預留7個字元空位給字串 ‘apple’ 輸出,字串預設是靠左對齊,所以會在右邊留下2個空格。

基本觀念之5~巢狀結構與輸出格式 Read More »

基本觀念之4~串列與迴圈

1-4:串列與迴圈 我們前面曾提到過,變數包括有變數名稱和變數值兩部份,其中的變數值除了單一數據外,也可以指定為多個數據,例如一個班上的數學成績可能有幾十筆,都屬於同一個變數。這種情況,在平日生活中,常有機會碰到,所以多個數據的資料表示方式,及其運算處理技巧,在Python裡面是相當重要的。 在這裡,我們先熟悉一種資料型態叫做串列(list),它是好幾個數據被中括弧包含起來,彼此間用逗號分開,比如像變數 lista = [11, 22, 33, 44],其中括弧內的每個數據可稱之為元素(element)。 這種資料型態也叫做容器(container),非常適合使用for迴圈來處理運算,因為它的資料整齊排列,被限制在一定範圍內,讓人很直覺的看出來,每個數據可以依序被迴圈取出。所以要輸出所有數據,或者加總其數據,都可以援用上一次的做法。 上圖中,第2行和第7行,for迴圈中的 i,現在是 in 在lista裡面了,可想而知,就是隨著不同次的迴圈,依序把11、22、33、44分別指定給變數 i ,然後把它的值印出來或加總。 這種 in 在某個容器內,然後隨著迴圈將元素一一取出的方法,非常直覺,但很好用,也有一些變化的型式。 在上面的程式執行過程當中,我們不得不將所有元素一口氣處理完畢,但如果要個別取出某個元素,就要用到索引的技巧了。 上述的11、22、33、44,它們在lista裡面的索引值,分別是0、1、2、3,可以利用中括弧加索引值將lista編號,個別取出裡面的元素。當然也可利用迴圈變數當作編號,一一將元素值取出,如下圖所示。 在第2行最右邊,我們使用反斜線””來強迫換行,讓太長的程式碼變得比較好閱讀。讀者可以自行print(lista)看看,觀察其和第3行輸出的異同處,並想辦法解釋其差異。 第5和第6行當中的迴圈變數 i,在這裡,不再直接取用來輸出,而是將它當作串列的索引值,把每個元素都編號後,再做輸出。讀者也可以用這種方法,將元素值加總看看。索引加迴圈,是初學者開始會感到挫折的地方,動手多練習,是克服困難的唯一良方。 容器(container) 有多個種類,中括弧裡面的數據如果用空格代替逗號,就是陣列(array);大括弧裡面數據用逗號分開的稱為集合(set),如果數據是成對的則稱為字典(dictionary);小括弧裡面數據用逗號分開的,稱為元組(tuple)。 元組(tuple)這個字中英文看起來都有點彆扭,不容易顧名思義,剛開始都會聯想到元祖雪餅。它其實只是一組相關的數據被整理在一起,目的在便於閱讀及取用其訊息,而非將數據做運算處理。例如記錄陣列的維度、函式的多個回傳值等。

基本觀念之4~串列與迴圈 Read More »

基本觀念之3~for迴圈

1-3:for迴圈 迴圈,會重複執行相同的程式碼來進行工作,執行次數可以一開始就做設定,每次在重複相同指令時,其迴圈變數都會增減一個固定數量,一直到條件滿足為止。我們先用for迴圈來舉例說明。 在這個練習中,我們在print( )括弧中加上一些參數和字元,來設定它的輸出格式。如果加上end=” , “參數,表示每次輸出不要自動換行,只在後面加逗號,下次輸出會在逗號後面接續下去。 print( )中加”n”字元,表示自動換行一行,加三個”n”字元,表示自動換行三行。適當做這樣的設定,會讓程式輸出結果比較好閱讀。 第2行for的敘述,表示對 i 這個迴圈變數而言,它是在range(6)範圍之中從0到5的整數。每執行完一次第3行縮排的print(i,end=”,” )指令,就是跑1次迴圈,總共要跑6次迴圈,這6次依序先把0、1、2、3、4、5分別指定給變數 i ,然後把它的值印出來。 第6行for敘述的範圍,變成range(1,6),就是從1到5的整數1、2、3、4、5。 第10行for敘述的範圍,變成range(1,6,2),就是從1到5每差2取一個整數,得到1、3、5。 for迴圈最普遍的用途,就是累加一系列相關的數據。日常所見最簡單的累加像1加到5,這數據少到甚至可以直接print(1+2+3+4+5),但如果從1累加到100甚至1000,這樣就行不通了。我們先看看下圖第14行到第20行,這是累加計算的程式碼,看起來好像更麻煩。 但我們注意到從第15到19行,它們有些動作是重複的。它們都是從變數summ裡面先把舊值取出來,加上一個新的數據後,存到summ裡面去,下次再取用,而每次加上的新數據,都比前一次的數據大 1 。 這就可以用第23、24行的for迴圈來代替了。因為新加的數據每次都比前一次大 1 ,我們就可以用 i 迴圈變數來代替這些新數據,它是範圍在range(1,6)的5個整數,依序被取出。每次summ的舊累加值加上新數據後,將這新的累加值存進summ裡面,再進行下一次迴圈。 上面第25行程式碼,試著將它縮排4個空格後再執行,看看結果有甚麼不同,並想辦法解釋原因。 程式碼中的range(1,6),如果改成range(1,101),就會讓我們聯想到德國數學家高斯的故事了,只不過他小時候是用肉眼找對稱再相乘,現在電腦裡面的運算大多是快速計算加法所得。 圖1-3-3:高斯和他弟子黎曼所在的哥廷根大學,是歐洲數學重鎮。當時流傳一句話:「想學好你的數學嗎?打起你的背包,到哥廷根去。」

基本觀念之3~for迴圈 Read More »

基本觀念之2~條件敘述

1-2:條件敘述 條件敘述的語法很簡單,就是if(假如)….else(否則),其精神也很好掌握,假如條件成立,就做某些事,否則就做其他的事(或者甚麼事也不做)。很容易用日常生活所見,舉例來說明它的適用情況。 例如有一所M理工學院名聞遐邇,它的入學標準非常嚴格,假如PR>=95才會通知接受(accept),否則一律通知拒絕(reject),這就可以寫成下列程式碼: 上面程式碼第3行,在 if PR>=95的敘述中,條件PR>=95是需要做判斷的,可因為第2行已經設定PR=98,滿足了這個條件,所以判斷為真(True),會直接執行下面第4行print(“accept”)。 但到了第8行,PR改成88,做PR>=95判斷的結果為假(False),所以會執行第11行else下面的print(“reject”)。 要注意在程式碼冒號(:)後面按下Enter鍵時,系統會自動在下一行做縮排(indent),有縮排的程式碼是從屬於沒有縮排的上一行。程式碼上下之間,如果有從屬階層關係就會有縮排,初學者沒有理解這點,即使打字沒有打錯,也會產生編譯執行錯誤。 圖1-2-1:AMD執行長蘇丰姿曾質疑:「沒道理麻省電機博士,要在哈佛企管碩士下面做事。」  上面的程式碼,可以將else及從屬於它的部份省略,只單獨使用if的部份,用以表示這個條件敘述,只在乎判斷為真的時候該做些甚麼,判斷為假的時候,它甚麼事都不做。從另一個角度來看,也就是容許把功能再擴充,讓條件敘述並不僅僅只能做二元判斷,還可以有多重的選擇。 例如另一所鄰近的H大學,學術聲譽並不弱於M理工學院,但其選才標準比較多元,認為課外活動的表現也不容忽視,所以PR值的設定較為寬鬆。PR>=95是一定會接受的,但在85和95之間的學生,它會給予考慮,當然,PR<85它也會拒絕了,程式碼就可以改成下列內容: 我們在上圖第5行,插入了elif指令,它其實是else+if的綜合體,else的部份表示不滿足前面的條件PR>=95,也就是得到PR<95;if的部份表示,在這種情況下(PR<95),再給它設定條件PR>=85。所以這個elif指令得到的整合條件,就是85<=PR<95。 第7行的else,表示在不滿足前面所有條件的情況下,只剩下PR<85的條件了。 因為第2行設定PR=88,所以這個程式會執行第5行elif下面第6行縮排的指令,輸出”consider”。 在條件有好幾項且彼此互斥的情況下,elif可以多次使用。例如學生成績的分等第,就可以善用elif的功能。

基本觀念之2~條件敘述 Read More »

基本觀念之1~變數與資料型態

1-1:變數與資料型態 Python的變數,和國中時候學過的未知數X、Y、Z,有些類似,但又差異甚大。未知數的值從頭到尾都是固定的,計算過程只是在求解唯一的答案;但變數(variable)的值卻是可改變的,從程式一開始、到程式中段、到程式結尾,都可以因為運算處理,而改變其所代表的值。 所以一個變數有兩個含意,一個是變數名稱,另一個是變數值。例如num=100,表示其變數名稱為num,而其變數值為100,等號”=”在這裡,有指定、賦予變數值的意思。 我們可以用一個箱子表面貼的標籤來表示變數名稱,放進箱子裡面的資料為變數值。變數名稱是維持固定的,但放進箱子的變數值,卻可隨程式的執行而改變,如下圖所示: 我們將上面num=200的例子再延伸。在代數式的運算中,x=x+100是不合理的,因為等號左右的x消掉後,會得到0=100;但在程式設計中,類似num=num+100的運算,卻常常會出現。 因為在等號(=)右邊的num,代表變數值200,它和100相加得到300,然後再把300指定給左邊自己的變數名稱num,從而取代了舊值200。 這個過程,我們用程式碼和示意圖來表示: 我們還記得變數有兩個含意,在此謹記著,出現在等號左手邊的,代表變數名稱;出現在等號右手邊的,代表變數值。 變數的名稱,和往後會介紹的函式名稱、類別名稱,都稱為識別字(identifier),顧名思義,就是一看到名稱,大概就能猜測到它被賦予的資料性質。例如name代表姓名(字串,str),age代表年紀(整數,int),average代表平均值(浮點數,float)。所以在變數命名上,應該使用有意義的英文名稱。 除此之外,還有一些命名的規則要遵循。例如,名稱的字首,最好用小寫或大寫的英文字母,不可以是數字,如5name;不可使用程式或系統的指令(關鍵字/保留字),例如像print,if、else,class等。 如果需要使用到兩個以上英文字來命名,字間用底線隔開不要有空格,例如bool_for_comparison=100>200,代表bool(布林)資料型態的變數值,是來自比較運算100>200後的結果,執行print(bool_for_comparison),會得到布林資料型態中的False值。

基本觀念之1~變數與資料型態 Read More »

基本觀念

第一章:基本觀念 工欲善其事必先利其器,想學好Python的第一步,當然就是要趕快把軟體準備好。對初學者而言,最好先熟悉Anaconda整合環境之後,再進入Google雲端硬碟,免費運用其Colab限量GPU。 Anaconda是以Spyder編輯頁面為開發環境,內建有常用的套件模組,供編譯執行Python時匯入連結之用。它有多種版本可選擇,學員可從下列藍色字體的網站,點選下載檔案較小且穩定的版本,在此推薦Anaconda3-2023.07-1-Windows-x86_64.exe,將其存至桌機或筆電的資料夾: https://repo.anaconda.com/archive/ 請用滑鼠左鍵雙擊下載的執行檔進行安裝,過程中大部份只要下一步、下一步(next)就可以。完成後從開始功能表展開Anaconda3資料夾,可以看到Spyder的蜘蛛網圖示,點選開啟它,過程中看到的無作用小視窗一律關掉,最後可以看到下列編輯環境: 預設的版面,左半部是程式編輯欄位(Editor);右半部的下方是執行輸出欄位(IPython Console),其上方是多個視窗疊在一起,我習慣將其上方所有視窗都關掉(Close),讓執行輸出視窗佔滿右半部欄位。 接著點選工具列的板手圖示(偏好設定,Preference),進去修改字型大小,然後開始第一個程式。以下為視訊影片教學導引: https://mobile-learning-testing.com/wp-content/uploads/2024/09/Python-0.mp4 不能免俗,我們也是要輸入輸出”Hello World!”。 在左半部程式編輯欄位,預留有註解行,包括單行註解和多行註解。前者是#字號後面的灰色字體,後者是成對的三個雙引號當中的綠色字體。可將其全部刪掉,不妨害程式碼的執行。 我們用「print(“Hello World!”)」輸入第一條指令,也可以輸入print(123),或print(123.456),或print(123.456+456.789)。 執行全部程式碼的按鈕,是在工具列中方向朝右的綠色小三角形;執行部份選取程式碼的按鈕,是工具列中有”工”字型加下方綠色小三角形的圖示。 坐而言不如起而行,Action speaks louder than words!趕緊將軟體下載、安裝、啟動,跑一下最簡單的程式,踏出最基本的第一步。

基本觀念 Read More »

Shopping Cart