0% found this document useful (0 votes)
39 views164 pages

Python

本文件介绍了计算机的基本组成,包括硬件、软件和操作系统的功能。重点介绍了Python编程语言的特点、安装和基本使用方法,以及编写Python程序时需要注意的事项和常见错误。最后,提供了一些练习题以帮助读者巩固所学知识。
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
39 views164 pages

Python

本文件介绍了计算机的基本组成,包括硬件、软件和操作系统的功能。重点介绍了Python编程语言的特点、安装和基本使用方法,以及编写Python程序时需要注意的事项和常见错误。最后,提供了一些练习题以帮助读者巩固所学知识。
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Python 程式設計

Pei-Yin Chen 陳培殷 資訊工程系 特聘教授


0
前言

師父引入門,修行在個人

吾心信其可行,則移山、填海之難,終有成功之日;
吾心信其不可行,則反掌、折枝之易,亦無收效之期。

➔跨域對話? 程式大師?

抄襲但需要真的了解➔ 自己運用+撰寫

1
何謂電腦

電腦系統是由
硬體、軟體、資料與 人 所組成的系統。

電腦 (computer) 的全名為電子計算機,又稱為
計算機,俗稱電腦。它是由不同功能的電子零
件及機械裝置組合而成,因為它能執行算術運
算,所以被稱為電子計算機。

特色 一天 24*60*60=86400秒
CPU 1G ~= 1X109運算
1. 運算速率非常快。
G(十億,109) T(兆, 1012)
2. 儲存資料容量非常大。
3. 處理資料結果正確、品質優良、且不易疲勞。
2
電腦的組成元件
CPU

邏輯運算單元

控制單元

輸入單元 輸出單元
鍵盤 螢幕
滑鼠 印表機
掃描器 記憶單元
喇叭
記憶體 、硬碟
電腦的五大單元運作流程

中央處理器 (Central Processing Unit, CPU),亦稱為處理器


(processor) 或微處理器 (microprocessor)。
CPU是電腦硬體的核心,在電腦所扮演的功能就如同人的大
腦般,主要負責電腦的控制、邏輯運算和執行程式功能。
3
電腦軟體

程式是一連串依特定順序所組合的電腦資料與指令的集合。程
式也視為是電腦軟體 ,主要可區分成兩類: 系統軟體 (system
software) 與應用軟體 (application software)。

系統軟體是使電腦順利運作的核心程式(最重要的程式集),主
要由一些在背景 (background) 執行的程式組成,包含:作業系統
、編譯程式、監督程式及電腦資源I/O管理程式 。

應用軟體藉由作業系統的運作,指揮電腦中的各項硬體執行各
種不同功能的軟體。每一個應用軟體,乃針對特定事務或工作
來撰寫,用以協助使用者解決各種不同目的之問題。

Basic, C, C++, Java, Python, R …


4
作業系統的功能

windows 7, 8, 10, ..
MS-DOS, Microsoft Windows, Unix, Linux, Mac OS, Android/iOS

• 作業系統 (Operating System, OS) 是管理電腦所有硬體


與軟體資源的程式的集合(又稱資源管理者),是電腦系
統運作的主要核心,作業系統負責管理與配置記憶體、
決定系統資源供需的優先次序、控制輸入與輸出裝置、
操作網路與管理檔案系統等 。

• 啟動電腦後,電腦就會自動執行開機載入程式並啟動作
業系統,然後就可以開始操作各式各樣的應用程式。
5
應用軟體

一、系統工具軟體
用於管理系統的軟體,包含檔案總管、使用者帳戶管理、
資料來源管理、硬體裝置管理及新增或移除程式等。
二、文書處理 (word)
三、電子試算表軟體 (excel)
四、簡報軟體 (powerpoint)
五、資料庫軟體 (database)
六、影像處理
七、其他特殊應用軟體

6
電腦RAM記憶體配置

Hard Disk
硬碟

作業系統 Operating system OS


AP1 word 程式執行流程:
AP2 excel 1. 讀出該行指令
2. 解碼指令
應用軟體 Application
AP 3. 執行指令

program 4. 跳至程式下一行,重複上述
動作到整個程式結束。
RAM

7 從程式的第1行開始,一行一行執行,一直到最後一行
Python 簡介

抄襲但需要真的了解每一行➔ 自己運用+撰寫
8
認識Python

Python官方網站蟒蛇標誌
([Link]

Python (唸做 /ˈpaɪθən/) 是一個程式語言,由荷蘭程式設計師Guido


van Rossum於1990年代所研發。

根據Python官方網站的說明指出,「Python是一個容易學習、功
能強大的程式語言,具有高效能的高階資料結構,簡單但有效率
的物件導向程式設計方式。Python語法簡潔、具動態型別及直譯
式等特質,使它成為撰寫script和快速開發程式的理想語言。」

Python的版本同時存在著Python 2和Python 3,新版的Python 3無


法向下相容於Python 2。
9 AI人工智慧應用中最常使用的程式語言
下載安裝Python
安裝步驟是連線到Python下載網站,然後
根據作業系統平台下載Python 3安裝程式
並進行安裝。

1. [Link]
選擇download the latest version for
windows (Mac)

2. 下載後,將畫面最下方選擇 Install
now 來安裝

3. setup was successful.


✔ Add Python 3.12.0 to PATH 空格打勾 ✔ (版本定期更新,目前為3.12.0)
10
執行Python
最新版本為 Python 3.12.0

請按 [開始] \ [Python 3.12] \ [Python 3.12 (32-bit)],啟動


Python直譯器,輸入print("Hello, World! "),按 [Enter] 鍵,
直譯器會立刻執行該敘述,並出現執行結果。

11
輸入Python
指令 / 命令 / 敘述
instruction / command / statement

>>> 3+4 →你下的命令(指令)


加 + 乘 * 7 → 輸出結果
>>> 10/2
減 - 除 / 5.0
>>> 5-7
-2
先乘除後加減,可加( ) >>> print("I like Python")
正確寫法
I like Python
但是一定要成對
>>> print(3+4)
7 程式語法
>>> print(10/2) →印出10除2的結果
往上鍵↑或▲
5.0
可重覆前一個指令(命令) >>> print("10/2") →印出10/2這一串字
10/2
12
print()

我們可以使用Python內建的print()函式(是一個python開發者事先已
寫好的程式)在螢幕上印出指定的字串,使用範例如下:
print('字串', value, "字串")
例如:
>>> print("I", "am", "Jean") →你下的命令(指令)
I am Jean → 輸出結果
>>> x=5 字串前後可用 ' 或 "兩者皆可,
>>> y=7 但一定要成對。
→你下的命令(指令) (即鍵盤上enter鍵的左邊那個鍵!!!)
>>> print('x=',x,'y=',y)
x= 5 y= 7 → 輸出結果
>>> print('x=6',x,'y=6',y)
x=6 5 y=6 7 '字串' 內容會一字不漏照著印
>>> print('今天:',y,'明天:',x) x與y 則是值為多少,就印出該值
今天: 7 明天: 5
13
錯誤Python指令 程式語法錯誤!
跟語言文法一樣
>>> 3+4 3前誤加入空白
SyntaxError: unexpected indent
>>> 10/2 10前誤加入一堆空白
SyntaxError: unexpected indent
>>> Print (3+5) P誤用大寫字 (大小寫不同)
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
Print (3+5)
NameError: name 'Print' is not defined
字母p前誤加入空白
>>> print(3+4)
SyntaxError: unexpected indent
>>> print (3+4) p前無空白→正確
(雖然左括號前多了空白)
7
>>> print(3+4) p前無空白→正確
7
14
程式撰寫錯誤

常見的程式設計錯誤有下列幾種類型:
• 語法錯誤 (syntax error)
• 執行期間錯誤 (runtime error)
• 邏輯錯誤 (logic error)

15
使用Python IDLE (1/2)

>>> 3+4
7
>>> 5-7
-2
>>> print(10/2)
>>> print("I like Python")
5.0 →印出10除2的結果
I like Python
>>> print("10/2")
>>> print(3+4)
10/2 →印出10/2這一串字
7
上述例子的問題→ 一次只能執行一個命令,無法連續執行多個命令
請按 [開始] \ [Python 3.12] \ [IDLE],開啟Python Shell視窗,輸
入print("Hello, World!"),然後按 [Enter] 鍵,立刻會在下一行看
到執行結果。

16
使用Python IDLE (2/2)

要連續執行超過一行的命令,須存成一個檔案(程式) !!!
多行連續命令→程式 !!!
1.選取 [File] \ [New File],然後輸入三行命令。 3. 選取 [Run] \ [Run Module]。

★程式編譯後執行!!!

2.選取 [File] \ [Save],儲存為[Link]。 4. 出現執行結果。

17
Python程式基本注意事項 (1/2)
• 英文字母大小寫: Python會區分英文字母大小寫→代表不同意思
• 空白: 避免額外的空白,縮排
• 縮排: 每個縮排層級使用空白,亦可使用 [Tab] 鍵,但不能混合。
[Tab] 鍵➔4個空白
print 3+4
• 註解: Python提供下列兩種註解符號
if (x>6)
• #:標示單行註解,例如: y=4
# 我的第一個Python程式
print("Hello, World!")

• ''':標示多行註解,例如:
''' 我的第一個Python程式
它將會印出Hello, World!
'''

!!! 註解只是說明不是命令,不會被CPU執行
18
Python程式基本注意事項 (2/2)

關鍵字(keyword)或稱保留字(reserved word)
具有特殊意義,不能亂用。常用關鍵字如下:
FALSE class finally is
return None continue for
程式執行流程:
lambda try TRUE def
1. 讀出該行指令
from nonlocal while and
2. 解碼指令
del global not with
3. 執行指令
as elif if or
4. 跳至程式下一行,
yield assert else import
重複上述動作(讀、解
pass break except in
、執)到整個程式結束。
raise
19
練習題 加 + 乘 *
減 - 除 /
先乘除後加減,可加( )
每一個題目存成一個程式,共7個程式檔案!!!
但是一定要成對
請計算下列結果
(𝟓+𝟐)(𝟏𝟎−𝟐)
(1) 5+7-3+10 (5)
(𝟕−𝟑) # ((5+2)*(10-2))/(7-3)
✔ (2) 5-7×3+2 𝟏𝟎−𝟏
✔ (6) 𝟕−𝟒
✔ (3) (9-2)×(4-1)
(𝟓−𝟏)(𝟐+𝟐)
✔ (7)
(4) 從1加到10 (𝟏+𝟒)(𝟗−𝟑)

答案
(1) 19 (2) -14 (3) 21 (4) 55 (5) 14 (6) 3 (7) 0.533333333(or 8/15)
20
練習題範例說明
注意: 每一題目存成一個程式檔案
(2) 5-7×3+2
1. 選取 [File] \ [New File],然 3. 選取 [Run] \ [Run Module]。
後輸入一行敘述。

print (5-7*3+2)

程式編譯後執行!!!

2. 選取 [File] \ [Save],儲存為[Link]。 4. 出現執行結果。

21
程式撰寫原則

22
軟體程式設計

人腦使用下達命令的方式來 要如何控制電腦硬體裝

完成所有處理動作 置呢?使用程式(自動化)
人工智慧
輸入→處理 →輸出
輸入 → 處理 → 輸出
資訊 CPU 資訊
熱 腦處理 手移動

命令;一堆命令 (由大腦負責下命令) 命令; 一堆命令➔程式 大程式、小程式

→ 程式可安排由電腦的CPU來依序執行: 程式要一步驟一步
驟(一行一行)寫的非常明確, 然後CPU依序一行一行執行。
23
程式撰寫注意事項 (1/2)

如何寫程式:
由鍵盤或滑鼠輸入
1.程式的輸入為何?(設定輸入變數與如何輸入)
由螢幕印表機輸出
2.程式的輸出為何?(設定輸出變數與如何輸出)
3.找出處理的過程(以命令/程式表示之)

為了代表不同的人,我們給每一個人不同的名字,同樣的道理
→ 程式中,為了代表每個不同的東西,需使用各種不同名字的
變數名稱(或稱 識別字identifier)

例如:
x, length, score_1, score_2, area
不同的變數名稱代表不同的東西 (命名要注意)
24
程式撰寫注意事項 (2/2) or gate

不同的語言有不同的文法/用法
不同的程式語言有不同的語法/格式 !!! and gate
C語言是最常用的一種程式語言
最近Python愈來愈受到歡迎—特別是AI領域

輸入 命令集 輸出
input 程式處理 output

一堆 一堆 一堆

0或1 0或1 0或1

將一堆輸入的0或1, 經運算(程式)處理, 輸出一堆的0或1


25
變數 (1/2)
變數的命名規則
變數的名稱屬於識別字的一種,其命名規則如下:
• 第一個字元可以是英文字母、底線 (_) 或中文,其它字元可以是英文
字母、底線 (_)、數字或中文,英文字母有大小寫之分。
• 不能使用關鍵字,以及內建常數、內建函式、內建類別等的名稱。
• 可使用有意義的英文單字和字中大寫來命名,也就是以小寫字母開
頭,之後每換一個單字就以大寫開頭,例如 userPhoneNumber 。

studentID class
_studentID print
studentName Good! custom@ID Error!
student_name 7eleven
myCar1 my Car1
26
變數 (2/2)
變數的指派方式
我們可以使用指派運算子 (=)(assignment operator) 來指
派變數的值,而且是以最近一次指派的值為準,例如:

>>> myName= "小丸子"


>>> myName=56
>>> X = 1
>>> X = X + 1 ??? why
>>> X
2
>>> X = Y = Z = 1
>>> X, Y, Z = 1, 2.5, "Happy"
27
資料型別
數值型別(int、float)
int:表示整數(10、-530)。 float: 浮點數(有小數,如 3.14159、-3.42)
字串型別 (string, str)
Python使用str型別處理文字資料--由一連串字元(character)所組成、有
順序的序列,包含文字、數字、符號等。三種字串表示方式為:
• 單引號 ('):例如 'Python程式設計'。
• 雙引號 ("):例如 "Python程式設計"。
• 三個單引號 (''')、三個雙引號 ("""):例如 '''Python程式設計'''、
"""Python程式設計""" (允許多行字串)。
>>> print("I love Tainan") >>> print("""星期一
I love Tainan 星期二
>>> print('I love Tainan') 星期三""")
I love Tainan 星期一
>>> print('我愛台南') 星期二
28
我愛台南 星期三
算數運算子 (4) / (浮點數除法):a / b,例如:
operator
>>> 7 / 3
2.3333333333333335
(1) + (加法):a + b,例如:
(5) // (整數除法):a // b,例如:
>>> 1.234 + 5.678
>>> 7 // 3 >>> 12.5//5
6.912 求整數商
2 2.0
(2) - (減法):a - b,例如:
(6) % (餘數):a % b,例如:
>>> 1.456 - 5.456
>>> 7 % 3 >>> 12.5%5
-4.0 求餘數
1 2.5

(3) * (乘法):a * b,例如: (7) ** (指數):a ** b,例如:


>>> 10 * 0.5 5a Error! >>> 9 ** 2 >>> 9 **0.5
5.0 5*a Good! 81 (𝟗𝟐 =81) 3.0
𝟐
( 𝟗 =3)
29
程式範例-求3個人分數 ex1
的平均值 求正方形周長與面積?
程式: 1.一堆命令的集合
w=6 邊長
2.依序從第一行執行到最後一行
length=4*w 周長
1.程式的輸入為何?(設定輸入變數)
area=w*w 面積
2.程式的輸出為何?(設定輸出變數)
print(length, area)
3.找(寫)出處理過程(以命令表示)
6=w Error!
x=x+1 Good! Why?
y=y-2 數學表示不正確,但程式卻可以 ex2
求3個人分數的平均值?

口訣 右邊運算的結果,放入左邊變數中 score_1=78 #第一個人分數


5/2=x score_2=82 #第二個人分數
x=5/2
Good! Error! score_3=90 #第三個人分數
y=3 3=y result=(score_1+score_2+score_3)
average= result/3
練習 print (average)
輸入底與高,求三角形面積!
30
1.寫一程式,已知三角形的底=10、高=5,求其面積。 #25

✔ 2.寫一程式,輸入班上5位同學成績(78、67、89、91、76),印出

#401 #80.2
全班總分與平均。

3.李四參加三次TOEIC考試,分別考了700、800、850分,求

三次考試的平均分數為何? 第三次考試高於平均幾分呢?
#783.333

31
w=6 sep 預設為一個空白
程式範例1-正方形 length=4*w end 預設為\n 換行
周長與面積 area=w*w
寫法一 print(length,area)
print(length,area,sep='')
w=6 邊長 程式 print(length,area,end='ggg')
length=4*w 周長 print(length,area,end='kkk')
area=w*w 面積 24 36
程式 結果
print (length) 2436
print (area) 24 36ggg24 36kkk
每次更改邊長 >>>
24
結果 ,需更正程式
36
並重新編譯
>>>
寫法二
ex3 w=eval(input('輸入正方形邊長:')) 輸入正方形邊長:7
length=4*w 周長= 28 面積= 49
程式 結果
>>>
area=w*w
print('周長=',length,'面積=',area) 欲更改邊長,再一次執行程式
32
並輸入新值,不需要重新編譯
輸入

我們可以使用Python內建的input()函式取得使用者輸入的資料,語法如下:
input(prompt = None) 電腦執行至input指令時,會印出提示字並暫停
,等待使用者鍵入值並 + enter鍵 才能繼續!!
prompt為選擇性參數,用來設定提示文字;預設值None(無),無提示文字。

score=eval(input('輸入成績:')) score=eval(input())
ex4
score=score+10 score=score+10
程式 print(score) print(score) 程式

輸入成績:56 鍵入成績56後, 56 鍵入成績56後,


結果 需再加上enter鍵 需再加上enter鍵 結果
66 66

score=eval(input('Input the score;'))


Input the score;90
score=score+10 鍵入成績90後,
程式 結果 100 需再加上enter鍵
print(score)
33
int
我們可以使用Python內建的int()函式,將括號內的字串或浮點數
(float)轉換成整數值(integer),語法如下:
a=378 a是數字
>>> int('4.8') int(字串) b= '378' b是字串
c=int(b) a 等於 c
4 a 不等於 b
>>> int(3+5) >>> int('3+5')
8 Traceback (most recent call last):
>>> int(9.999) File "<stdin>", line 1, in <module>
9 ValueError: invalid literal for int() with
>>> int('999') base 10: '3+5' Error!

999 Good! >>> round(9.5)


10 Good!
>>> round(9.4)
34
9
eval
我們可以使用Python內建的eval()函式,將括號內的字串轉換成
有效的表達式(expression)並求其數值,語法如下:
eval(字串) a=378 a是數字
b= '378' b是字串
>>> eval('3.5') c=eval(b) a 等於 c
3.5 a 不等於 b
>>> eval('3+5') >>> eval('I')
8 Traceback (most recent call last):

>>> eval('(3+2)*(6-2)') File "<pyshell#6>", line 1, in <module>


eval('I')
20
File "<string>", line 1, in <module>
>>> eval('999')
Good! NameError: name 'I' is not defined Error!
999
35 本課程之後的說明,都使用 eval() !
輸出(1/3)

我們可以使用Python內建的print()函式在螢幕上印出指定的字串,語法如下:
print(value, …, sep = ' ', end = '\n')
例如: (字串的前後使用' '或" "都可以)

>>> print("I", "am", "Jean")


sep可設定逗點用什麼來取代
I am Jean
>>> x=5 sep 若沒給定值,
>>> y=7 預設(default)為一個空白
>>> print('x=',x,'y=',y)
x= 5 y= 7
end可設定印出結束後的行為
>>> print('x=6',x,'y=6',y)
x=6 5 y=6 7 end若沒給定值,
>>> print('今天:',y,'明天:',x)
預設(default)為\n 換行
今天: 7 明天: 5
36
輸出(2/3)
我們可以使用Python內建的print()函式在螢幕上印出指定的字串,語法如下:
print(value, …, sep = ' ', end = '\n')
例如:
sep 若沒給定值,
>>> print("I", "am", "Jean")
I am Jean 預設(default)為一個空白
>>> print("I", "am", "Jean", sep="@")
I@am@Jean sep 若給空字元""
>>> print("I", "am", "Jean", sep=" ") >>> print("I", "am", "Jean", sep="")
I am Jean IamJean
>>> print("I", "am", "Jean", sep="--")
I--am--Jean >>> k=0.56667 請自行查詢
>>> print('%.2f'%k)
>>> myName = "Jean"
0.57
>>> print("I", "am", myName) >>> print('%.3f'%k)
I am Jean 0.567
37
輸出(3/3)

我們可以使用Python內建的print()函式在螢幕上印出指定的字串,語法如下:
print(value, …, sep = ' ', end = '\n')

end若沒給定值,
預設(default)為\n 換行
不用背,只須看懂!!!
ex5 結果
print ('I', 'am', 'Jean') I am Jean
程式
print ('I', 'am', 'Jean',end='~') I am Jean~I
am Jean
print ('I','\n','am', 'Jean')
I
print ('I','\n', 'am', '\n','J ean') am
print('I', 'am', 'Jean',end='###') J ean
38 I am Jean###
程式範例2-求3個人分數的平均值
score_1=78 寫法一
score_2=82
83.33333333333333
score_3=90
result=(score_1+score_2+score_3) >>>
average= result/3 每次更改成績,
print(average) 程式 結果 需更正程式並重新編譯
寫法二
ex6 score_1=eval(input('輸入第1位同學成績:')) 輸入第1位同學成績:60
score_2=eval(input('輸入第2位同學成績:')) 輸入第2位同學成績:70
score_3=eval(input('輸入第4位同學成績:')) 輸入第4位同學成績:80
result=(score_1+score_2+score_3) 3個同學平均成績為: 70.0
程式 結果
average= result/3 >>>
欲更改成績,再一次執行程式
print("3個同學平均成績為:",average) 並輸入新值,不需要重新編譯
39 輸入如何防呆(成績0~100)??? Bug De-bug
前面範例1與2之補充

如何寫程式:
由鍵盤或滑鼠輸入
1.程式的輸入為何?(設定輸入變數與如何輸入)
由螢幕印表機輸出
2.程式的輸出為何?(設定輸出變數與如何輸出)
3.找出處理的過程(以命令/程式表示之)

score_1=eval(input('輸入第1位同學成績:'))
輸 輸 score_2=eval(input('輸入第2位同學成績:'))
入 w=eval(input('輸入正方形邊長:')) 入
score_3=eval(input('輸入第4位同學成績:'))
處 length=4*w
理 處 result=(score_1+score_2+score_3)
area=w*w

輸 average= result/3
print('周長=',length,'面積=',area)
出 輸
print("3個同學平均成績為:",average)

40
程式範例3-求一元
二次方程式的根
求一元二次方程式 x2-3x+2=0的根 ?
根據國中數學, 我們知道 ax2+bx+c=0的根為: −𝒃 ± 𝒃𝟐 − 𝟒𝒂𝒄
𝒙=
𝟐𝒂
𝟐
y**0.5= 𝒚
a=eval(input('a='))
a=1 b=eval(input('b='))
b=-3 c=eval(input('c='))
c=2 x1=(-b+(b*b-4*a*c)**0.5)/(2*a)
x1=(-b+(b*b-4*a*c)**0.5)/(2*a) x2=(-b-(b*b-4*a*c)**0.5)/(2*a)
x2=(-b-(b*b-4*a*c)**0.5)/(2*a) print('x1=',x1,'x2=',x2) a=1
print('x1=',x1,'x2=',x2) b=-3
程式 結果
c=2
程式 結果 x1= 2.0 x2= 1.0
x1= 2.0 x2= 1.0
41 >>> >>>
華氏 = 攝氏*(9/5)+32
攝氏 = (華氏-32)*5/9
✔ 1.寫一程式,輸入三角形的底跟高,求其面積。

2.寫一程式,輸入攝氏溫度,將其轉換成華氏溫度。

(華氏溫度 = 攝氏溫度乘以1.8再加32) # C=10 → F=50

3. 寫一程式,輸入班上5位同學成績,印出全班總分與平均。

4. 寫一程式輸入李四參加三次TOEIC考試所考的分數,求三次

考試的平均分數為何? 第一次考試與平均差幾分呢?

42
流程控制

43
Python流程控制

Python的流程控制分成兩種類型:
• 選擇結構 (decision structure):用來檢查條件式,然後根據結果為
True或False執行不同的命令/敘述,Python支援的選擇結構為 if 。
• 迴圈結構 (loop structure):用來重複執行某些命令/敘述 ,Python
支援的迴圈結構為 for 與 while 。

流程控制經常需要檢查一些資料(條件)是True或False,原則上,以
下的值會被視為False,其它的值則會被視為True:
▫None 或 False。
▫等於0的數值,例如0、0.0。
▫空的序列,例如 ''(空字串)、[](空串列)、()(空序對)。
▫空的對映,例如 {} (空集合)。
44
比較運算子operator
比較運算子
運算子 語法 說明
若a大於b,就傳回True,否則傳回False,例如
> a>b
18 + 3 > 18會得到True。
若a小於b,就傳回True,否則傳回False,例如
< a<b
18 + 3 < 18會得到False。
若a大於等於b,就傳回True,否則傳回False,
>= a >= b
例如18 + 3 >= 21會得到True。
若a小於等於b,就傳回True,否則傳回False,
<= a <= b
例如18 + 3 <= 21會得到True。
若a等於b,就傳回True,否則傳回False,例如
== a == b
21 + 5 == 18 + 8會得到True。
若a不等於b,就傳回True,否則傳回False,例
!= a != b
如21 + 5 != 18 + 8會得到False。

x=2 ? x==2 ? a=b ? (把b的值給a) a==b ? (a與b是否相等)


45
邏輯運算子operator

邏輯運算子
邏輯運算子可以用來進行邏輯運算,Python提供如下的邏輯運算子。

and :語法為x and y,若兩者的值均 or:語法為x or y,若兩者的值均為


為True,就傳回True,否則傳回False False,就傳回False,否則傳回True
x y x and y x y x or y
TRUE TRUE TRUE TRUE TRUE TRUE
TRUE FALSE FALSE TRUE FALSE TRUE
FALSE TRUE FALSE FALSE TRUE TRUE
FALSE FALSE FALSE FALSE FALSE FALSE

x not x
not:語法為not x,若x的值為True,
TRUE FALSE
就傳回False,否則傳回True。
FALSE TRUE
46
if (1/5) 根據條件式,statements 1 或 2只有一個會被執行,
不會兩個都執行(其中 statements 1 或 2可為多行命令)。
雙向 if...else
if condition:
S1 例如:印出及格或不及格與分數
內縮 statements1
else: score = eval(input("請輸入數學分數(0~100):"))
內縮 S2
statements2
if score >= 60: score >= 60 (條件式)
condition S1
如果條件式為真(條件成立) print("及格!")
執行statements 1 (可超過1行) else: 根據條件式,S1 或 S2
S2
否則(條件式為假、不成立) print("不及格!") 只有一個會被執行。
S 3
執行statements 2 (可超過1行) 程式 print(score, "分") 但 S3 一定會被執行。
請輸入數學分數 (0 ~ 100):80
內縮須對齊 及格!
80 分
結果 >>>
S2 內縮 內縮 S1 請輸入數學分數 (0 ~ 100):25
不及格!
25 分
47 S3 不內縮 >>>
if (2/5)
例如:印出及格或不及格與分數 ex7
雙向 if...else
if condition: score = eval(input("請輸入數學分數(0~100):"))
內縮 statements1 (條件真時執行) if score >= 60:
else: print(score, "分分",end="")
內縮 statements2 (條件假時執行) s1
print('及格!')
根據條件式 else:
statements 1 或 2只有一個會 print(score, "分",end="")
被執行,不會兩個都執行。 s2 print("不及格!")
=== RESTART: ..
請輸入數學分數(0~100):80 s3 print("程式結束")
80 分分及格! 根據條件式,s1 或 s2 ,只有一個會
程式結束 被執行。但 s3 一定會被執行。
>>>
=== RESTART: ..
換句話說,
若 score >= 60 (條件式為真) ,則執行s1兩行程
請輸入數學分數(0~100):50
式,之後再執行s3 。否則,若 score >= 60不成
50 分不及格!
立,則執行s2兩行程式,之後再執行 s3 。
程式結束
48 結果 程式
>>>
if (3/5)
內縮 內縮

錯誤寫法範例 不內縮

score = eval(input("請輸入數學分數 (0 ~ 100):")) if score >= 60:


if score >= 60: print("及格!")
輸出?
print("及格!") print(score,'分')
錯誤寫法:
else: else:
print沒有縮排
print("不及格!") print("不及格!")
print(score,'分')
及格才會印分數,不及格不印分數

score = eval(input("請輸入數學分數 (0 ~ 100):")) 請輸入數學分數 (0 ~ 100):56


if score >= 60: 不及格!
s1 程式 結果 56 分
print("及格!")
else: 錯誤寫法: >>>
print("不及格!") s2 請輸入數學分數 (0 ~ 100):90
最後一行s3有縮排
及格!
print(score,'分') s3 僅不及格會印分數
49 >>>
if (4/5)
常見的條件式 --- 運用比較運算子 與 邏輯運算子(and 且, or 或, not 非)

a>b and c>d → a大於b 且 c大於d


a>=b or c>d → a大於等於b 或 c大於d
運算子 意義
c<d and a>=d → c小於d 且 a大於等於d
a > b a 大於 b a>5 or c<1 → a大於5 或 c小於1
a==3 and c!=1 → a等於3 且 c不等於1
a < b a 小於 b

a >= b a 大於等於 b 只有 2<x<=5 時才會印出pass,其他狀況不會


:10
x=eval(input(':')) end
a <= b a 小於等於 b >>>
if x>2 and x<=5:
:3
a == b a 等於 b print("pass") #此行僅在條件成立時才執行 pass
end
print('end')
a != b a 不等於 b 程式 結果 >>>

不建議用
50 if 2< x<=5: OK! if x>2 and x<=5:
if (5/5) 例如:
程式 結果
x=eval(input('x=')) x=10
單向 if x= 10 y= 9 z= 3
y,z=5,3
>>>
if condition: if x>10: x=15

statements x=x-2 1 x= 13 y= 9 z= 2
s >>>
z=z-1
x=8
s2 y=y+4
x= 8 y= 9 z= 3
print('x=',x,'y=',y,'z=',z) >>>

如果x大於10,執行 x=x-2 與 z=z-1後,到 s2


如果x沒有大於10,不執行 s1,直接跳到 s2
s1
if x>7 and y<=-2:
if x==2 or y!=3:
s2 if x==5 and y<4 and z>10:
51
1.寫一程式,輸入x值,輸出y值。若輸入x的值介於50到70(含)
之間,將x的值指定給y,否則y的值為100。
✔ 2.寫一程式,輸入x的值,依其實際值印出

x是奇數 或 x是偶數
若a為奇數 則 a%2 的值為 1
若a為偶數 則 a%2 的值為 0

3. 寫一程式輸入今天的溫度與空氣品質AQI,若溫度高於37
或AQI高於150,印出’避免外出’;其他情況,印出’可依需要
待在戶外’。

52
if score >= 60:
巢狀if (1/2) print("及格!")
else:
巢狀if (超過兩個以上情況) print("不及格!")
巢狀if指的是if敘述裡面包含其它if敘述,而且沒有深度的限制,例如:

100~90 優等 score = eval(input("請輸入數學分數 (0 ~ 100):"))


89~80 甲等 if score >= 90:
79~70 乙等 print("優等")
69~60 丙等 else: 請輸入數學分數 (0 ~ 100):95
0~59 不及格 if score >= 80: 優等
print("甲等") >>>
else: 請輸入數學分數 (0 ~ 100):81
if score >= 70: 甲等
print("乙等") >>>
else: 請輸入數學分數 (0 ~ 100):63
if score >= 60: 丙等
print("丙等") >>>
else: 請輸入數學分數 (0 ~ 100):40
print("不及格") 不及格

程式 結果
53
巢狀if (2/2) ex8 100~90 優等; 89~80 甲等;79~70 乙等; 69~60 丙等…
score = eval(input("請輸入數學分數 (0 ~ 100):"))
if score >= 90:
if condition1: 請輸入數學分數 (0 ~ 100):95
print("優等")
statements1 優等
if ... elif score >= 80: >>>
elif condition2:
print("甲等") 請輸入數學分數 (0 ~ 100):81
statements2
elif ... elif condition3:
elif score >= 70: 甲等
print("乙等") >>>
statements3
elif score >= 60: 請輸入數學分數 (0 ~ 100):63
else: … 丙等
else: print("丙等")
>>>
statementsN+1 else: 請輸入數學分數 (0 ~ 100):40
print("不及格") 不及格

程式 結果
輸出結果跟前頁一樣。此寫法優於前頁的巢狀寫法
1. statements 1~N+1中,僅一個會被執行。
2. elif score >= 80: #OK
➔elif 80<=score<=89: #不好
54 ➔elif score>= 80 and score<=89: #不好
超過兩個以上情況時使用巢狀if

1.寫一程式,輸入a與b值,依其實際值印出 a>b成立 或

a=b成立 或 a<b成立。
2.寫一程式,輸入a、b與c三個值,若
若a>b且a>c 則輸出值為100; 若c>b且c>a 則輸出值為10;
若b>a且b>c 則輸出值為1; 其他情況則輸出值為0;
3.寫一程式,輸入今天賣豆花賺的錢(0~999),印出有 ?個
a=345 則 a//100 的值(整數商)為 3
百元 ?個十元 ?個壹元 a=54 則 a//10 的值(整數商)為 5

4.當兵條件: 身高介於150到190(含)之間;體重介於50到
90(含)間。
寫一程式輸入身高與體重,印出是否需要當兵。
55
range
for (1/6) for var in iterator: list
tuple
內縮 statements1 #可為多行命令
for的語法如下,用來針對可
range(start,stop[,step]) range(stop)
迭代(iteration,或稱迴圈loop)
start:起始值 stop:停止值 step:每次變動值
的物件進行重複運算:

運用類似計數 內縮需對齊
器的概念來控 for i in range(1,5,1):
制迴圈次數。 print(i) 此兩行命令 1
print('你好') 被執行4次 你好
# start=1,stop=5,step=1 2
迴圈內的兩行命令被執行4次 你好
第一次 i=1,印出i與你好 程式 結果 3
第二次 i=2,印出i與你好 你好
第三次 i=3,印出i與你好 4
第四次 i=4,印出i與你好 你好
結束迴圈(因stop=5)
共執行四次迴圈。i=1, 2, 3, 4
56 印出每次i值與四次你好
for (2/6)
range
for var in iterator: list
tuple ex9
內縮 statements1 #可為多行命令

range(stop) range(start,stop[,step]) for i in range(1,12,2): 結

start:起始值 stop:停止值 step:每次變動值 print(i) 果
print('你好') 1
python預設為: start=0 step=1 程 print(i)
你好
for i in range(5):

式 果 # start=1,stop=12,step=2 3
print(i) 此兩行命令 0 迴圈內的兩行命令共執行6次 你好
被執行5次 第一次 i=1,印出i與你好 5
print('你好') 你好 第二次 i=3,印出i與你好
1 你好
#stop=5,迴圈內命令共執行5次 第三次 i=5,印出i與你好
你好 第四次 i=7,印出i與你好 7
第一次 i=0,印出i與你好
第二次 i=1,印出i與你好 2 第五次 i=9,印出i與你好 你好
第六次 i=11, 印出i與你好 9
第三次 i=2,印出i與你好 你好 結束迴圈(因stop=12)並加印i。
第四次 i=3,印出i與你好
3 你好
程式印出每次i值與六次你好
第五次 i=4,印出i與你好 11
你好 最後再印一次i值。
結束迴圈(因stop=5)
4 迴圈共執行六次 你好
共執行五次迴圈。i=0, 1, 2, 3, 4
i=1, 3, 5, 7, 9, 11 11
57 印出每次i值與五次你好 你好
for (3/6) range(stop) range(start,stop[,step])
start:起始值 stop:停止值 step:每次變動值

for i in range(8): #迴圈8次 預設start=0 step=1


程式 結果 i=0,1,2, ..,7
print(i,end=' ') 01234567
ex10 預設step=1
for i in range(1,10): #迴圈9次 i=1,2,3, ..,9
程式 結果 1 2 3 4 5 6 7 8 9
print(i,end=' ')

for i in range(1,10,2): #迴圈5次


結果 13579 i=1,3,5,7,9
print(i,end=' ') 程式

for i in range(10,1,-2): #迴圈5次


結果 10 8 6 4 2 i=10,8,6,4,2
print(i,end=' ') 程式
for i in range(1,11,1):
print(i) 此三行命令
迴圈內命令可超過一行,記得內縮
print('test') 被執行10次
58 print('apple') i=1, 2, 3, .., 10
你好棒!
你好棒!
你好棒!
你好棒!
✔ 1. 運用for指令寫一程式,印出下列數值 你好棒!
ex11
1 6 11 16 21 26 31 參考 謝謝!
謝謝!
2. 運用for指令寫一程式,在螢幕上顯示如右: 謝謝!

✔ 3. 寫一程式,執行從1到99的迴圈,顯示30~50間(含)的偶數。

4. 運用for指令寫一程式,在螢幕上顯示如下兩列數字
參考
13579
11 13 15 17 19
for i in range(2,31,2): ex12
2468
print(i,end=' ')
10 12 14 16
if (i==8 or i==16):
18 20 22 24 26 28 30
print('\n')
59
累加/總和的標準寫法
for (4/6)
s=0 #(初值)
寫程式計算 S=1+5+9+13+17 for i #(loop)
s=1+5+9+13+17 s=s+?
print('S=',s) #累加到目前s值再加上新值
S= 45
迴圈外 s=0
s=0
迴圈內 s=s+?
for i in range(1,18,4): #迴圈5次
s=s+i S= 45
共執行5次迴圈/迭代 s=s+i 可視為 s(new) ← s(old)+i
print('S=',s)
i=1, 5, 9, 13, 17 把s的舊值加上i,放入s的新值中

Iteration 1 (i=1) s ← 0+1 做完後,s=1 做完第1次迴圈,s是前面1個數的總和


Iteration 2 (i=5) s ← 1+5 做完後,s=6 做完第2次迴圈,s是前面2個數的總和
Iteration 3 (i=9) s ← 6+9 做完後,s=15 做完第3次迴圈,s是前面3個數的總和
Iteration 4 (i=13) s ← 15+13 做完後,s=28 …
Iteration 5 (i=17) s ← 28+17 做完後,s=45 做完第5次迴圈,s是前面5個數的總和
60
s=0 #(初值)
迴圈進行累加 for i #(loop)
s=s+?
#累加到目前s值再加上新值
第1個值 第2個值 第3個值 ... 第n個值
迴圈外 s=0
迴圈內 s=s+?

s=s+i
依序把每個值加入s中
概念: s(new) ← s(old)+i
s
s:代表累加迄今的值 把s的舊值加上i,放入s的新值中

使用for迴圈 s=0
執行n次運算 for i in range(1,18,4): #迴圈5次
每一次迴圈把新一個值加入s中 s=s+i 共執行5次迴圈/迭代
→ s = s+ (目前要加入值)
print('S=',s) i=1,5,9,13,17
61 s的初值為0 S= 45
for (5/6) 原本寫法
s=0

ex13 for i in range(1,18,4): #迴圈5次


寫程式計算 S=1+5+9+13+17(同上頁) s=s+i
s=0
print('S=',s)
for i in range(5): #迴圈5次 i=1, 5, 9, 13, 17
s=s+(1+i*4)
print('S=',s) i=0, 1, 2, 3, 4 S=45

s=s+(1+i*4) 可視為 s(new) ← s(old)+(1+i*4)

Iteration 1 (i=0) s ← 0+(1+0*4) 做完後,s=1 計算 S=1/3+1/5+1/7+1/9


Iteration 2 (i=1) s ← 1+(1+1*4) 做完後,s=6
s=0
Iteration 3 (i=2) s ← 6+(1+2*4) 做完後,s=15
Iteration 4 (i=3) s ← 15+(1+3*4) 做完後,s=28 for i in range(3,10,2):
Iteration 5 (i=4) s ← 28+(1+4*4) 做完後,s=45 s=s+(1/i)
print('S=',s)
62 請練習!!! S=4+7+10+13+16+19+22 #91
for (6/6)
累乘的標準寫法
s=1 #(初值)
寫程式計算 S=1*3*5*7
s=1 for i #(loop)
for i in range(3,9,2): s=s*?
#累乘到目前s值再乘上新值
s=s*i
迴圈外 s=1
print('S=',s) S= 105
迴圈內 s=s*?
可視為
s=s*i s(new) ← s(old)*i
計算 S=8*14*20*26
Iteration 1 (i=3) s ← 1*3 做完後,s=3 s=1
Iteration 2 (i=5) s ← 3*5 做完後,s=15 for i in range(8,27,6):
Iteration 3 (i=7) s ← 15*7 做完後,s=105 s=s*i
print('S=',s) S= 58240
63
寫一程式,運用迴圈計算求S
✔ (a) S=2+4+6+8+……+30 # 240
(b) S=3*9*15*21 # 8505
(c) S=1/3+1/5+1/7+1/9+1/11 # 0.8782106….
✔ (d) S=1*5+4*8+7*11+10*14+13*17 # 475
✔ (e) S=(-10)7+(-7)5+(-4)3+(-1)1 # -10016872

64
for i in range(1,11,1):
程式範例(1/2) print('第',i,'位同學',end='')
score= eval(input('成績(0~100):'))
sum=sum+score
已知班上10位同學,輸入全班的數學成績,求全班 avg = sum /10 #此列被執行10次
答案仍對,但較不合理
數學總平均?
利用累加概念
計算總分與平均
sum=0 迴圈外 sum=0
for i in range(1,11,1): 迴圈內 sum=sum+?
每次把一個人的分數累加到sum中
print('第',i,'位同學',end='')
累加十次,sum就是10個人分數總和。
score= eval(input('成績(0~100):'))
sum=sum+score i=1
avg = sum /10 印出'第1位同學成績',輸入成績,
print('total=', sum) sum ← sum+第1人成績
ex14 故sum為前1位同學成績總和。
print('average=', avg)
i=2
持續累加總分,總分累加10次(放迴圈內),
印出'第2位同學成績',輸入成績,
平均僅算1次(放迴圈外)
sum ← sum+第2人成績
第 1 位同學成績(0~100):90 故sum為前2位同學成績總和。
第 2 位同學成績(0~100):80 ….
65 第 3 位同學成績(0~100): . . . 直到 i=10 sum為前10位同學成績總和
程式範例(2/2)
已知班上5位同學,輸入全班的數學與英文成績,求全班數學與英
文的平均分別是多少?
sume=0 英文總分
summ=0 數學總分
for i in range(5):
print('第',i+1,'位同學',end='')
score_m= eval(input('數學成績(0~100):'))
print('第',i+1,'位同學',end='')
score_e= eval(input('英文成績(0~100):'))
sume=sume+score_e
summ=summ+score_m 持續累加總分,總分累加5次(放迴圈內),
avgm = summ /5 平均僅算1次(放迴圈外)

avge= sume/5
print('全班數學平均=', avgm)
print('全班英文平均=', avge)
66
1.假設你今年的體重是40公斤,每年增加1.3公斤,請列出
未來十年的體重。
✔ 2.寫一程式,印出1~100間,所有3的倍數之值。

✔ 3.寫一程式,執行從1到100的迴圈,顯示21~50間(含)的奇數並
計算它們的總和。
# 525

4.寫一程式,印出20~50間(含),所有5的倍數之值並計算他們
的總和。另外,請計算20+21+22+……+49+50的總和。

67
累加→算人數 使用for迴圈,執行n次運算
每一次迴圈把新一個值加入s中
累加
→ s = s+ (目前要加入值)
第1個值 依 s的初值為0
累加

把 算人數
s=s+i
第2個值 每
概念: s(new) ← s(old)+i
個 S
把s的舊值加上i,放入s的新值中
值 s:代表累加
迄今的值
第3個值 加

... 入 使用for迴圈,執行n次運算
s 每一次迴圈,當特定情況發生時,把1加入s中
第n個值
中 → if (特定情況)
算人數
s = s+ 1 (s初值為0)
→ 全班不及格的人數
s=s+1
全班90分以上的人數 概念: s(new) ← s(old)+i
68
全班70分以下的人數 把s的舊值加上1,放入s的新值中
程式範例(1/2)
已知班上n位同學,輸入全班的數學成績,求全班數學總平均,並計
算全班數學不及格人數。 運用累加概念,可計算不及格人數

num= eval(input('輸入全班人數:')) #輸入全班人數放入變數num中 迴


sum=0 #變數sum存放全班數學總分,初值0 圈
f_num=0 #變數f_num存放全班數學不及格人數,初值0 外
for i in range(1,num+1,1):
#印出第?位同學
print('第',i,'位同學',end='') 迴
#輸入第?位同學成績,放入score變數
score= eval(input('成績(0~100):')) 圈
sum=sum+score #將第?位同學成績累加至sum中


if score<60: #如果第?位同學成績小於60分 num
f_num=f_num+1 #將不及格人數f_num的值加上1 次

avg = sum /num; #計算平均



#印出總分 圈
print('total=', sum)
#印出平均 外
print('average=', avg)
print('fail number=',f_num) #印出不及格人數

69 運用累加概念,可計算??人數 迴圈外 f_num=0 迴圈內 f_num=f_num+1


迴圈算最低/高分 使用for迴圈,執行n次運算
每一次迴圈執行時,把值跟min進行
比較。若值小於min,把該值給min

第1個值 min=100 #初值設為100 (?) 確保讀入第1個值


for i in range(1,11,1):
依 min:代表計算
序 print('第',i,'位同學',end='')
第2個值 迄今的最小值

每 score= eval(input('成績(0~100):'))

值 min
第3個值 跟 if score<min:
min
比 min=score
... 較 迴圈算最低分
print(min)
同理 若欲求最大值?
第n個值
將max初值設為0 (??) 迴圈算最高分
迴圈內放 if (score>max):
70 max=score
程式範例(2/2)
已知班上n位同學,輸入全班的數學成績,求全班數學最高分與最低分。
ex15
num= eval(input('輸入全班人數:')) #輸入全班人數放入變數num中

max=0 #變數max存放全班數學最高分,初值0 圈
min=100 #變數min存放全班數學最低分,初值100 外
for i in range(1,num+1,1):
print('第',i,'位同學',end='') #印出第?位同學
score= eval(input('成績(0~100):')) #輸入第?位同學成績,放入score變數 迴

#如果第?位同學成績小於min 內
if score<min:
#將成績存入min中(min存放計算迄今的全班最低分)

min=score num
if score>max: #如果第?位同學成績大於max

max=score #將成績存入max中(max存放計算迄今的全班最高分)


print('minimum score=', min) 圈
print('maximum score=', max) 外

當迴圈執行5次後,min=全班前5人的最低分, max=全班前5人的最高分
當迴圈執行10次後,min=全班前10人的最低分, max=全班前10人的最高分
71 當迴圈執行30次後,min=全班前30人的最低分, max=全班前30人的最高分
✔ 1. 寫程式輸入10位同學成績,印出全班的最高分、最低分與

不及格人數。
2. 寫程式輸入10個數,求其中的最大數、最小數、幾個數小於
0、幾個數是大於10。
3. 寫程式輸入5個數,求值介於30到1(含)之間有幾個? 值介於
60到10(含)之間有幾個?
4.寫程式輸入班上同學參加TOEIC考試的分數,求:
a. 全班最高分 b. 900分以上人數
c.介於600到700分(含)的人數 d. 全班總平均分數。

72 n = (n-1) + (n-2)
應用範例(1/2) 空氣品質分成四類
故使用四個變數記錄每類的天數
AQI值: 代表空氣品質 a,b,c,d=0,0,0,0
for i in range(1,8,1):
若AQI值低於50,則”空氣良 print("輸入第",i,"天AQI",end='')
好”; AQI值較高但低於100, aqi=eval(input(':'))
if aqi<50:
則”空氣普通”; AQI值高於 a=a+1
100低於150,則”敏感族不適 elif aqi<100:
合”; AQI為其他值,則”全部 b=b+1
elif aqi<150:
族群不適合”。 c=c+1
else:
d=d+1
寫一程式輸入一周七天的
print('空氣良好有',a,'天')
AQI,輸出每一種品質各幾 print('空氣普通有',b,'天')
天? print('敏感族群勿外出',c,'天')
print('避免外出有',d,'天')
73
應用範例(2/2) 費氏數列:第一個數是0,第二個數是1,
第n個數的值是 第n-2個數的值+第n-1個數的值
(0, 1, 1, 2, 3, 5, 8, 13, 21,…..)
寫一個程式輸入一個數字n(其中n>=3),請印出費氏數列的

第1到第n個數字。

n=eval(input('number:'))

N_2=0 第n-2個費氏數
第n-1個費氏數
X error
N_1=1
print(N_2,N_1,end=' ') N_2=N_1 N_1=N
for k in range(3,n+1,1): N_1=N N_2=N_1
N=N_2+N_1
print(N, end=' ') number:14
N_2=N_1 0 1 1 2 3 5 8 13 21 34 55 89 144 233
N_1=N
74
雙層for (1/3) 巢狀for迴圈
for i in range(1,10,1):
for i in range(1,11,1):
statements1 (s1) #可為多行命令
statements1 (s1) #可為多行命令
for j in range(7,4,-1):
for j in range(1,4,1): statements2 (s2) #可為多行命令
statements2 (s2) #可為多行命令 執行順序為:
執行順序為: i=3 i=1 i=3
i=1 執行s1 執行s1 執行s1
執行s1 j=1 執行s2 j=7 執行s2 j=7 執行s2
j=1 執行s2 j=2 執行s2 j=6 執行s2 j=6 執行s2
j=2 執行s2 j=3 執行s2 j=5 執行s2 j=5 執行s2
j=3 執行s2(因 j stop=4) …… 結束 (因 j stop=4) 結束 (因 j stop=4)
…..
i=2 i=10 i=2
執行s1 執行s1 執行s1 i=9
j=7 執行s2 執行s1
j=1 執行s2 j=1 執行s2
j=6 執行s2 j=7 執行s2
j=2 執行s2 j=2 執行s2
j=5 執行s2 j=6 執行s2
j=3 執行s2 (因 j stop=4) j=3 執行s2
j=5 執行s2
i=1時,j=1,2,3。 i=2時,j=1, 2, 3。 結束 (因 j stop=4) 結束 (因 j stop=4)
i=1時,j=7, 6, 5。 i=2時,j=7, 6, 5。
i=3時,j=1,2,3。重覆到 i=10 做完結束
i=3時,j=7, 6, 5。重覆到 i=9 做完結束
75 (因 i stop=11)。
(因為 i stop=10)。
雙層for (2/3) ex16
印出 9 9 乘法表
for i in range(1,11,2): i=1時,j從1到9
statements1 (s1) #可為多行命令 for i in range(1,10,1): i=2時,j從1到9
for j in range(1,6,3):
for j in range(1,10,1): i=3時,j從1到9
statements2 (s2) #可為多行命令

print(i,'x',j,'=',i*j)
執行順序為: i=9時,j從1到9
i=5
i=1 1x1=1 結束
執行s1
執行s1 1x2=2 8 x 8 = 64
j=1 執行s2
j=1 執行s2 1x3=3 8 x 9 = 72
j=4 執行s2
j=4 執行s2 1x4=4 9x1=9
……
結束(因j stop=6) 1x5=5 9 x 2 = 18
i=3 i=9
1x6=6 … 9 x 3 = 27
執行s1 執行s1 1x7=7 9 x 4 = 36
j=1 執行s2 j=1 執行s2 1x8=8 9 x 5 = 45
j=4 執行s2 j=4 執行s2 1x9=9 9 x 6 = 54
結束(因j stop=6) 2x1=2 9 x 7 = 63
i=1時,j=1, 4。 i=3時,j=1, 4。 2x2=4 9 x 8 = 72
i=5時,j=1, 4。 i=7時,j=1, 4。 … 9 x 9 = 81
76 i=9時,j=1, 4。結束(因為 i stop=11)
雙層for(3/3) 例如:
巢狀for迴圈 for i in range(1,11,1):
例如:
for i in range(1,11,1): statements1 (s1) 兩個
statements1 (s1) for j in range(1,4,1): 單層迴圈
for j in range(1,4,1): 雙層迴圈 statements2 (s2)
執行順序為:
statements2 (s2)
執行順序為: i=1
i=1 i=9 執行s1
執行s 1 執行s 1
i=2
j=1 執行s 2 j=1 執行s 2
執行s1
j=2 執行s 2 j=2 執行s 2

j=3 執行s (因 j stop=4)
2 j=3 執行s 2
雙層迴圈可依需
i=10
i=2 i=10
執行s1 要延伸成更多層
執行s 1 執行s 1
結束(因i stop=11)
j=1 執行s 2 迴圈,如 (三層、
j=1 執行s 2

j=2 執行s 2 j=1 執行s2 四層…)


j=2 執行s 2

j=3 執行s 2 j=2 執行s2


j=3 執行s (因 j stop=4)
2
j=3 執行s2
i=1時,j=1, 2, 3。 i=2時,j=1, 2, 3。 結束(因j stop=4)
i=3時,j=1, 2, 3。重覆到 i=10 做完結束(因為 i stop=11)。
77
✔1. 自行使用雙層迴圈,印出九九乘法表。

2. 寫程式,使用for指令,計算:
(a) S=4+7+10+13+16+19+22 (b) S=1*4+3*6+5*8+7*10+9*12
✔(c) S=(-10)7+(-8)5+(-6)3+(-4)1 ✔(d) S=1*3*7+3*5*9+5*7*11+7*9*13

(e) S=1/3 + 3/7 + 5/11 + 7/15 ✔(f) S=(3+5)+(3+5+7)+(3+5+7+9) (雙層迴圈)


#(a) S=91 (b) S=240 (c) S= -10032988 (d) S=1360 (e) S= 1.68311.. (f) S=47

78
第1位同學第1次成績:50
成績分數 第1位同學第2次成績:60
第1位同學第3次成績:70
寫一程式,輸入全班10位同學的三次考試 ==> 第1位同學平均為: 60.0
成績,求(a)每位同學的平均分數。
第2位同學第1次成績:20
(b)印出第一次的全班最高分 。 第2位同學第2次成績:30
第2位同學第3次成績:40
(c)第二次的不及格人數。 ==> 第2位同學平均為: 30.0
max_1=0 #第一次的全班最高分
第3位同學第1次成績:40
fail_2=0 #第二次的不及格人數
第3位同學第2次成績:50
#全班10位同學 第3位同學第3次成績:60
for i in range(1,11,1): ==> 第3位同學平均為: 50.0
sum=0 #每位同學的總分
第一次最高分: 50
for j in range(1,4,1): #每位同學有3次成績
第二次不及格人數: 2
score= eval(input('第'+str(i)+'位同學第'+str(j)+'次成績:')) #每位同學每次成績
if (j==1 and score>max_1): #求出第一次的全班最高分
max_1=score
if (j==2 and score<60): #求出第二次的不及格人數
fail_2=fail_2+1
#求每位同學的總分
sum=sum+score
print('==> 第'+str(i)+'位同學平均為:',sum/3,'\n')
print('第一次最高分:',max_1, ' 第二次不及格人數:',fail_2)
79
程式範例(1/2)
第一天存款10元,第二天存款20元,第三天存款40元,每天的存款為前
一天的兩倍,請計算第10天時應存入多少元? 10天共存了多少元?

s=10
s=10 累積到第i天共存入的錢 k=10
k=10 第i天存入的錢 d=eval(input('輸入天數:'))
for i in range(2,11):
for i in range(2,d+1):
k=k*2 k=k*2
s=s+k s=s+k
print('第十天存=',k,'共存=',s) print('第'+str(d)+'天存=',k,'共存=',s)

輸入天數:9
第十天存= 5120 共存= 10230 第9天存= 2560 共存= 5110
>>>
輸入天數:11
第11天存= 10240 共存= 20470
80
>>>
程式範例(2/2)
某人第一天存款1+3+5元,第二天存款1+3+5+7+9元,第三天存
款1+3+5+7+9+11+13元,第四天存款1+3+5+7+9+11+13+15+17
元,依此類推,請計算第10天存多少元?10天共存多少元?
sum=0
d=eval(input('輸入天數:')) 輸入天數:10
輸入天數:3
第1天存: 9
for i in range(1,d+1,1): 第1天存: 9
第2天存: 25
s=0 第2天存: 25
第3天存: 49
for j in range (1,(4*i+2),2): 第3天存: 49
第4天存: 81
s=s+j 共存: 83
第5天存6天存: 169
print('第'+str(i)+'天存:',s) >>>
第7天存: 225
sum=sum+s 第8天存: 289
print('共存:',sum) 第9天存: 361
第10天存: 441
j的停止條件須跟i的變動有關(i加1,停止條件加4)
共存: 1770
i=1 時 j in range(1,6,2)
>>>
i=2 時 j in range(1,10,2)
81 i=3 時 j in range(1,14,2)
✔ 1. 假設電力公司的電費依下列累進方式計算:

100度以下,每度2.2元; 101-300度,每度3.3元; 300度以上,每度4.4元


寫程式輸入用電度數,計算應繳電費。
2. 輸入班上10位同學的國文、英文、數學成績,求:
(a) 三科成績皆90分以上人數 (b) 全班國文最高分 (c)全班數學最低分
(d) 全班英文不及格人數 (e)全班國文英文數學的平均分數分別是多少
✔ 3. 輸入一個數字,印出相對應層數的直角三角形如下所示:
輸入數字:8
X
輸入數字:6 XX
X XXX
XX XXXX
XXX XXXXX
XXXX XXXXXX
XXXXX XXXXXXX
XXXXXX XXXXXXXX

82
!!
while (1/4)

while的語法如下: for i in range(5):



print(i)

while condition: for i in range(0,5,1):
statements1 print(i)
執行5次迴圈(i=0 ~ i=4)
[else:
statements2] 上下寫法得到相同結果

根據條件式來決定
是否持續執行迴圈
i=0 執行5次迴圈(i=0 ~ i=4)
while i < 5:
迴 print(i)

i=i+1
83
while (2/4)
ex17

計算 S=3+4+5+6+7+8+9+10 計算 S=4+7+10+13+16+19+22
s=0 s=0 s=0
s=0
i=3 i=4 for i in range (4,23,3):
for i in range (3,11):
while i<11: while i<23: s=s+i
s=s+i
s=s+i s=s+i print('S=',s)
print('S=',s)
i=i+1 i=i+3
print('S=',s) print('S=',s)
兩者輸出相同: S= 91
兩者輸出相同: S= 52
i初值設在while迴圈外面 i初值設在while迴圈外面

迴圈內 迴圈內

每次迴圈執行須改變i值 (i=i+1) 每次迴圈執行須改變i值 (i=i+3)

才能確保最後迴圈會停止。 才能確保最後迴圈會停止。
84 如何計算 S=3+5+7+9+11+13+15+17 ?
break
輸入成績:30
break: 跳出迴圈(離開迴圈) 輸入成績:40
輸入成績:50
5 輸入成績:-9
6 120
sum=0
i=5 7
while i<100: 8 for i in range (1,999,1):
9 r=eval(input('輸入成績:'))
if i==12:
迴 10
break 11 if r==-9:
圈 print(i) end break
i=i+1 >>> sum=sum+r
print('end')
print(sum)
如果 i為12 (條件成立) 持續輸入每位同學成績並累加總合,
,跳出迴圈,印出end 當輸入-9時代表結束輸入,印出總合
(不用事先知道全班人數)。

85
while (3/4)
寫一程式,持續輸入班上每一位同學的成績,若沒打成績
直接enter時,代表成績輸入已結束。 請印出全班的同學
人數與成績總分。(不用預先知道全班人數!!! 用break跳出迴圈)
ex18
請輸入成績:70
s=0 #變數s存放總分,初值0 請輸入成績:80 直接按
c=0 #變數c存放全班人數,初值0 請輸入成績:90
enter
恆為真(1: true) 請輸入成績:
while 1: #執行無窮多次迴圈 全班人數: 3 全班總分: 240
x=input('請輸入成績:') >>>
if x=='':
break #輸入空字串會跳離開 可嘗試改變不同的停止條件!
恆為真
s=s+eval(x) #累加成績到總分s中 while 1: #執行無窮多次迴圈 (1:true)
c=c+1 #累加計算全班人數c x=eval(input('請輸入成績:'))
if x==999:
print('全班人數:',c,'全班總分:',s)
break #輸入999會跳離開
86
while (4/4) 密碼正確才會離開迴圈,開始
動作 ,往下執行程式 !!!
ex19

ans= input("請輸入密碼:") ans= input("請輸入密碼:")

for i in range (100000):


while ans!='256731': if ans=='256731':
ans = input("錯誤,重新輸入密碼:") break
else:
ans= input("錯誤,重新輸入密碼:")
print("答對了!")
print("答對了!")
print('可以開始使用') print('可以開始使用')
…. …
請輸入密碼:445
錯誤,重新輸入密碼:256731
如何防呆!!! 答對了!
可以開始使用
確保輸入成績 >>>
0<=分數<=100
87
✔ 1.假設電力公司的電費依下列累進方式計算:
100度以下,每度2.2元; 101-300度,每度3.3元; 300度以上,每度4.4元
寫一程式可重複輸入用電度數,計算應繳電費(度數需介於1~950間)。
2.寫一程式輸入10位同學的成績,印出全班的最高分與不及格人數。
成績輸入需有防呆保護,確保所輸入分數是 0<=分數<=100

88
函式

89
認識函式
函式 (function) 是將一段具有某種功能或重複使用的敘述寫成獨立的程
式單元,然後給予名稱,供後續呼叫使用,可簡化程式提高可讀性與
便利性。有些程式語言將函式稱為方法 (method)、程序 (procedure) 或
副程式 (subroutine)。
先前使用過函式: print() input() eval()

… … …
函式
showMsg()

… … … Def show Msg():

showMsg() Statements
呼叫函式
[return|return value]
… … …
[statements]
showMsg()
… … …
每次呼叫均執行相同的敘述
90 (此例:3段一樣的程式➔透過重複呼叫)
常用內建函式

Python內建數值函式 >>> abs(3.5)


3.5
常用的數值函式如下: >>> abs(-4.2)
4.2
•abs(x) 絕對值
>>> min(10,80,35,67,5,8)
5
>>> max(80,90,37,82,91,55)
•min(x1, x2 [, x3…]) 最小值
91
>>> int(5.6)
•max(x1, x2 [, x3…]) 最大值 5
>>> int('6')
•int(x) 轉成整數 6
>>> round(3.6)
•round(x [, precision]) 四捨五入 4
>>> pow(3,2)
•pow(x, y) x的y次方 9
>>> float('6.9')
•float(x) 轉成浮點數 6.9
91
>>>
內建數學 / 亂數函示
數學函式
Python的math模組有一些數學常數和數學函式,常用的如下:
在使用math模組之前,必須使用import指令進行匯入:
亂數函式
>>> import math
Python內建的random模組提供了函式
[Link](x) 傳回x的浮點數絕對值 可以用來產生亂數,常用函式如下。
[Link](x) 傳回x的階乘值 同樣的,在使用random模組之前,必
須使用import指令進行匯入:
[Link](x, y) 傳回x與y的最大公因數
>>> import random
[Link](x) 傳回指數值(ex) [Link](x, y)
[Link](x[, base]) 傳回x的自然對數值 傳回x與y之間的隨機整數
[Link]()
[Link](x) 傳回x的平方根
傳回0.0與1.0之間的隨機浮點數
import math import random
a=[Link](5) x1=[Link](2,7)
b=[Link](2) 2=(2.71828)2 𝟐 x2=[Link]()
c=[Link](9) 5! e 𝟗
print(x1,x2)
print(a,b,c) 120 7.38905609893065 3.0
6 0.32903244981185076
92
函式用法(1/4)
我們可以使用def關鍵字定義函式,其語法如下:
def functionName([parameters]):
statements
[return|return value]
[statements]

函式必須加以呼叫才會執行,其語法如下:

functionName([parameters])

例如:
def CtoF1(degreeC):
degreeF = degreeC * 1.8 + 32 此函式無回傳值!!!
print("攝氏", degreeC, "度可以轉換成華氏", degreeF, "度")

主程式僅 temperatureC = eval(input("請輸入攝氏溫度:"))


執行兩行
CtoF1(temperatureC) 呼叫函式
93
函式用法(2/4)

有return 傳回值的用法

def CtoF1(degreeC):
degree = degreeC * 1.8 + 32
return degree #把degree的值傳回當成函式結果
此函式有回傳值(degree)!!!

主 tempC = eval(input("請輸入攝氏溫度:"))



tempF=CtoF1(tempC) 呼叫函式(呼叫副程式,收回 回傳值)

三 print("攝氏", tempC, "度可以轉換成華氏", tempF, "度")

94
函式用法(3/4)
函式每次呼叫均執行相同的敘述
(此例: 3段一樣的程式➔更改成一個函式重複呼叫)
a=10
b=8
a=10 寫法二
b=8 寫法一
def test(x,y):
x=x+2
a=a+2 y=y-1
b=b-1 左右兩寫法得到相同結果
return x,y
print('a=',a,'b=',b) x,y值回傳給a,b!!
如下:
a,b=test(a,b)
a=a+2 print('a=',a,'b=',b)
b=b-1 a= 12 b= 7
print('a=',a,'b=',b) a= 14 b= 6 a,b=test(a,b)
a= 16 b= 5 print('a=',a,'b=',b)
a=a+2 >>>
b=b-1 a,b=test(a,b)
print('a=',a,'b=',b) print('a=',a,'b=',b)
有一部分的程式(命令、動作)需要
95 經常被執行,可使用函式較方便。
函式用法(4/4)
設計一個函式可以依需要執行累加
(不同的起始、停止與變動值)

def sum(L,H,I):
s=0
for i in range(L,H,I):
s=s+i
程式 結果
return s r= 45
r= 25
r=sum(1,10,1) #呼叫函式計算累加總合 1+2+3+…+9 r= 34
print('r=',r) >>>

r=sum(1,10,2) #呼叫函式計算累加總合 1+3+5+7+9


print('r=',r)

r=sum(1,20,5) #呼叫函式計算累加總合 1+6+11+16


print('r=',r)

96
四則運算函式
題目: 輸入兩數與要進行的運算,輸出結果。
def add(a,b): #執行加法函式
return a+b
def sub(a,b): #執行減法函式
return a-b 結果
def mul(a,b): #執行乘法函式 輸入第一個數:5
return a*b 程式 輸入第二個數:2
def div(a,b): #執行除法函式 1)加法 2)減法 3)乘法 4)除法,輸入你的選擇: 1
return a/b 結果為: 7
while 1:
x=eval(input('輸入第一個數:')) 輸入第一個數:4
輸入第二個數:2
if x==9999: #輸入9999離開迴圈結束程式 1)加法 2)減法 3)乘法 4)除法,輸入你的選擇: 2
break 結果為: 2
y=eval(input('輸入第二個數:'))
c=eval(input('1)加法 2)減法 3)乘法 4)除法,輸入你的選擇: '))
if c==1: 輸入第一個數:8
#依c值決定所執行的四則運算 輸入第二個數:3
result=add(x,y)
1)加法 2)減法 3)乘法 4)除法,輸入你的選擇: 3
elif c==2:
結果為: 24
result=sub(x,y)
elif c==3: 輸入第一個數:6
result=mul(x,y) 輸入第二個數:2
elif c==4: 1)加法 2)減法 3)乘法 4)除法,輸入你的選擇: 4
result=div(x,y) 結果為: 3.0
else:
#若c值不是1~4,結果為0 輸入第一個數:9999
result=0 >>>
print('結果為:',result,'\n')
97
1. 程式隨機產生兩數(介於1~100之間)與要執行的運算(加法或減法),
印出題目並等待使用者輸入結果。
若輸入結果是對,印出”答對了”;若輸入結果是錯,印出”答錯了”
重複執行此加減運算的動作。
提示: 可使用一個加法函式執行加法;一個減法函式執行減法。

import random
[Link](x, y)
傳回x與y之間的隨機整數 x<=回傳值<=y
[Link]()
傳回0.0與1.0之間的隨機浮點數

98
遞迴(函式應用)
1 x 2 x 3 x 4 x ….. x n 1 + 2 + 3 + 4 + ….. + n
計算不同階乘值: 計算不同的累加值:
x = eval(input("請輸入x值:")) x = eval(input("請輸入x值:"))
s=1 s=0
for i in range(1,x+1,1): for i in range(1,x+1,1):
s=s*i s=s+i
print('累乘到x的總和為=', s) print('累加到x的總和為=', s)
x=5 120 x=10 55
x=10 3628800 x=20 210

遞迴函式 (recursive function) 是可以呼叫自己本身的函式。遞迴


函式通常可以用for或while來取代,但因遞迴函式的邏輯性、可讀
性與彈性都比迴圈好用,故是一個很好的使用選擇。
99
遞迴-階乘(1/3) x = eval(input("請輸入x值:"))
s=1
for i in range(1,x+1,1):
遞迴函式是可以呼叫自己本身的函式。 s=s*i
print('累乘到x的總和為=', s)
口訣: 1. 一定要有終止條件。
2. 呼叫自己(遞迴函式)且須讓遞迴函式愈來愈簡單
,最後才能終止。 F(5)
n=5 傳回 5*F(4)
須先呼叫算出F(4)
ex20 F(k): k!的值 邏輯性、可讀性與彈性較佳!!! F(4)
1 x 2 x 3 x 4 x ….. x n n=4 傳回 4*F(3)
須先呼叫算出F(3)
def F(n):
……
if n == 1: # 終止條件。當n = 1時,F(n)=F(1) = 1! = 1
F(2)
return 1 n=2 傳回 2*F(1)
else: 須先呼叫算出F(1)
return n * F(n - 1) #函式簡化,n > 0時,F(n) = n! = n * F(n - 1)
因為F(1)=1
print("1! =", F(1)) 故可得出F(2)..
print("5! =", F(5)) 故可得F(3)…..得F(5)
print("10! =", F(10))
結果
1! = 1
程式
5! = 120
10! = 3628800
100 >>>
遞迴-階乘(2/3)
遞迴-階乘口訣!!
5!=? 欲求得5!的值:
假設你知道4!的值,可將5*4!得到5!的值,
所以需要先求得4!的值。
欲求得4!的值:
假設你知道3!的值,可將4*3!得到4!的值,
所以需要先求得3!的值。

欲求得2!的值:
假設你知道1!的值,可將2*1!得到2!的值,
所以需要先求得1!的值。
➔因為1!=1,所以可以求得2!的值。有了2!的
值,就可以得出3!。有了3!的值,就可以得
出4!。有了4!的值,就可以得出5!。
101
遞迴-階乘(3/3)

def F(n):
if n == 1:
return 1
else: F(1):
return n * F(n - 1) if n == 1:
return 1
F(2):
print('4!=',F(4)) else:
if n == 1:
return n * F(0)
return 1
F(3): else: 2
if n == 1: return n * F(1)
return 1
F(4): else: 3
if n == 1: return n * F(2)
return 1
else: 4
return n * F(3)

102
遞迴-累加(1/3)
遞迴-累加口訣!!
1+2+3+….+x=? sum(x):從1累加到x的總和
欲求得1+2+…+x的總合:
假設你知道1+…+(x-1)的值(簡稱sum(x-1)),可將x+sum(x-1)得解,
所以需要先求得sum(x-1)的值。
欲求得sum(x-1)的值:
假設你知道sum(x-2)的值,可將(x-1)+sum(x-2)得出值,
所以需要先求得sum(x-2)的值。

欲求得sum(2)的值:
假設你知道sum(1)的值,可將2+sum(1)得出值,
所以需要先求得sum(1)的值。
➔因為sum(1)=1,所以可以求得sum(2)的值。有了sum(2)的值,就可以
得出sum(3)。……。有了sum(x-1)的值,就可以得出sum(x)。
103
遞迴-累加(2/3)
sum(x)
輸入整數x,使用遞迴函式計算累加到x值。 S=1+2+3+….+x
ex21
x = eval(input("請輸入x值:"))
def sum(x): 程式 s=0
if x == 1: for i in range(1,x+1,1):
return 1 #終止條件 s=s+i
else: print('累加到x的總和為=', s)
return x+sum(x-1) #遞迴函式簡化
結果
x = eval(input("請輸入x值:")) 請輸入x值:20
result = sum(x) 累加到x的總和為= 210
print('累加到x的總和為=', result) >>>

遞迴口訣:
1. 一定要有終止條件。
2. 呼叫自己(遞迴函式)且須讓遞迴函式愈
來愈簡單,最後才能終止。
104
遞迴-累加(3/3)

def sum(x):
if x == 1:
return 1
sum(1):
else:
if x == 1:
return x+sum(x-1) return 1
sum(2):
else:
if x == 1:
print(sum(4)) return 1
return x+sum(0)
sum(3): else: 2
if x == 1: return x+sum(1)
return 1
sum(4): else: 3
if x == 1: return x+sum(2)
return 1
else: 4
return x+sum(3)

105
遞迴-費氏數列 Fib(x)
輸入整數x,使用遞迴函式計算第x個費氏數的值

費氏數列➔ F1=0 F2=1 Fn=Fn-1+Fn-2 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55

Fib(10)
Fib(k): 第k個費氏數的值
def Fib(x):
Fib(8) + Fib(9)
if x == 1:
return 0 #終止條件
Fib(6) + Fib(7) Fib(7) + Fib(8)
elif x==2:
return 1 #終止條件 ....
else: 程式
return Fib(x-1)+Fib(x-2) #遞迴函式簡化
結果
x = eval(input("請輸入要計算第幾個費氏數:")) 請輸入要計算第幾個費氏數:10
result = Fib(x) 第 10 個費氏數的值為: 55
print('第',x,'個費氏數的值為:',result) >>>

遞迴口訣: Fib(4)

1. 一定要有終止條件。 +
Fib(2) Fib(3)

2. 呼叫自己(遞迴函式)且須讓遞迴 +
* Fib(1) Fib(2)

函式愈來愈簡單,最後才能終止。 * *
106
費氏數列示意圖
def Fib(x):
if x == 1: Fib(2):
return 0 if x == 1:
return 0
elif x==2: elif x==2:
return 1 return 1
else: else:
return Fib(x-1)+Fib(x-2) return Fib(1)+Fib(0)
Fib(3):
if x == 1: Fib(1):
print(Fib(4)) return 0 if x == 1:
Fib(4): elif x==2: return 0
if x == 1: return 1 elif x==2:
return 0 else: return 1
elif x==2: return Fib(2)+Fib(1) else:
return 1 return Fib(1)+Fib(0)
else: Fib(2):
return Fib(3)+Fib(2) if x == 1:
return 0
elif x==2:
return 1
else:
return Fib(1)+Fib(0)
107
遞迴-河內塔(1/4)

Tower of Hanoi

A B C

1
2
3

已知有n個盤子(盤1最小,盤2次小,….,盤n最大)
三根柱子(分別為A柱、B柱、C柱)
要將n個盤子,從A柱搬到C柱(以B柱輔助),要如何搬?
(切記:小盤可以壓在大盤上,但大盤不能壓在小盤上面)

108
遞迴-河內塔(2/4)

要從A搬到C的盤子共有幾個呢? 1 要從A搬到C的盤子共有幾個呢? 4
Move 1th disk from A to C Move 1th disk from A to B
Move 2th dish from A to C
要從A搬到C的盤子共有幾個呢? 2 Move 1th disk from B to C
Move 1th disk from A to B Move 3th dish from A to B
Move 2th dish from A to C Move 1th disk from C to A
Move 1th disk from B to C Move 2th dish from C to B
Move 1th disk from A to B
要從A搬到C的盤子共有幾個呢? 3 Move 4th dish from A to C
Move 1th disk from A to C Move 1th disk from B to C
Move 2th dish from A to B Move 2th dish from B to A
Move 1th disk from C to B Move 1th disk from C to A
Move 3th dish from A to C Move 3th dish from B to C
Move 1th disk from B to A Move 1th disk from A to B
Move 2th dish from B to C Move 2th dish from A to C
Move 1th disk from A to C Move 1th disk from B to C
109
遞迴-河內塔(3/4)
move (個數,來源柱,輔助柱,目的柱)
遞迴口訣: 一個盤子直接搬(終止)
a) 一定要有終止條件 move(3,‘A’,‘ ’,‘C’) 若 n個盤子從A到C
1)將n-1個盤子從A到B
b) 須讓遞迴函式愈來愈 1 2 3
2)第n個盤子從A到C
簡單,最後才能終止。
盤3從‘A’到‘C’ 3)將n-1個盤子從B到C
move(2,‘A’,‘ ’,‘B’) move(2,‘B’,‘ ’,‘C’)

1 2 3 1 2 3

盤2從‘A’到‘B’ 盤2從‘B’到‘C’

move(1,‘A’,‘ ’,‘C’) move(1,‘C’,‘ ’,‘B’) move(1,‘B’,‘ ’,‘A’) move(1,‘A’,‘ ’,‘C’)


結束 結束 結束 結束

要從A搬到C的盤子共有幾個呢? 3
Move 1th disk from A to C
Move 1th disk from B to A
Move 2th dish from A to B
Move 2th dish from B to C
Move 1th disk from C to B
Move 1th disk from A to C
Move 3th dish from A to C
110
遞迴-河內塔(4/4) 若要將n個盤子由A柱搬到C柱,如何進行?
假設已知一函式 move()可移動盤子 ,其中
move (個數,來源柱,輔助柱,目的柱)

ex22 要從A搬到C的盤子共有幾個呢? 4
輔助 Move 1th disk from A to B
def hanoi(n, A, B,C): Move 2th dish from A to C
if(n == 1): 程式 結果 Move 1th disk from B to C
#終止條件 Move 3th dish from A to B
print("Move " +str(n)+"th disk from "+A+" to "+C) Move 1th disk from C to A
else: Move 2th dish from C to B
輔助
hanoi(n-1, A, C, B);
Move 1th disk from A to B
1 #遞迴函式簡化 Move 4th dish from A to C
2 print("Move " +str(n)+"th dish from "+A+" to "+C) Move 1th disk from B to C
hanoi(n-1, B, A, C); #遞迴函式簡化 Move 2th dish from B to A
3 輔助 Move 1th disk from C to A
Move 3th dish from B to C
n=eval(input('要從A搬到C的盤子共有幾個呢? ')) Move 1th disk from A to B
hanoi(n,'A','B','C') Move 2th dish from A to C
Move 1th disk from B to C
111
1.已知第1個數為1,之後每個數是前一個數的2倍加3,
請用遞迴程式求出第n個數的值。

2.某人第一天存款10元,第二天存款20元,第三天存款40元,
每天的存款為前一天的兩倍,請使用遞迴程式計算第10天時
應存入多少元? 10天共存了多少元?

遞迴口訣:
a) 一定要有終止條件
b) 須讓遞迴函式愈來愈簡單,最後才能終止。

112
數值分析-求根(1/3)
求一元二次方程式 x2-3x+2=0的根 ? (一根為1, 一根為2)
解法一: 公式求解法
−𝑏 ± 𝑏 2 − 4𝑎𝑐
根據國中數學, 我們知道 ax2+bx+c=0的根為: 𝑥 = 2𝑎

a=eval(input('a='))
b=eval(input('b='))
𝟐
y**0.5= 𝒚
c=eval(input('c='))
x1=(-b+(b*b-4*a*c)**0.5)/(2*a)
x2=(-b-(b*b-4*a*c)**0.5)/(2*a) a=1
b=-3
print('x1=',x1,'x2=',x2)
程式 結果 c=2
x1= 2.0 x2= 1.0
>>>

113
數值分析-求根(2/3) 解法二: 二分逼近法(程式迴圈)
圖表標題 1 圖表標題
2
L=1.75 H=3 M=2.375 L=1.75 H=2.375 M=2.0625
3 3

2.5
二分法 2.5
二分法
求一元二次方程式
2 2

1.5 1.5

x2-3x+2=0的根 ? 1 1

0.5 0.5
L1 H1 L2
假設已知1.75與3 0 0
H2
之間有一個根;
-1 0 1 2
M 3 4 -1 0 1 2 3 4

-0.5 -0.5
M
Low=1.75 圖表標題
圖表標題
L=1.75 H=2.0625 M=1.90625 L=1.90625 H=2.0625 M=1.984375
High=3 3
3

Mean=(1.75+3)/2 3 4
=2.375
2.5
二分法
2.5
二分法
2
2

f(L)f(M)<0 1.5
1.5
代表中間有夾一個根 ...
1
則L=L 且 H=M 1

f(L)f(M)>0 0.5
0.5

代表中間沒夾一個根 L3 0
0 -1 0 1 2 3 4
則L=M 且 H=H -1 0 1 2 3 4
H4
H3 -0.5
L4
114
-0.5
M M
數值分析-求根(3/3) 解法二: 二分逼近法
(程式迴圈)
求一元二次方程式 x2-3x+2=0的根 ? ex23
3

def f(k): 結果 L=1.75


e=k*k-3*k+2 H=3
2.5
二分法 M= 2.375
return e
2 M= 2.0625
M= 1.90625
1.5
L=eval(input('L=')) M= 1.984375
H=eval(input('H=')) M= 2.0234375
1
while 1: M= 2.00390625
M=(L+H)/2 M= 1.994140625
0.5
print("M=",M) ans= 1.994140625
L1 H1
0
-0.5 0 0.5 1 1.5 2 2.5 3 3.5
if(abs(M-L)<0.01 or abs(f(M))<=0.001):
-0.5 L2 H2 break
Low=1.75 High=3 Mean=2.375 L=0.8 結果
f(1.75)f(2.375)<0 代表中間有夾一個根 if(f(L)*f(M)<0): H=1.6
f(2.375)f(3)>0 代表中間沒有夾一個根 H=M M= 1.2000000000000002
一直重複逼近 M= 1.0
else:
(L=1.75 H=2.375 M=2.0625) ans= 1.0
(L=1.75 H=2.0625 M=1.90625)
L=M
(L=1.90625 H=2.0625 M=1.984375 … print("ans=",M)
115 ➔可延伸更高次方程式,解更多個根
長方形
數值分析-求積分(1/4) 求函數的積分結果(使用面積總和近似法)
𝟑 3.5

積分可視為: 求其面積(右圖紅色) න 𝒙𝟐 − 𝟑𝒙 + 𝟐 =? 3

𝟐.𝟓
➔ 為求 2.5到3間的面積
2.5

先決定要切分成幾個區間,假設如下圖切割成 1.5

4個區間,則總面積≈4個小長方形的面積和 0.5

0
面積和≈f(2.5625)*0.125 (area-1) -0.5
0 0.5 1 1.5 2 2.5 3 3.5

+ f(2.6875)*0.125 (area-2)
+ f(2.8125)*0.125 (area-3) 長方形面積近似法
f1(L+1.5k) f1(L+3.5k)
+ f(2.9375)*0.125 (area-4)
3.5
2.6875 2.9375
𝟑 − 𝟐. 𝟓
= 𝟎. 𝟏𝟐𝟓
𝟒 3
k
總面積≈近似於4個小長 2.5
H
2
方形面積的和。 4個小長
1.5
L
方形的寬皆為0.125,長
1

則是: f(2.5625)、f(2.6875)
0.5

、f(2.8125)、f(2.9375) 1 2 3 4
0
0 0.5 1 1.5 2 2.5 3 3.5

-0.5
2.5625
116 f1(L+0.5k) 2.8125
f1(L+2.5k)
數值分析-求積分(2/4)
求函數的積分結果(長方形面積總和近似法) 10

𝟐 9

න 𝒙𝟐 =?
8

積分可視為: 求其面積
7
𝟎 6

積分準確值應為: 2.667
5
➔ 為求 0到2間的面積 4

先決定要切分成幾個區間 2
1

假設: L代表0;H代表2;切割成S個區間 -2 -1
0
0 1 2 3 4

結果
def f1(k): ex24 L=0
e=k*k H=2
return e Seg=20
ans= 2.6650000000000005
L=eval(input('L='))
H=eval(input('H=')) 結果
S=eval(input('Seg=')) L=0
k=(H-L)/S #長方形的寬 H=2
area1=0 Seg=100
較接近準確值: 2.667
ans= 2.6666000000000003
for i in range(1,S+1,1): 切割區間愈多,可能愈準確;
z=L+((i-0.5)*k) #f1(z)是長方形的長 區間無限多,接近準確值。
area1=area1+k*f1(z) #累加長方形面積
𝟐
𝟏 def f1(k):
print("ans=",area1) න =? e=1/(k+1)
117 𝟎 𝒙+𝟏 return e
梯形
數值分析-求積分(3/4) 求函數的積分結果(使用面積總和近似法)
𝟑 3.5

積分可視為: 求其面積 න 𝒙𝟐 − 𝟑𝒙 + 𝟐 =? 3

𝟐.𝟓
➔ 為求 2.5到3間的面積
2.5

先決定要切分成幾個區間,假設如下圖切割成 1.5

4個區間,則總面積≈4個梯形的面積和 0.5

0
面積和≈(f(2.5)+f(2.625))*0.125*0.5 (area-1) -0.5
0 0.5 1 1.5 2 2.5 3 3.5

+ (f(2.625)+f(2.75))*0.125 *0.5 (area-2)


+ (f(2.75)+f(2.875))*0.125 *0.5 (area-3) 梯形面積近似法
f1(L+2k)
+ (f(2.875)+f(3))*0.125 *0.5
3.5
(area-4) 2.75
𝟑 − 𝟐. 𝟓
= 𝟎. 𝟏𝟐𝟓
𝟒 3
k
總面積≈近似於4個梯形 2.5
H
2
面積的和。 梯形面積=(上
1.5
底+下底)*高*0.5。 梯形 L
1

的高皆為0.125,上下底
0.5

則分別是: f(2.5)、f(2.625) 1 2 3 4
0
0 0.5 1 1.5 2 2.5 3 3.5
、f(2.75)、f(2.875)、f(3)。
-0.5
2.625
118 f1(L+k) 2.875
f1(L+3k)
數值分析-求積分(4/4)
求函數的積分結果(梯形面積總和近似法)
10

𝟐 9

න 𝒙𝟐 =?
8

積分可視為: 求其面積
7
𝟎 6

積分準確值應為: 2.667
5
➔ 為求 0到2間的面積 4

先決定要切分成幾個區間 2
1

假設: L代表0;H代表2;切割成S個區間 -2 -1
0
0 1 2 3 4

def f1(k): ex25 結果


e=k*k L=0
return e H=2
seg=20
L=eval(input('L=')) ans= 2.6700000000000004
H=eval(input('H='))
S=eval(input(‘seg=')) 結果 L=0
k=(H-L)/S #梯形的高 H=2
area1=0 seg=100
ans= 2.6668
>>> 較接近準確值: 2.667
for i in range(0,S,1):
area1=area1+k*(f1(L+i*k)+f1(L+(i+1)*k))/2 切割區間愈多,可能愈準確;
#累加梯形面積,上底f1(L+i*k),下底 f1(L+(i+1)*k) 區間無限多,接近準確值。
𝟐
𝟏 def f1(k):
print("ans=",area1) න =? e=1/(k+1)
119 𝟎 𝒙+𝟏 return e
1.分別使用長方形面積近似法與梯形面積法,求下列積分值:

𝟐 𝟐 𝟐
a. න 𝒙 𝟒 =? b. න 𝒔𝒊𝒏 𝒙 =? c. න 𝒆 𝒙 =?
𝟎 𝟎 𝟎

#6.400 #1.416 #6.389

2.使用二分逼近法,求下列的根: (迴圈最多執行6次)
a.方程式 2x2-5x+1=0 有1個根在2與3之間。
b.方程式 3x2-7x+2=0 有1個根在1.5與2.4之間。

!!
120
串列應用

121
程式範例 – 問題
已知班上10位同學,求數學成績的總分、平均與不及格人數。

sum=0 ex26
f=0
for i in range(1,11,1):
print('第',i, '位同學',end='')
score= eval(input('成績(0~100):'))
sum=sum+score 計算總分
if(score<60): 持續累加總分
計算不及格人數
f=f+1 總分累加10次
avg = sum /10; 計算平均 平均僅算1次
print('total=', sum)
print('average=', avg)
print('fail=',f)

本解法的問題: 每次輸入成績皆放於變數score,前面幾位同學的成
績並無保留,未來無法使用前面已輸入過的成績(僅保留最後一位成
績score與前面成績總合sum)。 ➔應用串列來解決!
122
list (串列) (1/6)
list:表示串列,這是由一連串資料所組成、有順序且可改變內容的序列。
例如: [1, 'Taipei', 2, 'Tokyo'][2, 'Tokyo', 1, 'Taipei']
建立串列
list (串列) 是由一連串資料所組成、有順序且可改變內容的序列。串
列的前後以中括號標示,裡面的資料以逗號隔開,資料的型別可以
不同。 我們可以使用Python內建的list()函式建立串列,例如:
>>> list1 = list()
>>> list1
[]
>>> list2 = list([1, 2, 3])
>>> list2
[1, 2, 3]

或者,也可以直接使用 [] 寫成如下:

>>> list1 = []
123
>>> list2 = [1, 2, 3]
list (串列) (2/6) L[0]➔5
L[1]➔10
索引與片段運算子 L[4]➔25

可以使用索引運算子 ([]) 取得串列的元素,舉例來說,假設變數L的值為 [5,


10, 15, 20, 25, 30, 35, 40, 45, 50],其存放順序如下, L[0]、L[1]、…、L[9] 表
示5、10、…、50;而亦可用L[-1]、L[-2]、…、L[-10] 表示50、45、…、5。
如下:
我們也可以使用片段運算子 ([start:end]) 指定索引範圍,例如:
索引 0 1 2 3 4 5 6 7 8 9
內容 5 10 15 20 25 30 35 40 45 50
索引 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

>>> L = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
>>> L[2:5]
[15, 20, 25]
>>> L[3:7]
[20, 25, 30, 35]
124
list(串列) (3/6)

已知班上10位同學數學成績,求成績的總分、平均與不及格人數。
s[0]=90 s[1]=60 s[2]=50…….s[9]=88
10個變數
寫法一 寫法二
sum=0 sum=0
f=0 f=0
for i in range(1,11,1): s=[90,60,50,40,30,20,80,70,50,88]
print('第',i,'位同學',end='') for i in range(0,10,1):
score= eval(input('成績(0~100):'))
sum=sum+s[i]
sum=sum+score
if score<60: if s[i]<60:
f=f+1 f=f+1
avg = sum /10; avg = sum /10;
print('total=', sum) print('total=', sum)
print('average=', avg) print('average=', avg)
print('fail=',f) ex26 print('fail=',f) ex27
持續累加總分 total= 578
總分累加10次 不及格檢查10次 average= 57.8
125 平均僅算1次 fail= 5
list(串列) (4/6)
已知班上10位同學數學成績,求成績的總分、平均與不及格人數。
函式的應用 ex28
s[0]=90 s[1]=60 s[2]=50…… s[9]=88 def suma(x): 寫法三
g=0
ex27 寫法二 for i in range(0,10,1): suma函式
sum=0 g=g+x[i]
f=0 return g 累加總分
s=[90,60,50,40,30,20,80,70,50,88] def fail(x):
for i in range(0,10,1): c=0
sum=sum+s[i] for i in range(0,10,1):
if(x[i]<60): fail函式
if(s[i]<60): c=c+1 算不及格人數
f=f+1 return c
avg = sum /10; sum,f=0,0
print('total=', sum) s=[90,60,50,40,30,20,80,70,50,88]
print('average=', avg) sum=suma(s)
print('fail=',f) f=fail(s)
avg = sum /10;
total= 578 print('total=', sum)
average= 57.8 print('average=', avg)
126 print('fail=',f )
fail= 5
list(串列) (5/6)
第0位同學 成績:50
第1位同學 成績:60
第2位同學 成績:70
k=[] #空串列 第3位同學 成績:80
for i in range(10): 第4位同學 成績:20
print("第"+str(i)+"位同學",'成績',end='') 第5位同學 成績:40
score=eval(input(':')) 第6位同學 成績:50
[Link](score) 第7位同學 成績:60
第8位同學 成績:60
# 迴圈10次
for i in range(10): # i = 0~9 第9位同學 成績:80
print(k[i]) #共插入10個值於k串列 50
60
70
串列 k (初始是空的,因為k=[]),依序插入十位同學成績
80
20
50 60 70 80 20 40 50 60 60 80
40
k[0] k[1] k[2] k[3] k[4] k[5] k[6] k[7] k[8] k[9] 50
60
append 可於串列尾端插入一個新元素 60
str()可將數值轉換成字串 80
127
list(串列) (6/6) 第1位同學 成績:60
第2位同學 成績:70
第3位同學 成績:80
ex29 第4位同學 成績:98
k=[] 第5位同學 成績:76
for i in range(10): #輸入10位同學成績 第6位同學 成績:58
print("第"+str(i+1)+"位同學",'成績',end='') 第7位同學 成績:70

score=eval(input(':')) 第8位同學 成績:82

[Link](score) 第9位同學 成績:91
10次
s=0 第10位同學 成績:55
max=0 k[0] k[1] k[2] k[3] k[4] k[5] k[6] k[7] k[8] k[9] 60
for i in range(10): 70
s=s+k[i] #累加迄今的總分 80

if k[i]>max: 98

10次 max=k[i] #測試迄今最高分 76
58
for i in range(10): 70

print(k[i]) #印出10位同學成績 82

10次 91
print('總分=',s,'最高分=',max) 55
總分= 740 最高分= 98
128 >>>
串列練習題(1/3)
輸入班上5位同學的國文、英文、數學成績,求:
(a) 三科成績皆90分(含)以上人數 (b) 全班國文分數最高分
(c) 全班數學分數最低分 (d) 全班英文不及格人數
(e) 全班國文英文數學的平均分數分別是多少
未使用串列的寫法
ex30
above=0
max_c=0
解 min_m=100
法 fail_e=0
sum_c,sum_e,sum_m=0,0,0

num=eval(input('輸入班上同學總人數:')) #決定迴圈做幾次
for i in range(num):
score_c= eval(input('第'+str(i+1)+'位同學國文成績(0~100):'))
迴 score_e= eval(input('第'+str(i+1)+'位同學英文成績(0~100):'))
圈 score_m= eval(input('第'+str(i+1)+'位同學數學成績(0~100):'))
129
串列練習題(2/3)
(a) 三科成績皆90分(含)以上人數 (b) 全班國文分數最高分
(c) 全班數學分數最低分 (d) 全班英文不及格人數
(e) 全班國文英文數學的平均分數分別是多少
if score_c>=90 and score_e>=90 and score_m>=90: ex30
above=above+1
if score_c>max_c:
max_c=score_c
if score_m<min_m:
min_m=score_m print('三科皆90分人數=',above)
迴 if score_e<60:
圈 print('國文最高分=',max_c)
fail_e=fail_e+1
sum_c=sum_c+score_c print('數學最低分=',min_m)
sum_e=sum_e+score_e print('英文不及格人數=',fail_e)
sum_m=sum_m+score_m

avg_c=sum_c/num
avg_e=sum_e/num
avg_m=sum_m/num
print('國文平均=',avg_c,'英文平均=',avg_e,'數學平均=',avg_m)

130 此寫法,僅保留最後一位同學的國英數三科成績,其他前面輸入的同學成績皆無保留。
串列C存放n位同學的國文成績
串列練習題(3/3)
C[0] C[1] C[2] … … C[n-1]
串列E存放n位同學的英文成績
n=eval(input('輸入全班人數:'))
C=[] E[0] E[1] E[2] … … E[n-1]
E=[] 串列M存放n位同學的數學成績
M=[]
for i in range(n): M[0] M[1] M[2] … … M[n-1]
score=eval(input('第'+str(i+1)+'位同學國文成績:'))
[Link](score)
score=eval(input('第'+str(i+1)+'位同學英文成績:'))
[Link](score)
score=eval(input('第'+str(i+1)+'位同學數學成績:'))
[Link](score)
h,max_c,min_m=0,0,100 (a) 三科成績皆90分(含)以上人數
for i in range(n): (b) 全班國文分數最高分
if(C[i]>=90 and E[i]>=90 and M[i]>=90):
h=h+1 if M[i]>min_m:
min_m=M[i]
if(C[i]>max_c):
if E[i]<60:
131 max_c=C[i] ….. fail_e=fail_e+1 …..
二維串列(1/3)
二維串列 (二維陣列)
二維串列是串列的延伸,任何平面的二維表格或矩陣,都可使用二維
串列來存放。例如下圖是一個5列3行的成績單,我們可以透過下面的
敘述定義一個名稱為scores,5×3的二維串列來存放此成績單:

>>> scores = [[95, 100, 100], [86, 90, 75], [98, 98, 96], [78, 90, 80], [70, 68, 72]]
若要存取這個二維串列,必須使用兩個索引,以此成績單為例,我
們可以使用兩個索引將它表示成如右下圖,第一個索引是列索引
(row index),而第二個索引是行索引 (column index)。
column(行)
國文 英文 數學 國文 英文 數學

學生1 95 100 100 學生1 [0][0] [0][1] [0][2] row 0
學生2 86 90 75 學生2 [1][0] [1][1] [1][2] row 1
學生3 98 98 96 學生3 [2][0] [2][1] [2][2]
學生4 78 90 80 學生4 [3][0] [3][1] [3][2]
學生5 70 68 72 學生5 [4][0] [4][1] [4][2] row 4

132
二維串列(2/3)
ex31
下面是一個例子,它會根據這個成績單印出每位學生的總分。

[0][0] [0][1] [0][2] [1][0] [1][1]

scores = [[95, 100, 100], [86, 90, 75], [98, 98, 96], [78, 90, 80], [70, 68, 72]]
for i in range(5): i=0 j=0, 1, 2
total=0 i=1 j=0, 1, 2
for j in range(3):
i=2 j=0, 1, 2
學生 1 的總分為 295
i=3 j=0, 1, 2
total=total+scores[i][j] 學生 2 的總分為 251
i=4 j=0, 1, 2
scores[i].append(total) 學生 3 的總分為 292
學生 4 的總分為 248
for i in range(5):
學生 5 的總分為 210
print("學生", i + 1, "的總分為", scores[i][3])
print(scores) [[95, 100, 100, 295], [86, 90, 75, 251],
[98, 98, 96, 292], [78, 90, 80, 248],
[70, 68, 72, 210]]
133
二維串列(3/3)

如何建立二維串列並輸入其值呢?
scores = [[95, 100, 100], [86, 90, 75],[98, 98, 96], [78, 90, 80], [70, 68, 72]]
ex32
scores=[]
for i in range(5):
k=[] #k為空串列
for j in range(3):
sc=eval(input('第'+str(i+1)+'位同學 第'+str(j+1)+'科成績:'))
[Link](sc) #k串列含三科成績
[Link](k) 第1位同學 第1科成績:95
for i in range(5):
第1位同學 第2科成績:100
for j in range(3):
print(scores[i][j]) 第1位同學 第3科成績:100
print(scores) 第2位同學 第1科成績:86
………
134
寫一程式,使用串列,輸入班上5位同學的國文與英文成績,求:
(a) 全班國文分數最高分 (b) 全班英文不及格人數

請分別使用a)一維串列
b)二維串列 完成此程式。

135
檔案

136
認識檔案路徑
Python 使用"/ "比較簡單
•無論是文字、圖形、資料或程式,均以 儘量不要使用 "\ "
檔案 (file)的形式存放在儲存裝置中。 檔案路徑的指定方式有下列兩種:
使用者可以將數個檔案存放在目錄  絕對路徑 (absolute path):
(directory)或資料夾(folder)中。
這種方式必須寫出根目錄、所有子

•目錄具有階層式結構,下圖是Windows 目錄及檔案名稱,例如C:\Program

檔案總管,左窗格顯示樹狀目錄,右窗 Files\Microsoft
格會顯示目前資料夾的內容。按一下網 Office\Office\[Link]。
址列會顯示目前資料夾的路徑。  相對路徑 (relative path):
這種方式必須寫出從目前目錄到檔
案所經過的子目錄,舉例來說,假
設目前目錄為C:\Program
Files\Microsoft Office,若要以相對
路徑表示檔案[Link],可以寫成
\Office\[Link]。
137
檔案讀寫
開檔➔寫入資料➔關檔 Python 使用"/ "比較簡單
開檔➔讀出資料➔關檔 儘量不要使用 "\ "
建立檔案物件
我們可以使用Python內建的open() 函式建立檔案物件,其語法如下,當建立成
功時,會傳回檔案物件,相反的,當建立失敗時,會發生錯誤:
open(file, mode)

mode 'r' open for reading (default)


'w' open for writing, truncating the file first
'a' open for writing, appending to the end of the file if it exists

打開一個檔案([Link]),
例如:
此檔案位置在C槽temp目錄下
>>> fileObject = open("C:/temp/[Link]", "r")
另一個例子
>>> fi = open("./[Link] ", "r") 打開一個檔案([Link]),此檔案位置在目前
>>> fi = open("[Link] ", "r") 的目錄(python程式所在) (兩種寫法皆可)

變數 fileObject 與 fi 指向所開啟的檔案物件(準備進行讀取)。
138
寫入檔案(1/2)

將資料寫入檔案
將資料寫入檔案的步驟如下:
1. 開啟檔案:使用open() 函式建立檔案物件。
2. 寫入檔案:使用檔案物件提供的write(s) 方法將參數s 所指定的字串
寫入檔案。
3. 關閉檔案:使用檔案物件提供的close() 方法關閉檔案。
例如:

>>> fi = open("./[Link]", "w") #開檔(目前目錄)

>>> [Link]("登金陵鳳凰台") #寫入

6
>>> [Link]() #關檔
>>>
139
寫入檔案(2/2)

file1=open("./[Link]", "w") #開檔(目前目錄)


[Link]('天氣很棒') #寫入檔案 輸入第1個數:10
[Link]('! '+'你好嗎?') 輸入第2個數:20
#關檔 輸入第3個數:30
[Link]()
輸入第4個數:40
輸入第5個數:50
file2= open("./[Link]", "w") #開檔(目前目錄)
輸入第6個數:60
for i in range (1,11,1): 輸入第7個數:70
輸入第8個數:80
s=input('輸入第'+str(i)+'個數:') #鍵入第i個數的值
輸入第9個數:90
[Link](s+',') #寫入檔案
輸入第10個數:100
[Link]() #關檔 >>>

140
讀取檔案
從檔案讀取資料的步驟如下:
1. 開啟檔案:使用open() 函式建立檔案物件。
2. 讀取檔案:使用檔案物件提供的read()、readline() 或readlines() 方法讀取資料。
3. 關閉檔案:使用檔案物件提供的close() 方法關閉檔案。
使用read() 方法從檔案讀取資料
在開啟檔案後,我們可以使用檔案物件提供的read() 方法讀取資料,例如:

>>> fi = open("./[Link]", "r") #開檔


>>> content = [Link]() #讀取
>>> print(content) >>> str1= [Link](6)
登金陵鳳凰台 >>> print(str1)
鳳凰臺上鳳凰遊,鳳去臺空江自流。
登金陵鳳凰台
吳宮花草埋幽徑,晉代衣冠成古邱。
三山半落青又外,二水中分白鷺洲。
總為浮雲能蔽日,長安不見使人愁。 #從fi處讀取6個文字
>>> [Link]() #關檔
141
程式範例(1/2) 不需要在程式執行時,才輸入成績。
可以事先將成績存在檔案中,以利使用(易程式除錯) [Link]
檔案內容可用記事本編輯!!!
90
已知班上10位同學數學成績, 使用記事本,事先打入如 60
求成績的總分、平均與不及格人數。 右方10個分數 50
40
s[0]=90 s[1]=60 s[2]=50…….s[9]=88 sum=0 30
f=0 20
sum=0 寫法二 80
f=0 s=[]
70
50
s=[90,60,50,40,30,20,80,70,50,88] fi= open("./[Link]", "r") 88
for i in range(0,10,1): for i in range(0,10,1):
sum=sum+s[i] [Link](eval([Link]()))
[Link]()
if(s[i]<60):
# 此時 s=[90,60,50,40,30,20,80,70,50,88]
f=f+1 for i in range(0,10,1):
avg = sum /10; sum=sum+s[i]
print('total=', sum) if s[i]<60:
print('average=', avg) f=f+1
ex27 avg = sum /10;
print('fail=',f )
print('total=', sum)
total= 578 print('average=', avg) ex33
average= 57.8 print('fail=',f )
142 fail= 5
程式範例(2/2) 使用記事本,打入如下方10個分數。
[Link]
已知班上10位同學數學成績, 90,60,50,40,30,20,80,70,50,88
求成績的總分、平均與不及格人數。 sum=0
f=0
[Link] sum=0 s=[]
f=0 fi= open("./[Link]", "r")
90 s=[] m=[Link]()
60 fi= open("./[Link] ", "r") k=[Link](',')
50 for i in range(0,10,1): for i in range(0,10,1):
40 [Link](eval([Link]())) [Link](eval(k[i]))
30 [Link]() [Link]()
20 # 此時 s=[90,60,50,40,30,20,80,70,50,88] # 此時 s=[90,60,50,40,30,20,80,70,50,88]
80 for i in range(0,10,1): for i in range(0,10,1):
70 sum=sum+s[i] sum=sum+s[i]
50 if s[i]<60: if s[i]<60:
88 f=f+1 f=f+1
avg = sum/10; avg = sum/10;
print('total=', sum) print('total=', sum)
print('average=', avg) print('average=', avg)
ex33 ex34
print('fail=',f) print('fail=',f)
143
寫一程式計算累加結果,如: X= 1+2+3+….+30
Y= 1+3+5+7+….+19。
從一個檔案讀入三個值,(起始值、停止值、變動值),
計算累加結果。
如上例: 欲計算X,此三個值分別設為1、30、1
欲計算Y,此三個值分別設為1、19、2
a)假設輸入檔案(.txt)內容為 1,30,1 或 1,19,2

b)假設輸入檔案(.txt)內容為 1 1
30 或 19
1 2
144
影像處理

145
影像處理範例(1/5)

每張照片(picture/image/frame)是用一個一個點(dot)來表示/儲存,這些
點稱為像素(pixels)。一張照片的解析度可用像素來代表。每個像素有
R、G、B三原色值。

pixels 400 ×400 pixels (R, G, and B)

0 399
0 …
… 8 bits 可以區別 256 色調,

… 假設R,G,B分別都有256色,

399 每個pixel像素需要 8x3=24 bits


(因為每個像素都有不同的RGB)
0 <= R, G, B <=255
400  400  8  3 = 3.84 Mega bits
146 = 0.48 Mega bytes
影像處理範例(2/5) pip可管理python套件
pillow:影像處理套件 0 <= R, G, B <=255
命令提示字元(CMD): 輸入 pip install pillow 值愈大愈亮、愈小愈暗
輸入一張照片([Link]),將該照片變暗,並輸出([Link])
for i in range (height):
from PIL import Image for j in range (width):
r,g,b=test[j,i]
if r<100:
inp = [Link]('[Link]').convert('RGB')
r=0
#open the Image and convert it to RGB else:
r=r-100
test=[Link]() #store every pixel to list---test if g<100:
width,height=[Link] g=0
else:
[Link] [Link] g=g-100
if b<100:
b=0
可加入1行: else:
[Link]() b=b-100
直接看結果圖 test[j,i]=(r,g,b)
[Link]('[Link]') ex35
147
影像處理範例(3/5)
0 <= R, G, B <=255

輸入一張照片([Link]),將高>500的像素pixels變暗,並輸出([Link])
for i in range (height):
from PIL import Image for j in range (width):
r,g,b=test[j,i]
inp = [Link]('[Link]').convert('RGB') if i>500:
#open the Image and convert it to RGB if r<100:
r=0
else:
test=[Link]() #store every pixel to list---test
r=r-100
if g<100:
width,height=[Link] g=0
[Link] [Link] else:
可加入1行: g=g-100
[Link]() if b<100:
直接看結果圖 b=0
else:
b=b-100
test[j,i]=(r,g,b)
[Link]('[Link]') ex36
148
影像處理範例(4/5)
0 <= R, G, B <=255

輸入一張照片([Link]),將其進行灰階處理,並輸出([Link])

from PIL import Image r(新) = (r(舊)+g(舊)+b(舊) ) / 3


g(新) = (r(舊)+g(舊)+b(舊) ) / 3
inp = [Link]('[Link]').convert('RGB')
#open the Image and convert it to RGB b(新) = (r(舊)+g(舊)+b(舊) ) / 3

test=[Link]() #store every pixel to list---test


for i in range (height):
width,height=[Link] for j in range (width):
[Link] [Link]
r,g,b=test[j,i]

f=int((r+g+b)/3)

test[j,i]=(f,f,f)

149 [Link]('[Link]') ex37


影像處理範例(5/5)
0 <= R, G, B <=255
0 399
輸入一張照片([Link]),將其進行負片處理,並輸出([Link]) 0 …


from PIL import Image r(新) = 255-r(舊)


399

inp = [Link]('[Link]').convert('RGB') g(新) = 255-g(舊)


低通濾波
#open the Image and convert it to RGB b(新) = 255-b(舊) 去雜訊
平滑影像
test=[Link]() #store every pixel to list---test for i in range (height):
使用3x3的mask
for j in range (width): 從左上到右下角
width,height=[Link] r,g,b=test[j,i] 一次移動一個
r=255-r pixel來執行
[Link] [Link]
g=255-g
1 1 1
b=255-b 1/9 1 1 1
1 1 1
test[j,i]=(r,g,b)
1 2 1
[Link]('[Link]') ex38 1/16 2 4 2
150 1 2 1
可任選前面一個影像處理範例來執行並理解其內容。

151
圖表繪製

152
圖表繪製範例(1/4) 命令提示字元(CMD): 輸入 pip install matplotlib

求一元二次方程式 x2-3x+2=0的根 ? (一根為1, 一根為2)


Y=X2-3X+2 (0.5<=X<=2.5),試畫出xy座標圖。
import [Link] as plt
x=[]
y=[]
i=0.5
while i<=2.5:
[Link](i)
k=i*i-3*i+2
[Link](k)
i=i+0.01

[Link](x, y, '.')
[Link]('X')
[Link]('Y')
[Link]('Y=X^2-3X+2')
[Link]()
153 ex39
圖表繪製範例(2/4)
開心農場共生產apple、orange、pear與banana四種水果,一年四種
水果的銷售額分別是300、200、300與450萬元,試畫出xy座標圖。
import [Link] as plt
A='apple'
a=300
B='orange'
b=200
C='pear'
c=300
D='banana'
d=450
lab=A,B,C,D #種類
vol=a,b,c,d #數量

[Link](lab, vol, 'o')


[Link]('Fruits')
[Link]('Money')
[Link]('Happy Farm') ex40
154 [Link]()
圖表繪製範例(3/4)
開心農場共生產apple、orange、pear與banana四種水果,一年四種
水果的銷售額分別是300、200、300與450萬元,試畫出長條圖。
import [Link] as plt
A='apple'
a=300
B='orange'
b=200
C='pear'
c=300
D='banana'
d=450
lab=A,B,C,D #種類
vol=a,b,c,d #數量

[Link](x=lab, height=vol)
[Link]('Fruits')
[Link]('Money')
[Link]('Happy Farm') ex41
155 [Link]()
圖表繪製範例(4/4)
開心農場共生產apple、orange、pear與banana四種水果,一年四種
水果的銷售額分別是300、200、300與450萬元,試畫出扇形圖。

import [Link] as plt


A='apple'
a=300
B='orange'
b=200
C='pear'
c=300
D='banana'
d=450
lab=A,B,C,D #種類
vol=a,b,c,d #數量
exp=0,0.1,0,0 #扇形分開

[Link](vol, labels=lab, autopct='%.2f %%', explode=exp)


[Link]()
ex42
156
1.輸入班上15位同學的英文成績,以10分為一級距試,畫出班上
各級距的人數分布圖。輸入班上20位同學的TOEIC成績,以50分
為一級距試,畫出班上各級距的人數分布圖。
2.開心農場飼養下列動物與個數:
cow:40 sheep:25 duck:13 chicken:30 others:60
試畫出各類動物分布圖。
3.輸入班上10位同學的英文成績,求及格與不及格人數? 及格同
學的平均分數? 不及格同學的平均分數? 試加入圖表呈現。
4.試產生一個qrcode連結到成大主網頁。
命令提示字元(CMD): 輸入 pip install qrcode

import qrcode
from PIL import Image
im=[Link]('[Link]')
157 [Link]()
線性變換 四種線性變換
1.對x軸鏡射
線性變換: 𝒙′ 𝟏 𝟎 𝒙
=
假設有一點𝑨(𝒙, 𝒚),經過變換後得到 𝒚′ 𝟎 −𝟏 𝒚
另一點𝑨′(𝒙′, 𝒚′) ,若滿足下式:
2.對y軸鏡射
𝒙’ = 𝒂𝒙 + 𝒃𝒚
ቊ ′ 𝒙′ −𝟏 𝟎 𝒙
𝒚 = 𝒄𝒙 + 𝒅𝒚 =
𝒚′ 𝟎 𝟏 𝒚

則此座標變換可稱之為線性變換。
3.伸縮(x方向h倍; y方向v倍)

上述變換,可以用矩陣表示成: 𝒙′ 𝒉 𝟎 𝒙
=
𝒚′ 𝟎 𝒗 𝒚
𝒙′ 𝒂 𝒃 𝒙 4.旋轉(逆時針轉𝜽角度)
=
𝒚′ 𝒄 𝒅 𝒚
𝒙′ 𝐜𝐨𝐬 𝜽 −𝐬𝐢𝐧 𝜽 𝒙
=
𝒚′ 𝐬𝐢𝐧 𝜽 𝐜𝐨𝐬 𝜽 𝒚
158
對x軸鏡射
import [Link] as plt ex43
x=[2,4,3]
y=[2,2,6]
[Link]([1,5])
[Link]([-8,8])
2 4 2 2
[Link]([x[0],x[1]],[y[0],y[1]],linestyle='-')
4 3 2 6
[Link]([x[1],x[2]],[y[1],y[2]],linestyle='--')
3 2 6 2
[Link]([x[2],x[0]],[y[2],y[0]],linestyle=':')
a,b,c,d=1,0,0,-1
nx,ny=x,y 三角形
for i in range (0,3,1): (2,2)➔(4,2)➔(3,6)➔(2,2)
nx[i]=a*x[i]+b*y[i]
𝒙′ 𝒂 𝒃 𝒙
ny[i]=c*x[i]+d*y[i] =
[Link]([nx[0],nx[1]],[ny[0],ny[1]],linestyle='-')
𝒚′ 𝒄 𝒅 𝒚
[Link]([nx[1],nx[2]],[ny[1],ny[2]],linestyle='--') 𝒙′ 𝟏 𝟎 𝒙
=
[Link]([nx[2],nx[0]],[ny[2],ny[0]],linestyle=':') 𝒚′ 𝟎 −𝟏 𝒚
159 [Link]()
對y軸鏡射
import [Link] as plt
x=[0.5,1.5,1] ex44
y=[1,1,3]
[Link]([-1.5,1.5])
[Link]([-1,5])
0.5 1.5 1 1
[Link]([x[0],x[1]],[y[0],y[1]],linestyle='-')
[Link]([x[1],x[2]],[y[1],y[2]],linestyle='--')
[Link]([x[2],x[0]],[y[2],y[0]],linestyle=':')
a,b,c,d=-1,0,0,1
三角形
nx,ny=x,y (0.5,1)➔(1.5,1)➔(1,3)➔
for i in range (0,3,1): (0.5,1)
nx[i]=a*x[i]+b*y[i]
𝒙′ 𝒂 𝒃 𝒙
ny[i]=c*x[i]+d*y[i] =
𝒚′ 𝒄 𝒅 𝒚
[Link]([nx[0],nx[1]],[ny[0],ny[1]],linestyle='-')
[Link]([nx[1],nx[2]],[ny[1],ny[2]],linestyle='--') 𝒙′ −𝟏 𝟎 𝒙
=
[Link]([nx[2],nx[0]],[ny[2],ny[0]],linestyle=':') 𝒚′ 𝟎 𝟏 𝒚
160 [Link]()
伸縮
import [Link] as plt
x=[0.5,1.5,1]
y=[1,1,3] ex45
[Link]([0,2.5])
[Link]([0,6.5])
0.5 1.5 1 1
[Link]([x[0],x[1]],[y[0],y[1]],linestyle='-')
[Link]([x[1],x[2]],[y[1],y[2]],linestyle='--')
[Link]([x[2],x[0]],[y[2],y[0]],linestyle=':')
a,b,c,d=1.5,0,0,2
三角形
nx,ny=x,y
(0.5,1)➔(1.5,1)➔(1,3)➔
for i in range (0,3,1):
(0.5,1)
nx[i]=a*x[i]+b*y[i]
𝒙′ 𝒂 𝒃 𝒙
ny[i]=c*x[i]+d*y[i] =
[Link]([nx[0],nx[1]],[ny[0],ny[1]],linestyle='-')
𝒚′ 𝒄 𝒅 𝒚
[Link]([nx[1],nx[2]],[ny[1],ny[2]],linestyle='--') 𝒙′ 𝒉 𝟎 𝒙
=
[Link]([nx[2],nx[0]],[ny[2],ny[0]],linestyle=':') 𝒚′ 𝟎 𝒗 𝒚
161 [Link]() h=1.5 v=2
旋轉 10°

ex46 (2.2)

import [Link] as plt


import math
x=2
y=2
[Link](2,2,'o')

for j in range (10,340,10):


k=j/57.3
a,b,c,d=[Link](k),-[Link](k),[Link](k),[Link](k)
xp=a*x+b*y 𝒙′ 𝒂 𝒃 𝒙
yp=c*x+d*y =
𝒚′ 𝒄 𝒅 𝒚
[Link](xp,yp,'.') 𝒙′ 𝐜𝐨𝐬 𝜽 −𝐬𝐢𝐧 𝜽 𝒙
= 𝒚
𝒚′ 𝐬𝐢𝐧 𝜽 𝐜𝐨𝐬 𝜽
[Link]()
旋轉座標 (2.2) 每次逆時針轉 10° ,k是radian
162 1 radian=(360 °/2𝝅) = 𝟓𝟕. 𝟑°
1.前面範例請任選一例,完成程式並執行。

163

You might also like