• 沒有找到結果。

Python程式設計資訊科技

N/A
N/A
Protected

Academic year: 2021

Share "Python程式設計資訊科技"

Copied!
60
0
0

加載中.... (立即查看全文)

全文

(1)

陳致中— 編著

[程式設計]

(2)
(3)

B-1 程式語言簡介 B-3 B-1-1 Python的特點 B-4 B-1-2 建置Python 開發環境 B-4 B-1-3 Spyder編輯器環境介紹 B-7 B-1-4 線上免費編輯程式 repl.it B-9 B-2 Python程式語言基本概念 B-13 B-2-1 註解 B-13 B-2-2 變數 B-13 B-2-3 字串 B-14 B-2-4 數值 B-15 B-2-5 布林值 B-16 B-2-6 比較運算子 B-16 B-2-7 串列 B-17 B-3 Python 程式語言實作 B-19 B-3-1 基本輸出output指令 B-19 B-3-2 基本輸入intput指令 B-23 B-3-3 範圍range指令 B-25 B-3-4 迴圈指令 B-27 B-3-5 判斷(選擇)指令 B-38 B-3-6 內定函式與自定函式 B-46

程式設計

—— 

Python

(4)

程式設計

— Python

本章節次

B-1 程式語言簡介

(5)

B-1

程式語言簡介

世界各國人們都有自己專屬的語言做溝通,而電腦和人類之間也 存在不同的程式語言用來做溝通,你可以想像電腦就是一部機器,人 類只要給予正確的命令,它就會按照命令的指示去執行工作,然後再 將 結 果 輸 出, 而 這 些 命 令 的 組 合 就 是 所 謂 的 程 式 語 言(Programming Language),所以程式語言就是電腦與使用者之間的溝通橋樑。 坊間程式語言有許多種,其熱門程度往往也和產業趨勢畫上等號, 根據一份由電機電子工程學會發行的雜誌 IEEE Spectrum,統計 2018 年 度最受歡迎程式語言排行,熱門前三名分別是 Python、C++、Java,而 前十名排行如下圖所示。 圖 1 2018 年度最受歡迎程式語言排行(圖片來源:IEEE)

(6)

Python

的特點

B-1-1

琳琅滿目的程式語言,該如何選擇,針對初學者建議先從Python 學起,推薦的理 由有下面幾點: 1. 直譯式:透過直接編譯的方式,撰寫完的程式碼僅需按下執行按鈕,就可觀看結果, 無須理會中間編譯的過程,所謂編譯是指將高階語言轉換成機械語言的一些過程。

2. 跨平台:同時支援微軟 Windows、蘋果 macOS 以及 Linux 等主流作業系統平台,可移 植性相當高。

3. 免費且開放源碼:和Linux 都是屬於開放源碼,你可以自由的閱讀、複製、修改他人

程式碼,所以網路上有許多資源可以直接運用。

4. 應用範圍廣泛:例如大數據分析、網路、遊戲、伺服器、科學計算、人臉辨識、3D

繪圖等等,相關資源的運用非常多,幾乎各方面皆可使用Python,最有名的例子就是 Google 的搜尋系統,以及 YouTube 的視訊共享服務、BitTorrent 點對點檔案共享系統、 NSA 的加密和智能分析。

5. 物件導向:Python 程式語言同時也屬於物件導向程式語言(Object-Oriented Programming Language),具有封裝(Encapsulation)、繼承(Inheritance)與多型(Polymorphism) 三種特性。 6. 容易擴充和嵌入:負載量大的部分,用C 語言來寫,然後用 Python 來引用,就可以 加快速度,同時Python 可以嵌在其它程式裡面,這樣的特性讓 Python 非常有彈性。

建置 Python 開發環境

B-1-2

Python 可同時支援許多作業系統平台,本書以微軟 Windows10 為操作環境,首先 到 ANACONDA 官網下載 Anaconda 套件組,如圖 2 所示,進入之後先選擇作業系統版 本,接著網頁往下拉,本書範例是以 Python3.6 版本為主(2.x 與 3.x 有些指令並不相 容)。

(7)

1 2 3 圖 2 下載 Anaconda 套件組 那該選擇32 還是 64 位元版本呢?請在桌面點選「本機 」圖示,按右鍵選擇「內 容」即可查看作業系統版本,如圖 3,本書是下載 Anaconda3-5.0.B-Windows-x86_64. exe 檔案進行安裝。

(8)

Anaconda 安裝的步驟請依序按「Next → I Agree 我同意 → Next → Next → 勾選 第 1 個增加環境路徑變數選項 → Install 安裝 → 經過一段時間安裝 → Next → Finish 完 成」。

1 2

3 4

6 5

(9)

7 8 圖 4 Anaconda 安裝步驟 當 Anaconda 安 裝 後, 內 建 的 Spyder 編 輯 器, 是 用 來 編 輯 與 執 行 Python 程式的整合開發環境,具有語 法提示、程式除錯與自動縮排功能, 使 用 方 式 是 執 行「 → Anaconda3 (6B-bit) → Spyder」, 由 於 該 軟體開啟時間會較久,所以不要以為 當掉而重複點擊,啟用時若有較新版 本會自動出現提示,詢問是否更新, 如 右 圖, 若 不 想 以 後 再 被 打 擾, 請 先 取 消 勾 選「Check for updates on startup」,再按 OK 確認。

Spyder

編輯器環境介紹

B-1-3

Spyder 編輯器實際執行畫面如圖 6,主要包括五個區域,說明如下:

1. 下拉式選單區:例如按「File → New file…」可開啟新的檔案、「Run → Run」執行檔案。

2. 工具列區:最常用的工具有 開新檔案、 開啟舊檔案、 儲存目前檔案、

儲存所有檔案、 執行檔案。

(10)

4. 功能面板區:下方分別有「Variable explorer 變數瀏覽」、「File explorer 檔案瀏覽」、 「Help 幫助」頁籤做切換。 5. IPython console 主控台:當按下工具列 執行檔案,會在主控台顯示執行檔案的 結果,若是程式碼有錯誤,亦會在此區告知錯誤的位置與原因。 2. 工具列區 功能切換 程式執行區 檔案路徑 與名稱 1. 下拉式選單區 4. 功能面板區 3. 程式碼編輯區 檔案切換 5. 主控台 圖 6 Spyder 編輯器環境介紹 Spyder 編輯器中提供許多貼心的小服務,例如當要輸入 print 指令,但英文單字又不太熟,此時只要輸入部分字母並按 Tab 鍵, 會自動列出所有可用指令,然後利用↑、↓鍵選擇後,再按 Enter 鍵就完成輸入,如右圖所示。 接 著 當 輸 入「print(」 左 括 號 時, 右括號會自動產生,同時將該指令括號裡 面可用的參數均列出來,有些參數因為只

(11)

當程式碼撰寫完畢,按下上方工具列 圖示,目的是開始執行檔案,行號左側若 出現 圖示,代表程式碼內容有錯誤,在主控台雖然會顯示錯誤行號與原因,但不一 定是該行錯誤,有可能是之前錯誤造成,例如圖 7 第 12 行出現 Syntax Error 語法錯誤, 但原因卻是第11 行最後面的右括號不小心刪掉所造成。 錯誤圖示 圖 7 Spyder 編輯器錯誤提示

線上免費編輯程式 repl.it

B-1-4

若不想安裝上述 Anaconda 軟體,或覺得開啟 Spyder 編輯器太慢,亦可直接利用 https://repl.it 網站進行線上免費編輯程式,https:// 可以省略,並支援任何瀏覽器,其中 REPL 是「讀取(Read)→評估(Evaluate)→輸出(Print)→循環(Loop)」的簡稱, 對於學習一門新的程式語言有很大的幫助,因為不用安裝任何軟體,就能立刻做出回應。

(12)

1. 進入網站後,按下右上方「Log In 登入」按鈕,可以選擇利用 Google 帳戶直接登入。

1 :「Sign up」為註冊按鈕,因為可以使用 Google 帳戶登入,所以不一定要進行註冊。 2 :若不想註冊和登入,可以直接選擇「+new repl」,但僅能執行測試程式,無法進行儲存。

2. 若 為 第 一 次 登 入, 需 點 選「+new repl」 按 鈕, 並 選 擇 Python 語 言, 再 按「Create repl」建立。

(13)

3. 輸入檔案名稱(最多 60 個字 元),不用加附檔名.py,假 設輸入檔名test1,最後需再 按下「Enter」鍵。 4. 可 以 利 用 檔 案 名 稱 右 側 的 圖示重新命名,再按下 examples 範例參考,或直接 輸入程式碼,再按 執行 測試。 5. Examples 範例如下。

(14)

6. 操作介面如下。 撰寫程式碼 Python3 程式執行區 清除執行區畫面 執行 編輯檔案屬性 分享檔案 查看雲端的原始檔案列表 開啟新執行頁面網址(https://test1.chenlung.repl.run) 7. 亦可透過手機執行。

(15)

B-2

Python

程式語言基本概念

註解

B-2-1

註解可以幫助看懂程式碼,當程式碼越多,越需要加入相關註解,將來除錯才會比 較容易。註解分成單行與多行註解,「#」為單行註解符號,「"""」為多行註解符號, 在文字的頭尾都要單獨加上三個雙引號「"""」,多行註解適用於補充內容較多時。 # 必須在同一行,# 字後內容都是註解 """ 這個區域之內的內容都是註解 這個區域之內的內容都是註解 """

變數

B-2-2

要設定變數就使用「變數名稱 = 值」,等號是指定的意思,不用事先宣告,等號前 後是否加入空白字元均可正常執行,但對於初學者是建議前後都加空白字元,閱讀程式 碼時會較清楚,除錯時也較容易。變數第一次指定就是要設定初始值,沒先指定就直接 使用會出現錯誤。 age = 18 變數名稱 指定成 變數的值

18

age

變數像一個有標籤的盒子, 你能將資料放入盒子中,再 利用盒子上的標籤找到你的 資料 圖 8 變數的定義 變數的命名不能以數字開頭,只能以大寫或小寫的英文字母(有區別)或「底線 (_)」開頭,也不可以和關鍵字(指令)名稱相同,若不確定變數命名是否和指令名 稱相同,可在最前面加入「底線(_)」當開頭。

知識

知識

副檔名為「.py」,亦可使用 中文檔案名稱。

(16)

字串

B-2-3

Python 的字串可以前後利用「雙引號(")」或「單引號(')」包圍起來,關於字 串相關的運算如表 1 所示: 表 1 字串的相關運算 運算子 說明 例子 結果 1 + 加號,將左右字串連接在一起 a = '012' b = '345' c = a + b print(c) 012345 2 * 乘號,左邊必須為字串,右邊數字代表字 串要重複n次 a = '0123' b = a * 2 print(b) 01230123 3 in 如果左字串出現在右字串中則為真 a = '1' b = '123' print(a in b) True 4 not in 如 果 左 邊 字 串 沒 有 出 現 在 右 邊 字 串 中 則 為真 a = '1' b = '123' print(a not in b) False

5 len(a) 回傳字串的長度(Length) a = 'abcdefgh' print(len(a)) 8 6 str(a) 將物件轉換為一般字串(String)型態 a=123 b = str(a) + 'abc' print(b) 123abc

(17)

數值

B-2-4

整數(Integer)沒有位數限制,會自動調整,但若有小數點就稱為浮點數(Float), 而複數的表示形式為 3 + 4j。 數值運算子前後是否加空白字元均可,但適當加入空白字元可令程式碼的閱讀更方 便。 表 2 數值的相關運算 運算子 說明 例子 結果 1 ** 次方的意思,而且可用於浮 點數 a = 5 ** 2 print(a) 25 2 // 捨去小數點的除法,即取「商 數」,除以零時會發生錯誤 a = 5 // 2 print(a) 2 3 % 是取除法的「餘數」 a = 5 % 2 print(a) 1 4 << 將數值左移n 位元,相當於 「乘上2n a = 5 << 2 print(a) 20 5=00101(2), 00101<<2= 10100(2)=20 5 >> 將數值右移n 位元,相當於 「除以2n a = 5 >> 2 print(a) 1 5=00101(2), 00101>>2= 00001(2)=1 6 int(a) 將變數a轉為整數型態 print(int(2.54)) 2 7 float(a) 將變數a轉為浮點數型態 print(float(2.54)) 2.54 8 complex(a) 將變數a轉為複數型態 print(complex(1,2)) (1+2j)

(18)

布林值

B-2-5

在布林值(Boolean)中,真值稱為 True、假值稱為 False。

表 3 布林值的相關運算 運算子 說明 例子 結果 (設 a = True ; b = False) 1 or 代 表「 或 」, 只 要 有 一 條 件 成 立即為真值 c = a or b print(c) True 2 and 代 表「 且 」, 所 有 條 件 都 成 立 才為真值 c = a and b print(c) False 3 not 代表「否定」 c = not a print(c) False

比較運算子

B-2-6

表 4 比較運算子的相關運算 運算子 說明 例子 結果(設 a = 10) 1 < 代表小於 print(a < 10) False 2 <= 代表小於或等於 print(a <= 10) True 3 > 代表大於 print(a > 10) False 4 >= 代表大於或等於 print(a >= 10) True 5 == 兩個等號,比較兩邊是否相等 print(a == 10) True 6 != 比較兩邊是否不相等 print(a != 10) False 7 is 比較是否同一個物件 a = 3.14 b = 1.0 + 2.14 print(a is b) False 儘管數值相同,可是並 不指向同一個物件

(19)

串列

B-2-7

串列(List) 為有順序的資料結構,可以動態新增或是刪除,不同型態可以放置在 同一個串列裡面,表示方法是用中括號([ ])括起來,裡面的物件以逗號分開,逗號前 後是否加空白字元均可。 變數名稱 = [物件1, 物件2, 物件3, \ 物件4, 物件5, ...] 物件以逗號分開 內容過長時的換行符號 串列變數名稱 串列內所有物件都在中括號內 圖 9 串列的定義 假設串列變數名稱為s,裡面物件可以是數值或字串型態。 表 5 串列的相關運算 運算子 說明 例子 結果(設 s = [1,2,3]) 1 a in s 判斷a是否在串列s之中 a = 1 print(a in s) True 2 a not in s 判斷a是否不在串列s之中 a = 1

print(a not in s) False 3 s+t 「連接」s與t串列內容 t = [4,5] a = s + t print(a) [1,2,3,4,5] 4 s*n 將s「重複」n次 a = s * 2 print(a) [1,2,3,1,2,3] 5 s[i] 取出索引 i的元素「內容」,編 號是從0開始 print(s[0]) 1

6 len(s) 回傳s的元件「長度(Length)」 print(len(s)) 3 7 min(s) 回傳s之中的「最小值」 print(min(s)) 1

(20)

知識

知識

在 Python 中指令的大小寫並不相同,為避免初學者輸入錯誤,Spyder 編輯器運用不 同顏色來進行識別區分,例如字串預設值用綠色代表、關鍵字用藍色,若欲自行變 更,請依序按「Tools 工具→ Preferences 偏好設定→ Syntax coloring 語法顏色→ Edit selected 編輯」,修改各類型的預設顏色之後,按「OK」確認,如圖 10 所示。 一般文字 註解 字串 數字 關鍵字 內定函式 定義 實例 圖 10 自行設定 Spyder 編輯器撰寫環境

(21)

B-3

Python

程式語言實作

任何結構化程式語言都包括「循序」、「選擇」、「重複」等基本結構特性,說明如下:

1. 循序結構(Sequence):程式由上而下,依序一行一行執行,是指程式碼會依序從

第1 行執行,然後緊接第 2 行、第 3 行……,除非碰到選擇判斷或迴圈返回才會跳到 其他行去執行。

2. 選擇結構(Selection):或稱決策(Decision),就是指 if,如果條件成立就執行某 段程式碼,不成立則執行另一段程式碼。 3. 重複結構(Iteration):或稱迴圈(Loop),是指部分程式片段可重複執行多次,直 到某測試的條件發生為止。 在撰寫程式階段,必須特別留意程式的基本結構,使程式容易閱讀,並有助於程式 的測試與維護。接著底下將透過各種實作,讓初學者由淺入深進入 Python 世界,開始 體驗學習程式語言的思考「邏輯」,當程式邏輯觀念正確,未來不論學習任何的程式語 言,都會比較容易上手。

基本輸出 output 指令

B-3-1

任何的程式碼,可能不用輸入就可以執行,但至少會有一個輸出結果,所以第一個 介紹的是輸出指令,print 本來是列印的意思,但實際是指將運算結果顯示於螢幕上, 由於 Python 3.x 是將 print 當作函式呼叫來使用,所以 print 後面要緊跟著 ( ) 小括號, 若沒有括號便會發生錯誤,同時要注意英文字母都是小寫,至於何謂函式,相關介紹會 在後面的「數位 FUN 手做 14 ~ 16」提到。

物件以逗號分開

print(物件1, 物件2, 物件3, …… , sep = ' ', end = '\n')

分隔字元,預設為一個空格

結束字元,預設為換行 紅色字表示可以省略

(22)

數位

FUN

手做

數位

FUN

手做

01

:輸出

print

指令練習

顯示所有變數 型態與內容 程式編輯區 程式執行區 a = 33 #整數型態 b = 6.8 #浮點數 c = "abc" # 文字串型態,前後要加雙引號 d = '123' # 文字串型態,加單引號亦可 print("Hello") #直接印出文字串 1 2 3 4 5 執行結果 Hello 請仔細觀察數字和字 串相加後的對照區別 程式碼

(23)

■ 程式碼說明

1. 第 1 行是將右邊的整數 33 指定給左邊 a 變數名稱,第 2 行是將右邊的浮點數 6.8 指定給左邊 b 變數名稱,整數和浮點數可以相加,如第 7 行的執行結果,所以 a + b = 39.8 浮點數,若欲觀察各變數的型態與內容,可將右上方的功能面板區切 換到 Variable explorer 變數瀏覽視窗。 2. 第 3、4 行的變數 c、d 都是字串型態,所以第 8 行 (c + d) 表示字串連接在一起, 結果變為 abc123。 3. 在上述程式碼的 = 等號或 + 加號的前後,都習慣多一個空白字元,目的是方便閱 讀,但若省略亦可正常動作。 4. 第 9 行 print 指令中,若要同時輸出多個內容,可用逗號區隔,兩個內容之間預 留一個空白字元,所以輸出為「A B C D」。 5. 若要在兩個內容間插入特殊符號,需在最後多搭配 sep 指令,第 10 行的 sep = "",雙引號中間沒有任何字元,所以輸出為「ABCD」。 6. 第 11 行的 sep = "|",雙引號中間為篩管字元(註:在 Enter 按鍵上方),所以 輸出為「A|B|C|D」。 Python 的字串可以前後利用「雙引號 "」或「單引號 '」包圍起來,為何要用兩種? 理由是當內容本身要輸出單引號,就可以用雙引號將單引號包圍,例如請用 print 輸出 I'm a boy.

(24)

數位

FUN

手做

數位

FUN

手做

02

:各種數學運算子練習

程式碼 1 2 3 4 5 6 7 8 9 10 11 執行結果 14.8 7.2 7.6 1.9 22 5 2 3 121 a = 11 b = 3.8 print(a + b) print(a - b) print(b * 2) print(b / 2) print(a << 1) print(a >> 1) print(a % 3) print(a // 3) print(a ** 2) 仔細觀察各數 學計算的結果

■ 說明

1. 若暫時不須觀察各變數型態與內容,可將右上方視窗關閉,若欲重新使用,按 「Ctrl + Shift + V」組合鍵,或利用下拉式選單「View 檢視 → Panes 面板 → 勾

(25)

請利用 Python 計算 (23+32)×4 = ?

在數學運算中,括號優先權最高,其次是 ** 指數 → % 餘數 → // 商 → / 除法 → * 乘法 → +

加法 → - 減法。

基本輸入 intput 指令

B-3-2

print 目的是輸出資料,而 input 和 print 目的剛好相反,是讓使用者由鍵盤輸入資 料,例如老師要利用電腦計算學生成績,就要先用鍵盤輸入學生的成績,input 也是當 作函式呼叫來使用,所以 input 後面要緊跟著 ( ) 小括號,若沒有括號便會發生錯誤,同 時要注意英文字母都是小寫,input 的語法說明如下: 變數名稱 = input( [輸入提示] ) 選擇性使用,沒用 就不會出現提示 圖 12 intput 語法說明 上述的輸入提示是選擇性使用,目的是告知使用者如何輸入,假設沒用就不會出 現提示,當函式使用後會回傳使用者輸入的資料給左邊的變數,不過要等到使用者按下 Enter 鍵才回傳。

(26)

數位

FUN

手做

數位

FUN

手做

03

:輸入

input

指令練習

使用者輸入 程式碼 1 2 3 4 5 執行結果 Input a=38 Input b=49 38 49 3849

a = input("Input a=") b = input("Input b=") print(a) print(b) print(a + b)

■ 程式碼說明

1. 當執行第 1 行時,右下方主控制台的執行視窗會出現「Input a=」提示字元,然 後就一直等待使用者輸入資料,不過在 Spyder 編輯器執行時,需「手動」將游 標切換到提示字元後面才可輸入,但若用 repl.it 網頁模擬,則輸入不用手動切

(27)

3. 當執行完第 1 行後,變數 a 的值就被指定為字串 "38",執行完第 2 行後,變數 b 的值就被指定為字串 "49"。

4. 由於變數 a、b 都是字串型態,所以第 5 行 (a + b) 表示字串連接在一起,結果變 為 "3849"。

5. 未來如果輸入資料要當成數值計算,則須將第 1 行 「input("Input a=")」 的 外 層, 再 增 加 一 層 int( ) 整 數 型 態 轉 換, 亦 即 改 為「a = int(input("Input a="))」,直接將變數 a 轉換成整數型態再傳給 a, 最內層括號的內容會優先執行,這種類似像俄羅斯娃 娃或洋蔥式的寫法,自我檢查方式就是左括號數量和 右括號總數量應相同。 請分別輸入身高與體重,計算個人 BMI 的值。 BMI = 體重 ( 公斤 ) / 身高2( 公尺 ),體重正常範圍為 BMI=18.5 ~ 24。

範圍 range 指令

B-3-3

變數名稱 = range (初值, 終值, 遞增值) 整數列表會到「終值」的 前一個數字為止 遞增(減)值, 預設為遞增1 初值,預設為0 圖 13 range 語法說明 變數會依據初值到終值的變化,依序指定給左邊的變數,若遞增值省略,則變數 每 次 自 動 +1,–1 則表示遞減 1,括號中若只有一個數值,是將初值為 0 省略,例如 range(10) 相當於 range(0, 10),當變數等於終值就會離開,所以記得最後的值是終值的 前一個數字。 range 所產生的序列相當於之前提到的串列(List)結構,當需要從中取出任一筆資

(28)

數位

FUN

手做

數位

FUN

手做

04

:範圍

range

指令練習

程式碼 1 2 3 4 5 6 7 8 9 執行結果 range(0, 5) 0 1 2 3 4 2 3 4 5 0 2 4 6 4 2 a = range(5) print(a) print(a[0], a[1], a[2], a[3], a[4]) print(b[0], b[1], b[2], b[3]) print(c[0], c[1], c[2]) print(d[0], d[1], d[2]) b = range(2, 6) c = range(0, 6, 2) d = range(6, 0, -2)

■ 程式碼說明

1. 第 1 行 range(5) 相當於 range(0, 5),亦即最前面初值 0 是可以省略,可自行觀 察第 2 行的執行結果,從字面來看是範圍 0~5,但實際是 0~4 而已,要特別留意。 2. 第 3 行 print(a[0], a[1], a[2], a[3], a[4]) 會依序分別輸出 0 1 2 3 4,若第 3 行

不小心多 a[5] 項目,則執行會出現「Index Error: range object index out of range 超出索引範圍錯誤」。

(29)

如果想設定 10、20、30、40、50 的範圍內容,則 range 該如何指定?

迴圈指令

B-3-4

Python 有兩種常用的迴圈,分別是 for 迴圈與 while 迴圈(while loop),最後 面記得都要加「冒號:」,兩種指令比較說明如下,可以透過下方的「數位 FUN 手做 05 ~ 10」觀察各變數的變化,以瞭解迴圈的應用與邏輯概念。 變數會依據初值到終值變化,若 沒有指定遞增,預設為遞增 1, 若設為負數表示遞減,反覆執行 區塊程式碼,當變數等於終值才 會離開迴圈,所以要記得變數等 於終值是沒有執行區塊程式碼。 for 迴圈 當變數等於終值才會離開迴圈 for 變 數 in range(初 值 , 終 值 , 遞 增 值 ): [ 區 塊 程 式 碼 ] 每重複一次,迴圈就會執行區 塊程式碼(一行或多行)一次 計數從「初值」開始到「 終值」的前一個數字為止 迴圈中的區塊程式碼被自動縮排 圖 14 for 迴圈語法說明

知識

知識

Python 程式語言的迴圈,和一般程式語言的最大不同處,就是 Python 在執行迴圈時, 當變數等於終值是沒有執行區塊程式碼,就直接離開,其他程式語言則是會先執行區塊 程式碼才離開。但若一開始變數就不在範圍內,則不論哪種程式均不執行。 while 迴圈 while 判 斷 條 件 : [ 區 塊 程 式 碼 ] while迴圈具有「先判斷、 後執行」的特性 迴圈中的區塊程式碼被自動縮排 只要判斷式成立,區塊程式碼 (一行或多行)就會不停的執行 while是指「當」判斷條件成立或 為真值時,才會執行底下區塊的 內容,執行完區塊後,再回while 判斷條件是否繼續成立,若不成 立,則離開迴圈,若成立就一直 反覆執行區塊內容。 當條件不成立才會離開迴圈

(30)

數位

FUN

手做

數位

FUN

手做

05

for

迴圈

+range

練習

程式碼 1 2 3 4 5 6 7 8 9 10 執行結果 0 1 2 3 4 5 1 3 5 2 3 4 5 6 4 2 for a in range(6): print(a, end=" ") print("") #---for b in range(1, 6, 2): print(b, end=" ") print("") #---for c in range(2, 6): print(c, end=" ")

(31)

■ 程式碼說明

1. for 或 while 指令的最後面務必都要加「冒號:」,代表底下敘述區塊的開始。 本實作目的是利用 for 迴圈將各種 range 的內容顯示出來,以便驗證。 2. 當第 1 行輸入完畢後,按下 Enter 鍵,第 2 行會因為自動縮排而跳到變數 a 的下 面等待輸入,這是 Python 和其他程式語言最大的差異,例如 C 語言是利用大括 號 { } 代表執行區塊,但在 Python 則是用「上下對齊的縮排」方式,判斷是否 同一區塊。 3. 當第 1~2 行迴圈執行完畢後,觀察變數視窗中的變數 a,range(6) 最後數字是停 在 5,而非 6。 4. 第 3 行目的是換行,所以雙引號裡面可以是完全空白,如果省略該行,則所有輸 出內容都擠在同一行。 5. 請注意第 3 行並沒有縮排,當第 2 行輸入完畢後,因為不知 for 裡面的區塊程式 碼要幾行,所以仍然保持縮排,須自行按 Backspce 往前刪除,然後和第 1 行對 齊,如果不小心讓第 3 行和第 2 行對齊,表示 for 迴圈每次除了輸出 a 的內容, 還會執行第 3 行,輸出的結果就變成直向,不妨試試執行二者的區別。 6. 第 4 行「#---」是用註解來區隔程式碼,方便閱讀與除錯,對於較大型的 程式更加需要,與文章分段落的意義相同,亦可使用空白列代替。 range 指令格式為「變數名稱 = range ( 初值 , 終值 , 遞增值 )」,如果省略遞增值, 則預設值為 1,但如果是 range(6, 1) 時,則輸出結果為何?

(32)

數位

FUN

手做

數位

FUN

手做

06

for

迴圈

+ in

指令練習

請觀察變數視窗內容

程式碼 1 2 3 4 5 6 7 執行結果 banana apple watermelon

banana apple watermelon 123

456

fruits = ['banana', 'apple', 'watermelon']

for a in fruits:

print(a)

print(fruits[0], fruits[1], fruits[2])

#---b = [123, 456, 789]

(33)

■ 程式碼說明

1. 之前有提到 List 串列是指有順序的資料結構,除了可以利用 range 指令產生,也 可以利用「串列變數名稱 = [ 物件 1, 物件 2, 物件 3, ...]」指定,如第 1 行 fruits = ['banana', 'apple', 'watermelon'] 字串串列,或是第 6 行 b = [123, 456, 789] 數值串列。

'banana' 'apple' 'watermelon'

fruits 字串串列 123 456 789 b 數值串列 [0] [1] [2] 索引值 (index) 索引從0開始遞增 2. 若要取出串列內容,可以利用中括號,例如:fruits[0] 或 b[2],記得索引編號是 從 0 開始,所以 fruits[0] 內容為 'banana',而 b[2] 內容為數值 789。 3. 第 3、4 行並未對齊,所以 for 迴圈僅執行第 3 行而已,要留意 Python 是用「上 下對齊」縮排來辨識區塊。

知識

知識

本實作建議搭配「單步執行」模式,觀察迴圈的執行順序與各變數的內容變化,之前 按 是全部執行,只可觀察最後結果,「單步執行」模式要先按 ,行號 1 變粗體, 表示目前在執行第 1 行,觀察變數內容尚未變化,接著按 ,跳到第 2 行執行,變數 fruits 就會出現,接著一直繼續按 ,仔細觀察程式碼執行順序與各變數的內容變化。

(34)
(35)

對於初學者,想要更清楚瞭解程式碼執行順序與各變數的內容變化,除了上述方法之外, 還可以利用 VISUALIZE 網站(http://www.pythontutor.com/),只要先在網站上選 擇要學習哪種程式語言與版本,然後填入程式碼,就可以方便觀察各變數在執行過程的 變化與結果。 1 2 3 選擇程式語言與版本 撰寫程式碼 點擊觀察執行過程視窗 輸出結果 4 點擊 Forward 逐步執行,亦可點擊 Back 回至上一步

(36)

數位

FUN

手做

數位

FUN

手做

07

:雙

for

迴圈練習

_

九九乘法表

1 2 3 4 5 for x in range(1, 10): #使迴圈重複9次,終值必須設為10 for y in range(1, 10): s = str(x) + "*" + str(y) + "=" + str(x * y) print(s.ljust(7, " "), end="")

print("") 內迴圈 外迴圈 s 總和會被印81次 程式碼 用+把字串連接 執行結果 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 外迴圈控制變數 x 內迴圈控制變數 y (內迴圈執行 9 次) 外迴圈執行第2次 外迴圈執行第1次 外迴圈執行第3次

■ 程式碼說明

1. 迴圈裡再包含一個迴圈,稱為「巢狀迴圈」,當內迴圈執行完畢,外迴圈變數才 會遞增,當外迴圈都執行完畢,才會跳開此巢狀迴圈,請特別留意縮排的位置。 2. 因為九九乘法表最後一筆是 9*9=81,所以內外迴圈都用 range(1, 10)。 3. 第 3 行「s = str(x) + ……」是利用「加號 +」將多個字串連接在一起,但是變數 x 和 y 都是數值型態,要先用 str( ) 函式轉為字串(string)型態,才能用加號將 其連接在一起。

4. 第 4 行「s.ljust(7, " ")」用法比較特殊,ljust 是指 left just 靠左調整,靠右調 整則是 s.rjust,小括號裡面第一個參數是代表寬度,第二個參數是長度不足時, 要填補的字元內容,所以雙引號裡面只能放一個字元,而 end 後面雙引號裡面 不用加空白字元,且第 3、4 行縮排位置相同,表示是同一區塊程式碼。

(37)

數位

FUN

手做

數位

FUN

手做

08

while

迴圈基礎練習

執行結果 0 1 2 3 4 5 1 3 5 2 3 4 5 6 4 2 執行結果 0 1 2 3 4 5 1 3 5 2 3 4 5 6 4 2 a = 0 初值 while a < 6: 終值 print(a, end=" ")

a = a + 1 遞增值 print("") #---b = 1 while b < 6: print(b, end=" ") b = b + 2 print("") #---c = 2 while c < 6: print(c, end=" ") c = c + 1 print("") #---d = 6 while d > 1: print(d, end=" ") d = d - 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 for a in range(6): print(a, end=" ") print("") #---for b in range(1, 6, 2): print(b, end=" ") print("") #---for c in range(2, 6): print(c, end=" ") print("") #---for d in range(6, 1, -2): print(d, end=" ") 程式碼 while 迴圈 程式碼 for 迴圈 兩邊程式碼功能完全相同,請自行對照比較兩種語法的關係。 將上述程式碼前三項遞增 while 迴圈,均改為遞減 while 迴圈, 但範圍保持不變。

(38)

數位

FUN

手做

數位

FUN

手做

09

for

while

迴圈對照比較練習

程式碼 1 2 3 4 5 6 7 8 9 10 11 執行結果 1+3+5+7+9= 25 1+3+5+7+9= 25 sum = 0 x = 1 初值 while x < 11: 終值 sum = sum + x x = x + 2 遞增值 print("1+3+5+7+9=", sum) #---sum = 0 for x in range(1, 11, 2): sum = sum + x print("1+3+5+7+9=", sum) 上下兩段程式碼功能均同,請自行對照比較。

■ 程式碼說明

1. sum 變數是用來累計 1+3+5+7+9 的總和,利用「sum = sum + x」進行累加; 左右兩邊怎會相等?那是因為這裡的等號代表「指定」,是指將右邊 sum + x 累 加的值指定給左邊 sum 變數。 2. for 迴圈若遞增值為 1 可以省略,但 while 不可以省略,一旦不小心省略,便會 陷入無窮迴圈,因為 x 值不動,造成 x < 11 永遠都成立,將一直 1+1+1+1……反 覆累加,一旦發生可使用「Ctrl + C」強制中斷。 利用 while 與 for 迴圈計算 5×4×3×2×1= ?

(39)

數位

FUN

手做

數位

FUN

手做

10

:雙

while

迴圈練習

_

九九乘法表

1 2 3 4 5 6 7 8 9 x = 0 while x < 9: x = x + 1 y = 1 while y < 10: s = str(x) + "*" + str(y) + "=" + str(x * y) print(s.ljust(7, " "), end="")

y = y + 1 print("") 1 2 3 4 5 for x in range(1, 10): for y in range(1, 10): s = str(x) + "*" + str(y) + "=" + str(x * y) print(s.ljust(7, " "), end="")

print("") 內迴圈 外迴圈 內迴圈 外迴圈 程式碼 程式碼 雙 while 迴圈 雙 for 迴圈 執行結果 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 外迴圈控制變數 x 內迴圈控制變數 y (內迴圈執行 9 次) 外迴圈執行第2次 外迴圈執行第1次 外迴圈執行第3次

■ 程式碼說明

1. 上方程式碼是利用內外兩個 while 迴圈完成九九乘法表,兩者對照會發現,下方 for 迴圈 x 變數是 range(1, 10),即初值等於 1、終值等於 10,那為何 while 迴 圈的 x 變數初值是等於 0、終值的判斷是小於 9 ?

(40)

2. 既然所有 for 迴圈都可以對應到 while 迴圈,那 for 與 while 的使用時機有何差 異?如果初值、終值都已知,建議使用 for 迴圈,因為指令較簡單,適用於重 複性的動作,當然要用 while 也可以。而當停止條件不知何時會發生時,建議 使用 while 迴圈,例如成績輸入程式,因為使用者可能要輸入 10 筆資料,也可 能輸入 20 筆資料,這時迴圈停止的時機是未知的,便可使用 while 迴圈並配合 break 指令跳出迴圈。 3. 最後一行目的是輸出「換列」字元,否則輸出會全部在同一行,縮排位置要和內 迴圈的 while 與 for 上下對齊。 修改上述 while 雙迴圈程式碼,使每行僅顯示 3 個運算式。

判斷(選擇)指令

B-3-5

■ 條件判斷結構

讓使用者可以於程式中使用邏輯判斷「如果判斷條件成立,就執行條件成立的動 作,若條件不成立則執行條件不成立的動作」,許多問題的解決都需要使用選擇結構, 如年齡大於等於6 歲,可以觀賞「保護級」電影,但如果年齡小於 18 歲,則不得觀看「限 制級」電影。 if 運用十分廣泛,有不同的語法提供使用,請參閱以下說明。 1. 單向判斷(if) Python 語言 流程圖 if 條件判斷: 判斷式條件 程式區塊 True

(41)

2. 雙向判斷(if ∼ else) Python 語言 流程圖 if 條件判斷: [程式區塊1] else: [程式區塊2] 程式區塊1 程式區塊2 條件 判斷式 True False 說明:如果條件判斷成立或為True,就執行「程式區塊1」,若條件不成立則執行「程式區 塊2」。

3. 多向判斷(if ∼ elif ∼ else)

Python 語言 流程圖 if 條件1判斷: [程式區塊1] elif 條件2 判斷: [程式區塊2] else: [程式區塊3] 程式區塊1 條件1 判斷式 條件2 判斷式 True True False False 程式區塊2 程式區塊3 說明:如果條件1判斷成立或為True,就執行「程式區塊1」內容,否則再判斷條件2,當 條件1不成立且條件2成立就執行「程式區塊2」,當條件1、2都不成立才執行「程 式區塊3」的內容。

■ 邏輯運算子

邏輯運算子有三種運算子,and(且)、or(或)、not(相反)。 可以使用邏輯運算子連結多個條件,若要多個條件須同時為 True 結果才會為 True

(42)

說明如下: 1.x and y

當只有x、y 都是 True,結果才會是 True;x 與 y 只要其中一個為 False,結果為 False。

變數x 變數y 結果

True True True True False False False True False False False False

2.x or y

當x 與 y 其中一個或兩者都是 True,則結果為 True;當 x 與 y 兩者都是 False,則 結果為False。

變數x 變數y 結果

True True True True False True False True True False False False

3.not x

若 x 為 True,not x 的結果為 False;若 x 為 False,not x 的結果為 True。

變數x 結果

True False False True

(43)

■ 關係運算子

在Python 語法中,流程判斷所使用的運算子稱之為關係運算子,常見的關係運算 子共有六個==、!=、>、>=、<、<=。說明如表 6: 表 6 邏輯運算子的相關運算 運算子 功能 例子 說明 1 == 等於 x==y 若x 等於y,則結果為真 2 != 不等於 x!=y 若x 不等於y,則結果為真 3 < 小於 x<y 若x 小於y,則結果為真 4 > 大於 x>y 若x 大於y,則結果為真 5 <= 小於或等於 x<=y 若x 小於或等於y,則結果為真 6 >= 大於或等於 x>=y 若x 大於或等於y,則結果為真 基本上,由關係運算子所構成的運算式稱之為條件運算式,它主要是用來比較兩者 之間的關係,其輸出結果也只有True(真)或是 False(假)兩種。

數位

FUN

手做

數位

FUN

手做

11

:單向判斷

if

練習

(44)

程式碼 1 2 3 4 5 6 7 8 9 10 執行結果 請輸入第1個數字:16 請輸入第2個數字:40 最大公約數 GCD = 8 最小公倍數 LCM = 80 a = int(input("請輸入第1個數字:")) b = int(input("請輸入第2個數字:"))

for c in range(a, 1, -1):

if (a % c == 0 and b % c == 0):

break

print("最大公約數 GCD =", c)

print("最小公倍數 LCM =", c)

for c in range(a, a * b):

if (c % a == 0 and c % b == 0): break

■ 程式碼說明

1. 第 1、2 行前面加 int 的目的是因為從 input 讀到的值是字串型態,所以要利用 int( ) 內定函式轉成整數(Integer)型態,待會才能做餘數的計算。 2. 第 3~6 行是求 GCD,所以利用遞減迴圈逐一檢查 16 和 40 可以最先同時整除哪 個數字,該數字就是 GCD。 3. 第 3 行亦可將範圍改為從 b 開始遞減,第 4 行 % 是取「餘數」的意思,第 5 行 break 目的是「強制離開」迴圈,因為已經找到 GCD 答案。 4. 第 7~10 行是求 LCM,所以利用遞增迴圈逐一檢查哪個數字可以先同時被 16 與 40 整除,該數字就是 LCM,其中第 7 行亦可將範圍改為從 b 開始遞增。

最大公約數 GCD(Greatest Common Divisor)

是幾個自然數公有約數中最大的一個。例如,16 和 40 公約數有:1、2、4、8,其中最大的是 8, 8 就是 16 和 40 的最大公約數。 思考流程:既是求最大值,所以我們用「遞減」方式依序檢查 16 和 40 可以最先同時整除哪個 數字,該數字就是 GCD。 最小公倍數 LCM(Lowest Common Multiple) 是幾個自然數公有倍數中最小的一個。例如,5 和 6 公倍數有:30、60、90、……,其中最小

(45)

演算法如下: Step1: 分別輸入兩個整數 a 與 b Step2: 建立一個從 a 到 1 的遞減迴圈 c Step3: 如果 a 除以 c 與 b 除以 c 都可以整除,則跳到 Step4, 若不成立,繼續遞減迴圈 Step4: 輸出變數 c 就是 GCD 值 Step5: 建立一個從 a 到 a*b 的遞增迴圈 c Step6: 如果 c 除以 a 與 c 除以 b 都可以整除,則跳到 Step7, 若不成立,繼續遞增迴圈 Step7: 輸出變數 c 就是 LCM 值 參閱「數位 FUN 手做 03 動動腦」,僅判斷 BMI 是否屬於正常範圍。 BMI = 體重 ( 公斤 ) / 身高2( 公尺 ),體重正常範圍為 BMI=18.5 ~ 24。 流程圖如下:

(46)

數位

FUN

手做

數位

FUN

手做

12

:雙向判斷

if_

偶數判斷練習

程式碼 1 2 3 4 5 執行結果 請輸入一個正整數:38 38 是偶數

num = int(input('請輸入一個正整數:'))

if num % 2 == 0: print(num, '是偶數') else: print(num, '是奇數') 鍵盤輸入38

■ 程式碼說明

1. 第 2 行「num % 2」是將輸入的值除以 2,當餘數等於 0 就表示 num 是偶數, 所以跳到第 3 行,否則,跳到第 5 行,輸出是奇數。

2. 由於在 Python 是利用「縮排」來區別執行區塊範圍,當輸入第 2 行「if num % 2 == 0:」後,按下 Enter,游標停在字母 u 下方,直接接著輸入「print(num, ' 是偶數 ')」,再按下 Enter 鍵,游標停在字母 p 下方,此時需要按 backspace 倒退鍵,將 else 與 if 上下對齊。

(47)

數位

FUN

手做

數位

FUN

手做

13

:多向判斷

if_

兩數比大小練習

程式碼 1 2 3 4 5 6 7 8 執行結果

Please input a num1:13 Please input a num2:38 13 小於 38

num1 = int(input('Please input a num1:'))

num2 = int(input('Please input a num2:'))

if num1 == num2:

print(num1, '等於', num2)

elif num1 < num2:

print(num1, '小於', num2)

else:

print(num1, '大於', num2)

elif = else if 否則如果

■ 程式碼說明

1. 多向判斷式中,不論是 if、elif、else 後面都要加冒號,同時要上下對齊,而且 各執行區塊的起始位置也需上下全部對齊。 2. 當分別輸入 13 與 38,因為 13 不等於 38,所以跳到第 5 行繼續判斷,因為 13 < 38 條件成立,因此跳到第 6 行輸出「13 小於 38」字串。

(48)

修改「數位 FUN 手做 11」原程式碼,根據下表增加判斷顯示各式的 BMI 結果。 體重過輕 BMI < 18.5 正常範圍 18.5 ≦ BMI < 24 異常範圍 過重:24 ≦ BMI < 27 輕度肥胖:27 ≦ BMI < 30 中度肥胖:30 ≦ BMI < 35 重度肥胖:BMI ≧ 35 

內定函式與自定函式

B-3-6

Python 的函式有兩種,分別是內定函式與自定函式,內定函式在之前實作當中就 已 經 用 過, 例 如:str( )、int( )、float( )、len( )、max( )、min( ) 等,而在 Python 3.x 也把print( ) 和 input( ) 當成函式來使用,所以 Python 3.x 的 print 後面一定要加小括號, 在呼叫內定函式時,函式名稱後面也必定要緊跟著小括號,中間不留空白字元。

自定函式的方法是在函式名稱前面放置def 指令,def 是 define 定義的意思,def 和函式名稱中間至少要有一個空白字元,否則直譯程式會無法區別;自定函式一定要先 定義方可使用,所以都是放在主程式碼前面的地方。

自定函式的命名方式(Function_name)同變數命名,不可用數字當字首,在呼叫 函式的小括號中,Arg = argument 引數可以都沒有,也可以很多個,需視對應的函式小 括號中Pra = parameters 的參數數量,兩者須一致,但各自的名稱不一定要相同。因此, 當呼叫函式時,Arg1 就將值傳給對應的 Pra1、Arg2 就將值傳給對應的 Pra2,依此類推。

def Function_name (Pra1,Pra2, …):

(49)

數位

FUN

手做

數位

FUN

手做

14

:自定函式練習—

1

程式碼 1 2 3 4 執行結果 歡迎光臨~ def hello(): print("歡迎光臨~") hello()

■ 程式碼說明

1. 由於自定函式一定要在呼叫前先定義,所以一般都是在程式碼最前面,本實作因 為沒有參數傳遞,所以第 1 行小括號中是空的,但小括號不可省略。 2. 第 3 行空白列可以省略,因為目的只是為了方便閱讀。 3. 第 4 行呼叫自定函式,因為沒有參數傳遞,所以小括號中是空的,但小括號不可 省略。

(50)

數位

FUN

手做

數位

FUN

手做

15

:自定函式練習—

2

程式碼 1 2 3 4 執行結果 方形面積 = 30 def area(h, w): print("方形面積 =", h * w) area(5, 6) 增加引數與參數的傳遞

■ 程式碼說明

1. 第 1 行增加 h 高度與 w 寬度的參數傳遞,目的是要計算長方形的面積(area), 當自定函式建立之後並不會執行,除非在主程式中呼叫函式才會執行。 2. 第 4 行目的是呼叫 area 函式,將數值 5 傳給參數 h,將數值 6 傳給參數 w。

(51)

數位

FUN

手做

數位

FUN

手做

16

:自定函式練習—

3

程式碼 1 2 3 4 執行結果 3 的 4 次方 = 81

def power(num1, num2):

return num1 ** num2

print("3 的 4 次方 =", power(3, 4)) 利用 return 返回指令,透過函式名稱回傳結果

■ 程式碼說明

1. 第 1 行自定函式小括號中的 num1 接收數值 3、num2 接收數值 4。 2. 當自定函式運行到第 2 行 return 陳述句時,將會無條件直接離開函式,同時透 過函式名稱回傳結果,所以當第 4 行 power(3, 4) 呼叫自定函式 power 後,會 接收到 34 = 81 的計算結果,其中「**」是次方運算子,然後在主程式直接輸出 結果。

(52)

數位

FUN

手做

數位

FUN

手做

17

:自定函式

_

遞迴運用練習

程式碼 1 2 3 4 5 6 7 8 執行結果

Please input a number:5 5 != 120 def factorial(n): if (n == 1): return 1 else: return n * factorial(n - 1)

num = int(input('Please input a number:'))

print(num, '!=', factorial(num))

鍵盤輸入的值

■ 程式碼說明

1. 此範例是要計算正整數的階乘,是所有小於及等於該數的正整數的積。自然數 n 的階乘寫作 n!,可以表示如下: n! = n × (n-1) × (n-2) ×…× 2 × 1 … 所謂遞迴是指自定函式一直 反覆呼叫自己。

(53)

2. 假設 num 變數收到 5 的輸入值,利用 factorial (5) 呼叫, 因為 5 不等於 1,所 以 factorial 名稱返回 5 * factorial(4),其中 factorial(4) 又去呼叫自定函式,如 此一直呼叫自己,就稱為遞迴,那何時才會停止呼叫呢?答案是當 n 等於 1 時, 因為 1! = 1 就是自己不用再呼叫。 3. 實際執行流程如右圖。 4. 呼叫函式的引數,用 num 變數傳送給自 定函式參數 n,兩者名稱不一定要相同, 但兩邊變數數量應保持相同。 利用遞迴技巧,試求費式(Fibonacci)數列大小,由使用者輸入一個正整數 n(n < 20),計算出費式數列的第 n 項之值並輸出。 費式數列的前兩項為 1、1,之後的每一項為前兩項之總和,即 Fn = Fn-1 + Fn-2,費式數列的前 10 項依序為:1、1、2、3、5、8、13、21、34、55,即 F11 = F10 + F9 = 55 + 34 = 89 。 5! = 5 × 4! = 5 × (4 × 3!) = 5 × (4 × (3 × 2!)) = 5 × (4 × (3 × (2 × 1!))) = 5 × (4 × (3 × (2 × (1)))) = 120

(54)

數位

FUN

手做

數位

FUN

手做

18

:無窮迴圈搭配

break

的運用練習

程式碼 1 2 3 4 5 6 7 8 9 10 11 12 13 執行結果 def factorial(n): if (n == 1): return 1 else: return n * factorial(n - 1) while True:

num = int(input('Please input a number(0->EXIT):'))

if num == 0:

break

else:

print(num, '!=', factorial(num))

(55)

■ 程式碼說明

1. 之前的實作都僅能執行一次而已,若要反覆執行,就須利用「while True:」技巧, 因為 while 後面判斷條件永遠為 True 真值,所以會一直重複執行,稱為無窮迴 圈。 2. 無窮迴圈該如何停止呢?第一種方式是直接按「Ctrl + C」強制離開,第二種方 式是在無窮迴圈中增加判斷條件,例如第 9 行,當判斷輸入的 num 值等於 0 就 執行 break 指令,當然也可以自行決定判斷其他特定的數值,而 break 的目的 是要強制離開 while 迴圈,離開主程式的無窮迴圈,相當於離開執行程式,包括 for 迴圈亦可使用 break 指令。 請輸入兩個整數值,利用 while 與 break 求出最大公約數。

(56)

數位

FUN

手做

數位

FUN

手做

19

:匯入模組

_

隨機產生數字練習

程式碼 1 2 3 4 執行結果 2 28 41 15 11 21 29 91 85 34 import random for x in range(10): a = random.randint(1, 99)

print(a, end=" ")

■ 程式碼說明

1. 此範例增加學習利用模組的技巧,所謂模組類似之前提到的自定函式,只不過是 由一群專業的工程師所撰寫,內容十分廣泛,有些在安裝時就存在,有些可以透 過網路下載,使用者只要知道如何呼叫使用即可,而這也是 Python 好用的原因 之一。 2. 第 1 行 import 是指匯入的意思,random 是隨機的意思,目的是要匯入隨機相 關的模組。

3. 「for x in range(10):」目的是要產生 10 組數字,所以要利用 for 迴圈。

(57)

數位

FUN

手做

數位

FUN

手做

20

:顯示目前系統日期與時間練習

程式碼 執行結果 現在日期與時間 : Sun Jan 28 11:54:39 2018 午安! 時間格式自訂--> DATE=2018/01/28 TIME=11:54:39 1 2 3 4 5 6 7 8 9 10 11 import time print("現在日期與時間 :", time.strftime("%c")) h = int(time.strftime("%H")) if h > 6 and h < 11: print("早安!") elif h >= 11 and h < 17: print("午安!") else: print("您好!")

print("時間格式自訂-->", time.strftime("DATE=%Y/%m/%d TIME=%H:%M:%S"))

■ 程式碼說明

(58)

• %c 是指目前(current)的系統日期時間 • %H 是指小時(hour) • %Y 是指年份(year) • %M 是指分鐘(minute) • %m 是指月份(month) • %S 是指秒數(second) • %d 是指日期(date) 3. 透過 time.strftime 讀到的都是「字串」型態,若想透過系統時間值進行判斷, 可以利用 int( ) 先轉換成整數,例如 h = int(time.strftime("%H")),這樣底下的 if 判斷句才可以根據現在時刻顯示對應的問候語句。 4. 如果覺得利用 % 顯示的系統日期時間格式不習慣,也可以自訂顯示的順序與顯 示格式,例如「time.strftime("DATE=%Y/%m/%d TIME=%H:%M:%S"))」,將 想要顯示的內容放在字串中即可(包括空白字元),然後再搭配各種預設 % 的 格式。 所有的大、小寫都要特別注意,在 Python 中, 英文字母的大、小寫有著不同的意義。 請 自 訂 時 間 日 期 格 式, 例 如 顯 示「 西 元 2017 年 12 月 25 日  下午 18 時 26 分 38 秒」。

(59)

 

課後習題

�擇題

( ) 1. Python 程式語言的副檔名為? (A) p (B) py (C) python (D) 以上皆否。 ( ) 2. 在 Spyder 編輯器工具列區,下列敘述何者錯誤? (A) 開新檔案 (B) 開啟舊檔案 (C) 儲存所有檔案 (D) 播放檔案。 ( ) 3. 在 Python 程 式 語 言 中, 若 a = [1, 2, 3, 4, 5], 則 print(min(a)) 結 果 為? (A) 1 (B) 2 (C) 3 (D) 5。 ( ) 4. 在 Python 程式語言中,若 a = 12,則 print(a**2) 結果為? (A) 122 (B) 144 (C) 1212 (D) 以上皆否。 ( ) 5. 在 Python 程式語言中,若 a = 13,則 print(a % 5) 結果為? (A) 2 (B) 3 (C) 4 (D) 以上皆否。 ( ) 6. 在 Python 程式語言中,若 a = 13,則 print(a >> 2) 結果為? (A) 26 (B) 6 (C) 13 (D) 以上皆否。 ( ) 7. 在 Python 程式語言中,若 a = [1, 2, 3, 4, 5],則 print(a[2] + a[3]) 結果為?

(A) 3 (B) 5 (C) 7 (D) 9。 ( ) 8. 在 Python 程式語言中,執行下列程式碼之 後,print 輸出為? (A) 0 (B) 120 (C) 15 (D) 以上皆否。 ( ) 9. 同第 8 題程式碼,第 5 行程式碼實際將執行 幾次? (A) 1 (B) 2 (C) 3 (D) 5。 ( ) 10. 同第 8 題程式碼,執行後,變數 x 的值為? B-1 B-2 p = 1 x = 5 while x >= 1: p = p * x x = x - 2 print(p) B-3

(60)

 

課後習題

( ) 11. 在 Python 程式語言中,執行下列程式碼之後,print 輸出為? (A) 2 (B) 4 (C) 5 (D) 20。 def x(n): if (n <= 2): return 1 else: return x(n - 1) + x(n - 2) print(x(5)) ( ) 12. 在 Python 程式語言中,執行下列程式碼之後,print 輸出不可能為? (A) 5 (B) 45 (C) 85 (D) 120。 import random for x in range(10): a = random.randint(1, 100) * 5 + 5 print(a) ( ) 13. 在 Python 程式語言中,執行下列程式碼之後,print 輸出不可能為? (A) 27 (B) 54 (C) 72 (D) 100。 s = 0 for x in range(1, 10): for y in range(1, 10): s = s + 1 print(s) ( ) 14. 同第 13 題程式碼,總共輸出幾筆數值資料? (A) 9 (B) 10 (C) 81 (D) 100。 ( ) 15. 同第 13 題程式碼,執行後,變數 x 的值為? (A) 9 (B) 10 (C) 1 (D) 以上皆否。

數據

圖 5 取消自動提示更新
表 3 布林值的相關運算 運算子 說明 例子 結果 (設  a = True ; b = False) 1 or 代 表「 或 」, 只 要 有 一 條 件 成 立即為真值 c = a or b print(c) True 2 and 代 表「 且 」, 所 有 條 件 都 成 立 才為真值 c = a and b print(c) False 3 not 代表「否定」 c = not a print(c) False 比較運算子B-2-6 表 4 比較運算子的相關運算 運算子 說明 例子 結果(設  a
圖 11 print 語法說明

參考文獻

相關文件

課程利用雲端學習平台 OpenEdu 從最基礎開始說明 Python 的語 法與應用,配合 Quiz in Video

A1: 資訊系統的操作對於我們來說友善程度沒有那麼高,雖然它每年持 續的在改進啦,其實大家都知道 TIMS 非常的難用,從以前就通道說 TIMS

VAB 使用者無法使用 RIDE 提供的 Filter Design 公用程式設計濾波器,但是 使用 VAB 的 Filter 元件時,在元件特性選單可以直接指定此濾波器的規格,使用

Micro:Bit AI2 Scratch Mbot Python

experiment may be said to exist only in order to give the facts a chance of disproving the

簡⾔言之,在 C 語⾔言裡如果你想要讓其他函式可以幫

Binomial Option Pricing

然後,他在同樣的器皿中放入另外一隻大白 鼠,在它掙扎了 5分鐘左右的時候,放入一