Python
Python
師父引入門,修行在個人
吾心信其可行,則移山、填海之難,終有成功之日;
吾心信其不可行,則反掌、折枝之易,亦無收效之期。
➔跨域對話? 程式大師?
抄襲但需要真的了解➔ 自己運用+撰寫
1
何謂電腦
電腦系統是由
硬體、軟體、資料與 人 所組成的系統。
電腦 (computer) 的全名為電子計算機,又稱為
計算機,俗稱電腦。它是由不同功能的電子零
件及機械裝置組合而成,因為它能執行算術運
算,所以被稱為電子計算機。
特色 一天 24*60*60=86400秒
CPU 1G ~= 1X109運算
1. 運算速率非常快。
G(十億,109) T(兆, 1012)
2. 儲存資料容量非常大。
3. 處理資料結果正確、品質優良、且不易疲勞。
2
電腦的組成元件
CPU
邏輯運算單元
控制單元
輸入單元 輸出單元
鍵盤 螢幕
滑鼠 印表機
掃描器 記憶單元
喇叭
記憶體 、硬碟
電腦的五大單元運作流程
程式是一連串依特定順序所組合的電腦資料與指令的集合。程
式也視為是電腦軟體 ,主要可區分成兩類: 系統軟體 (system
software) 與應用軟體 (application software)。
系統軟體是使電腦順利運作的核心程式(最重要的程式集),主
要由一些在背景 (background) 執行的程式組成,包含:作業系統
、編譯程式、監督程式及電腦資源I/O管理程式 。
應用軟體藉由作業系統的運作,指揮電腦中的各項硬體執行各
種不同功能的軟體。每一個應用軟體,乃針對特定事務或工作
來撰寫,用以協助使用者解決各種不同目的之問題。
windows 7, 8, 10, ..
MS-DOS, Microsoft Windows, Unix, Linux, Mac OS, Android/iOS
• 啟動電腦後,電腦就會自動執行開機載入程式並啟動作
業系統,然後就可以開始操作各式各樣的應用程式。
5
應用軟體
一、系統工具軟體
用於管理系統的軟體,包含檔案總管、使用者帳戶管理、
資料來源管理、硬體裝置管理及新增或移除程式等。
二、文書處理 (word)
三、電子試算表軟體 (excel)
四、簡報軟體 (powerpoint)
五、資料庫軟體 (database)
六、影像處理
七、其他特殊應用軟體
6
電腦RAM記憶體配置
Hard Disk
硬碟
program 4. 跳至程式下一行,重複上述
動作到整個程式結束。
RAM
7 從程式的第1行開始,一行一行執行,一直到最後一行
Python 簡介
抄襲但需要真的了解每一行➔ 自己運用+撰寫
8
認識Python
Python官方網站蟒蛇標誌
([Link]
根據Python官方網站的說明指出,「Python是一個容易學習、功
能強大的程式語言,具有高效能的高階資料結構,簡單但有效率
的物件導向程式設計方式。Python語法簡潔、具動態型別及直譯
式等特質,使它成為撰寫script和快速開發程式的理想語言。」
1. [Link]
選擇download the latest version for
windows (Mac)
2. 下載後,將畫面最下方選擇 Install
now 來安裝
□
✔ Add Python 3.12.0 to PATH 空格打勾 ✔ (版本定期更新,目前為3.12.0)
10
執行Python
最新版本為 Python 3.12.0
11
輸入Python
指令 / 命令 / 敘述
instruction / command / statement
我們可以使用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]。
★程式編譯後執行!!!
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)
程式編譯後執行!!!
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
一堆 一堆 一堆
studentID class
_studentID print
studentName Good! custom@ID Error!
student_name 7eleven
myCar1 my Car1
26
變數 (2/2)
變數的指派方式
我們可以使用指派運算子 (=)(assignment operator) 來指
派變數的值,而且是以最近一次指派的值為準,例如:
✔ 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) 程式
我們可以使用Python內建的print()函式在螢幕上印出指定的字串,語法如下:
print(value, …, sep = ' ', end = '\n')
例如: (字串的前後使用' '或" "都可以)
我們可以使用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.寫一程式,輸入攝氏溫度,將其轉換成華氏溫度。
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。
邏輯運算子
邏輯運算子可以用來進行邏輯運算,Python提供如下的邏輯運算子。
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)
內縮 內縮
錯誤寫法範例 不內縮
不建議用
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是奇數 或 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敘述,而且沒有深度的限制,例如:
程式 結果
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:每次變動值
✔ 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的新值中
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
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位同學,輸入全班的數學成績,求全班數學總平均,並計
算全班數學不及格人數。 運用累加概念,可計算不及格人數
迴
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
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
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. 假設電力公司的電費依下列累進方式計算:
82
!!
while (1/4)
根據條件式來決定
是否持續執行迴圈
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迴圈外面
迴圈內 迴圈內
才能確保最後迴圈會停止。 才能確保最後迴圈會停止。
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
88
函式
89
認識函式
函式 (function) 是將一段具有某種功能或重複使用的敘述寫成獨立的程
式單元,然後給予名稱,供後續呼叫使用,可簡化程式提高可讀性與
便利性。有些程式語言將函式稱為方法 (method)、程序 (procedure) 或
副程式 (subroutine)。
先前使用過函式: print() input() eval()
… … …
函式
showMsg()
showMsg() Statements
呼叫函式
[return|return value]
… … …
[statements]
showMsg()
… … …
每次呼叫均執行相同的敘述
90 (此例:3段一樣的程式➔透過重複呼叫)
常用內建函式
函式必須加以呼叫才會執行,其語法如下:
functionName([parameters])
例如:
def CtoF1(degreeC):
degreeF = degreeC * 1.8 + 32 此函式無回傳值!!!
print("攝氏", degreeC, "度可以轉換成華氏", degreeF, "度")
有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) >>>
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
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個費氏數的值
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’
要從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
積分可視為: 求其面積(右圖紅色) න 𝒙𝟐 − 𝟑𝒙 + 𝟐 =? 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
的高皆為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
𝟐 𝟐 𝟐
a. න 𝒙 𝟒 =? b. න 𝒔𝒊𝒏 𝒙 =? c. න 𝒆 𝒙 =?
𝟎 𝟎 𝟎
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[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
下面是一個例子,它會根據這個成績單印出每位學生的總分。
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)
打開一個檔案([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() 方法關閉檔案。
例如:
6
>>> [Link]() #關檔
>>>
139
寫入檔案(2/2)
140
讀取檔案
從檔案讀取資料的步驟如下:
1. 開啟檔案:使用open() 函式建立檔案物件。
2. 讀取檔案:使用檔案物件提供的read()、readline() 或readlines() 方法讀取資料。
3. 關閉檔案:使用檔案物件提供的close() 方法關閉檔案。
使用read() 方法從檔案讀取資料
在開啟檔案後,我們可以使用檔案物件提供的read() 方法讀取資料,例如:
b)假設輸入檔案(.txt)內容為 1 1
30 或 19
1 2
144
影像處理
145
影像處理範例(1/5)
每張照片(picture/image/frame)是用一個一個點(dot)來表示/儲存,這些
點稱為像素(pixels)。一張照片的解析度可用像素來代表。每個像素有
R、G、B三原色值。
0 399
0 …
… 8 bits 可以區別 256 色調,
…
… 假設R,G,B分別都有256色,
輸入一張照片([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])
f=int((r+g+b)/3)
test[j,i]=(f,f,f)
…
…
151
圖表繪製
152
圖表繪製範例(1/4) 命令提示字元(CMD): 輸入 pip install matplotlib
[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](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 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)
163