You are on page 1of 92

來一句 Python


臺師大通識。資料科學與程式設計
授課老師:蔣宗哲
師大資工系
tcchiang@ieee.org

資料科學與程式設計。臺師大通識。 2020 春
程式語言
 學習程式語言的目的是為了和電腦溝通,
能指揮電腦進行我們指定的運算流程。
 隨著人工智慧技術的進步,雖然人類已能使用
自然語言指揮電腦(例: Siri ),但其用途和
規模仍有限。
 學習程式語言和學習自然語言相似,涉及使用
單字、句型和語意。

2
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
程式語言
 以指定文法和電腦溝通

顯示 NTNU!
????????????

可以請你在畫面上列印
NTNU 嗎 ?

3
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
編寫程式源碼
 編寫程式源碼 (source code) 就是將我們希望電腦執行
的運算流程,依循某種程式語言的文法規定撰寫出來。
 一般來說,我們會將程式源碼存成純文字格式的檔案。
 Python 源碼通常以 .py 作為副檔名。

4
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
執行程式
 我們目前學習的程式語言多屬「高階語言」,
需要透過中介程式將我們的程式源碼翻譯成電
腦指令,再由電腦執行。

my_first_program.py

010100110
print('NTNU')

Python 程式源碼 Python 直譯器

https://zh.wikipedia.org/wiki/File:Python.svg 5
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
執行程式
使用 Google 翻譯將英文翻譯成中文

使用 Python 直譯器將 Python 程式源碼翻譯成電腦運算動作

6
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
執行程式
正確的英文句子被翻譯成正確的中文句子

錯誤的英文句子被翻譯成怪異的中文句子

7
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
執行程式
文法正確但語意錯誤的程式源碼,直譯後得到不符預期的執行結果

文法與語意均正確的程式源碼,直譯後得到符合預期的結果

8
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
安裝 Python IDLE 開發工具

https://www.python.org/downloads/

 亦可安裝其它 Python 開發工具,如


PyCharm 、 Spyder 、 Anaconda 等等。

9
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
安裝 Python IDLE 開發工具

10
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
安裝 Python IDLE 開發工具

 點選 IDLE

 鍵入 idle


11
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Hello World 程式
 開新源碼檔案  撰寫程式碼

 存檔  存檔成功

12
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Hello World 程式
翻譯並執行程式碼內容 ( 熱鍵: F5)

同意存檔後執行 (OK)

13
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Hello World 程式
成功執行,並在 Shell 視窗列印出 Hello World 字樣。

14
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Hello World 程式
正確的程式
print('Hello World')

錯誤的程式 少了一對單引號

print(Hello World) invalid syntax

P 誤寫成大寫

Print('Hello World') NameError: name 'Print' is not defined

少了一對小括號

print'Hello World' invalid syntax

程式沒有向左靠齊

print('Hello World') unexpected indent

15
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
算術運算
 程式中經常需要計算數值,我們先來看看如何
在 Python 作算術運算。

數學運算 Python 程式碼 運算結果


加 1+1 1+1 2
減 203 20-3 17
乘 37 3*7 21
除 100/8 100/8 12.5
取餘數 100%8 4 (100/8 = 12…4)
次方 42 4**2 16

16
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
算術運算
執行方法一:直接運算 執行方法二:編寫檔案再執行

17
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
算術運算
 運算次序由高至低
 次方
 乘/除/餘
 加/減

Python 程式碼 運算次序 運算結果


1+10*3 1+(10*3) 31
20*2-4*3 (20*2)-(4*3) 28
3*4**2-1 (3*(4**2))-1 47

18
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
算術運算
 除法、整數與小數(浮點數)

Python 程式碼 運算結果 說明


11/2 5.5 一般除法,得到小數結果
11//2 5 整數除法,得到整數結果 ( 較小的最靠近整數 )

int(11/2)* 5 強制轉型,得到整數結果 ( 無條件捨去小數部


位)

-11/2 -5.5 一般除法,得到小數結果


-11//2 -6 整數除法,得到整數結果 ( 較小的最靠近整數 )

int(-11/2) -5 強制轉型,得到整數結果 ( 無條件捨去小數部


位)
C++ 的整數除法
*

19
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
投影片中若出現此圖形,代表
進階內容,自行選讀。

算術運算
 取餘數: Python vs. C++

運算式 Python 結果 C++ 結果


10%3 1 1
-10%3 2 -1
10%-3 -2 1
-10%-3 -1 -1

萬法不離其宗: a = (a/b)*b + (a%b)


運算式 Python 結果 C++ 結果
-10%3 2 -1

-10 = (-10/3)*3+(-10%3) -10 = (-10/3)*3+(-10%3)


-10 = (-4)*3 + (2) -10 = (-3)*3 + (-1)

20
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
互動運算
 獲取使用者資料並運算

 如何獲取資料?
 如何儲存資料?
 如何顯示運算結果?

21
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
變數
 程式的資料存放在記憶體中。
 變數代表某一塊記憶體空間,透過有意義的名稱,
方便我們指稱某一塊記憶體(或其存放的資料)。

 我們使用 = 運算來生成 / 指定變數。


 print() 函式可以輕鬆列印變數內容與運算結果。
 使用逗號區隔多個變數,列印時預設以一個空白隔開。

x = 10
print(x)

y = 20 10
print(x, y, x+y) 10 20 30

使用 sep 參數可傳入列印時的分隔字串,例:
print(x, y, sep='QQ')
列印出 10QQ20 22
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
變數
 預備測驗題:請問以下 Python 程式的輸出為何?
 答對率 33/57

a = 10
b = 10
a = a+b
print(a+b) 30

23
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
讀入資料
 input() 函式可以取得使用者從鍵盤輸入的資料。
 使用變數來承接 input() 的結果,否則 input() 就只有
輸入,但程式無法繼續使用輸入的內容。
x = input() 198
print(x) 198
灰色字代表使用者的鍵盤輸入
黑色字是程式的回應

 要求使用者輸入時,應儘量給予清楚的提示。
 在 Python 中,以一對單引號 ' ' (或雙引號 " " )包起
來的資料稱為字串。
 input() 函式可以傳入提示字串。
x = input(' 請輸入一個整數值 > ') 請輸入一個整數值 > 198
print(x) 198

24
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
資料型態
 資料型態影響了資料表示法、記憶體佔用空間
、合法的運算子以及運算結果。
 在程式碼中
 12 是整數型態 (int) 
程式用語
整數 : integer
小數 / 浮點數 : floating-point number
 12.0 是小數型態 (float) 字串 : string

 '12' 是字串型態 (str)


Python 程式碼 運算結果 說明
12 * 2 24 整數乘法,得到整數結果
'12' * 2 '1212' 字串乘法,得到字串結果
12 + 2 14 整數加法,得到整數結果
'12' + 2 字串不支援和整數相加,翻譯失敗
'12' + '2' '122' 字串加法,得到字串結果
25
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
讀入資料
 input() 函式以字串型態取得使用者輸入的
資料。
x = input(' 請輸入一個整數值 > ') 請輸入一個整數值 > 198
print(x*2) 198198

 資料轉型 以下三個程式都是相同的執行結果。

x = input(' 請輸入一個整數值 > ') 請輸入一個整數值 > 198


x = int(x) 396
print(x*2)

x = int(input(' 請輸入一個整數值 > '))


print(x*2)

x = input(' 請輸入一個整數值 > ')


print(int(x)*2)
26
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
輸入、計算與輸出
 撰寫一個 Python 程式,其結果運行如下:

加法程式
請輸入第一個整數值 > 33
請輸入第二個整數值 > 44
答案是 77

 思考程式流程:
 列印程式標題 print(' 加法程式 ')
 輸入第一個整數並儲存 x = int(input(' 請輸入第一個整數值 >
'))
 輸入第二個整數並儲存 y = int(input(' 請輸入第二個整數值 >
 計算和 '))
 記得轉換成整數 int total = x+y
print(' 答案是 ', total)
 輸出結果

27
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
一次輸入多個資料
 前面說過, input() 函式以字串型態取得使用者輸
入的資料。
 Python 的字串型態擁有一個操作 split() ,可以將
字串以空白字元斷開成串列。
 Python 可以使用解開的語法來取得串列中的資料。

print(' 加法程式 ')


x, y = input(' 請輸入兩個整數值 > ').split()
x = int(x)
y = int(y)
total = x+y
print(' 答案是 ', total)

如果你覺得太複雜可以先無視本頁,未來我們還會再講。

28
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Snakify 線上練習平台
 未來我們一部份的作業會以 Snakify 平台來指派。
 https://snakify.org/

29
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Snakify 線上練習平台
 登入時請選 I have a teacher 。或直接點選此連結
 底下的 Teacher's email 請填
ptm108_12365@ntnu.edu.tw
注意事項

•請以師大學生信箱註冊,勿使用私
人信箱。
•務必填寫正確的教師信箱,
否則我無法看見你的作答狀況,作
業可能因此得 0 分。

•First name 是中文名(例:明男)


, Last name 是中文姓(例:蔡)

請勿填錯,以免無法辨識與計分。

30
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Snakify 線上練習平台

 點選題目

 執行程式

 撰寫程式

亦可輸入自己的測試資料

 測試所有資料

亦可單獨執行畫面下方單一筆 Run test (但要自己比對結果是否正確。)


31
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Snakify 線上練習平台:作業一
 請完成 Snakify 平台主題
1 Input, print and numbers 的習題。
 計分方式(以題數計):
 第 1-9 題 ,每完成一題加總分 0.5 分
 提示
 大多數題目是輸入然後列印計算結果:
 Square

 Sum of three integers


a = int(input())
print(a**2)

a = int(input())
b = int(input())
c = int(input())
print(a + b + c)

32
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Snakify 線上練習平台:作業一
 提示
 Hi John 、 Hello, Harry! 牽涉到字串輸出:
 print('Hi','John') 會列印出 Hi John 。
 print('Hi'+'John') 會列印出 HiJohn 。
 Hi John 的範例解答

name = input() name = input()


print('Hi', name) print('Hi '+name)

 Previous and next 牽涉到字串和數值混合輸出:


 print('dscp', 107, 'ntnu') 會列印出 dscp 107 ntnu 。
 範例解答
print('The next number for the number', a, ' is', a+1)

print('The next number of the number ' + str(a) + ' is ' + str(a+1))

33
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Snakify 線上練習平台:作業一
 提示
 Two time stamps 計算兩個時刻相差的秒數:
 都轉換成從 0:00:00 開始的秒數再可相減即得答案。

 School desks 求三間教室總共需要幾張桌子:


 輸入三次整數值
 思考看看,怎麼樣的運算 f() 可以讓
f(19) = 10
f(20) = 10
f(21) = 11
f(22) = 11

 整數除法?除以多少?加多少?先加再除?先除再加?

34
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
電腦的決策

臺師大通識。資料科學與程式設計
授課老師:蔣宗哲
師大資工系
tcchiang@ieee.org

資料科學與程式設計。臺師大通識。 2020 春
索引頁
 平均的危險
 美好的如果
 關係運算子
 如果還有如果
 如果不只兩種可能
 邏輯運算子
 如果與分類
 Snakify 作業
 更多範例

36
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
平均的危機
 數值資料分析最常見的是統計分析,例如計算次數
、求取極值、平均值和標準差等等。
 我們都知道平均值是總和除以個數:
avg = total/count 這裡我們不用 sum 作為變數名
 稱(可以用但不建議),因為
sum 是 Python 內建函式名稱。

 讓我們來寫個求平均的程式:
 列印程式標題
 輸入總和
 輸入個數
 計算平均(即總和 / 個數)
 輸出結果

37
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
平均的危機
 求平均的程式
print(' 計算平均的程式 ')
total = int(input(' 請輸入總和 > '))  別忘了 input() 得到的資料是字
串型態,要用 int() 轉換成整數
count = int(input(' 請輸入個數 > ')) 喔。
print(' 答案是 ', total/count)

你會如何測試你的程式?
測試案例一 測試案例二 測試案例三
計算平均的程式 計算平均的程式 計算平均的程式
請輸入總和 > 100 請輸入總和 > 42 請輸入總和 > 100
請輸入個數 > 5 請輸入個數 > -8 請輸入個數 > 0
答案是 20.0 答案是 -5.25
Traceback (most recent call last):
File "divide by zero.py", line 4, in <module>
print(' 答案是 ', total/count)
ZeroDivisionError: division by zero

38
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
平均的危機
 除以零的錯誤 你看人家小算盤那麼聰明

 電腦在遇到除以零的運算時,通常都會以某種型式
回報錯誤。
 我們能否修改程式,使得:
 如果個數為正時,計算平均;
 如果個數不為正時,提示使用者輸入錯誤。

程式 程式
開始 結束

使用者輸入 個數 計算平均
為正


提示錯誤

39
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
生活中的流程圖

http://etds.lib.ntnu.edu.tw/cgi-bin/gs32/gsweb.cgi/ccd=qDv7GX/fqasearch?menuid=gsfqa

40
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
美好的如果
 大多數的程式語言都有個「如果」的句型

 中文
如果個數為正,計算並列印平均;
否則,提示使用者輸入錯誤。

 英文
If the count is positive, calculate and print the average;
otherwise, show an error message.

41
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
除以零的錯誤也可以利用

美好的如果
「例外處理」來解決。

 Python 的「如果」句型
print(' 計算平均的程式 ')
total = int(input(' 請輸入總和 > '))
count = int(input(' 請輸入個數 > '))
if count>0:
print(' 答案是 ', total/count)
else:
print(' 無法計算 - 個數需為正值 ')

程式 程式
開始 結束

使用者輸入 個數 計算平均
為正


提示錯誤

42
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
美好的如果
 句型剖析
別忘了冒號喔!
if 條件式 :
條件為真時的動作(可以不只一行) 假 真
else:
條件不為真的動作(可以不只一行)

 句型範例
if count>0:
print(' 答案是 ', total/count)
else:
print(' 無法計算 - 個數需為正值 ')

43
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
美好的如果
 句型排版格式規定
 Python 對於「如果」句型有嚴格的排版格式規定,若
不符合規定,會出現 expected an indented block 的
語法錯誤。

if count>0: 縮排錯誤的程式
print(' 答案是 ', total/count)
else:
print(' 無法計算 - 個數需為正值 ')

 被控制的程式碼必須比主控程式碼內縮。
 慣例是內縮四格空白。
 大部份開發工具都會自動排版了 – 即你寫完 if … : 之後按下
ENTER 鍵,會自動跳到下一行內縮四個空白處。

44
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
美好的如果
 如果條件不成立的時候沒有特別的工作,可以
省略掉 else: 以下的部份。
print(' 薩莉亞餐廳的計費程式 ') 薩莉亞餐廳的計費程式
school = input(' 請輸入就讀學校 > ') # 文字資料 請輸入就讀學校
請輸入人數 > 10
> 臺師大

count = int(input(' 請輸入人數 > ')) # 數值資料 總價 900 元


price = count*100 薩莉亞餐廳的計費程式
請輸入就讀學校 > 某大
請輸入人數 > 10
if school == ' 臺師大 ': # 字串要加 ' ' 總價 1000 元

price = price*0.9 # 師大人打九折

print(' 總價 ', int(price), ' 元 ')

程式 程式
開始 結束
個數 是
輸入與計價 打折扣 列印總價
為正

45
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
美好的如果
 可讀性:撰寫讓人一眼看懂的程式碼

if count > 0: 修改後更簡單 if count > 0:


# action B 明瞭 # action B
if count <= 0: else:
# action C # action C

#A #A

本質上有四種 本質上有兩種

#B 執行可能性: 假 真
執行可能性:


AD #C #B ABD
#C ABD ACD
ACD

ABCD
#D
#D
46
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
關係運算子
 「如果」句型以條件式的運算結果
 是真 (True) True 和 False 是布林 (bool,
 boolean) 型態唯二的數值。
 是假 (False)
注意 True 和 False 的首字母大寫

來控制該執行哪一段程式碼。

if True:
print('True')
else:
print('False')

if False:
print('True')
else: True
print('False') False

47
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
關係運算子
 關係運算子是二元運算子,其結果經常作為
「如果」句型的條件式。
 二元運算子:運算時需要兩個運算元。
意義 關係運算子 結果為真 True 結果為假 False
相等 == 3 == 3 3 == 4
不相等 != 3 != 4 4 != 4
大於 > 4>3 3>4
大於等於 >= 4 >= 4 3 >= 4
小於 < 3<4 4<3
小於等於 <= 3 <= 4 5 <= 4

 英文時間:運算子 operator ,運算元 operand 。

48
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
關係運算子
 運算次序由高至低
 次方
 乘/除/餘
 加/減
 關係運算

Python 程式碼 運算次序 運算結果


3*3==9 (3*3)==9 True
2+3>1+4 (2+3)>(1+4) False

49
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
關係運算子
 挑戰時刻
x = 11
y = 20

print('A')
if 100 > 3:
print('B')
if 100 < 200:
print('C')
if x/2 > 5:
print('D') A
print('E') B
if x+y < 40: C
print('F') D
if x*2 == y: E
print('G') F
if x <= y:
print('H')
H
if x+3*y >= x*3+y: I
print('I') J
if x != y:
print('J')

50
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
關係運算子
 Snakify 平台主題
3 Conditions: if, then, else 的習題
 Minimum of two numbers:
輸入兩個整數,輸出較小的值。
 提示:
將輸入的數值存在變數 a, b
如果 a 小於 b ,輸出 a
……

51
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
挑戰時刻
 修改「求平均」程式以達下述功能
 如果使用者第一次輸入的個數為正,計算並列印平均。
 如果使用者第一次輸入的個數不為正,提示使用者並讓其再
輸入一次個數。
 如果使用者第二次輸入的個數為正,計算並列印平均。
 如果使用者第二次輸入的個數不為正,提示使用者並結束程式。

原程式 print(' 計算平均的程式 ')


total = int(input(' 請輸入總和 > '))
count = int(input(' 請輸入個數 > '))
if count>0:
print(' 答案是 ', total/count)
else:
print(' 無法計算 - 個數需為正值 ')

完成的同學請向你鄰近的同學說明你的程式邏輯如何運作。
52
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
挑戰時刻
 修改「求平均」程式以達下述功能
 如果使用者第一次輸入的個數為正,計算並列印平均。
 如果使用者第一次輸入的個數不為正,提示使用者並讓其再
輸入一次個數。
 如果使用者第二次輸入的個數為正,計算並列印平均。
 如果使用者第二次輸入的個數不為正,提示使用者並結束程式。
print(' 計算平均的程式 ') 缺點:
total = int(input(' 請輸入總和 > ')) 1.計算平均的程式片段重覆了。
count = int(input(' 請輸入個數 > ')) 2.控制結構複雜(由一層變成兩層)。
if count>0:
print(' 答案是 ', total/count)
else:
count = int(input(' 個數需為正值,請輸入個數 > '))
if count>0:
print(' 答案是 ', total/count)
else:
print(' 無法計算 - 個數需為正值 ')

53
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
挑戰時刻
 修改「求平均」程式以達下述功能
 如果使用者第一次輸入的個數不為正,提示使用者並讓其再
輸入一次個數。
 如果個數為正,計算平均。
 如果個數不為正,提示使用者並結束程式。

print(' 計算平均的程式 ') 調整控制流程可以得到精簡的


total = int(input(' 請輸入總和 > ')) 程式碼:
count = int(input(' 請輸入個數 > ')) 1.沒有重覆片段。
if count<=0: 2.控制結構簡單(一層)。
count = int(input(' 個數需為正值,請輸入個數 > '))

if count>0:
print(' 答案是 ', total/count)
else:
print(' 無法計算 - 個數需為正值 ')

同樣的功能,可以有千變萬化的方式來撰寫出程式。除了考慮功能正確性
 ,未來還要考慮程式碼的簡潔、可讀性、可維護性等等。
54
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
挑戰時刻
 這個程式共有幾種可能的執行流程?
print(' 計算平均的程式 ')
total = int(input(' 請輸入總和 > ')) #A
count = int(input(' 請輸入個數 > '))
if count<=0:
count = int(input(' 個數需為正值,請輸入個數 > ')) #B
if count>0:
print(' 答案是 ', total/count) #C
else:
print(' 無法計算 - 個數需為正值 ') #D

編號 執行流程 測試案例
1 AC 依序輸入 100 3
2 ABC 依序輸入 100 0 3
3 ABD 依序輸入 100 0 0

 辨識程式可能的執行流程並完整測試是程式員的基本且重要任務。
55
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
如果還有如果
 巢狀控制
 在前面的挑戰時刻,我們看到了「如果」還有「
如果」的程式碼。
 我們通常稱這種多於一層的程式為巢狀 (nested)
控制結構。
print(' 計算平均的程式 ')
total = int(input(' 請輸入總和 > '))
count = int(input(' 請輸入個數 > '))
if count>0:
print(' 答案是 ', total/count)
else:
count = int(input(' 個數需為正值,請輸入個數 > '))
if count>0:
print(' 答案是 ', total/count)
else:
print(' 無法計算 - 個數需為正值 ')

56
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
如果還有如果
 巢狀控制
 沒有新把戲,只要一層一層走進去就可以了。

假 真

print(' 計算平均的程式 ')


假 真 total = int(input(' 請輸入總和 > '))
count = int(input(' 請輸入個數 > '))
if count>0:
print(' 答案是 ', total/count)
else:
count = int(input(' 個數需為正值,請輸入個數 > '))
if count>0:
print(' 答案是 ', total/count)
else:
print(' 無法計算 - 個數需為正值 ')

57
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
如果不只兩種可能 …… ?
 在前面的例子中,我們判斷個數是不是正值。
 如果我們想判斷正值、零和負值,分別作不同
的動作,該怎麼作呢?
這是巢狀的作法
v = int(input(' 請輸入一個整數值 > '))
if v>0:
print(' 正值 ')
else:
if v==0:
print(' 零 ')
else:
print(' 負值 ')

 要特別注意「成對」的 if … else … 的縮排位置,否則會有語法錯誤。


58
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
如果不只兩種可能 …… ?
 對同一個 ( 組 ) 資料進行多重判斷時,我們通
常會將「如果」句型維持在同一個層級。
v = int(input(' 請輸入一個整數值 > ')) v = int(input(' 請輸入一個整數值 > '))
if v>0: if v>0:
print(' 正值 ') print(' 正值 ')
else: elif v==0:
if v==0: print(' 零 ')
print(' 零 ') else:
else: print(' 負值 ')
print(' 負值 ')
兩層 一層

Snakify 平台主題
3 Conditions: if, then, else 的習題
Sign function:輸入一個整數,
若為正數,輸出 1 ;
若為負數,輸出 -1 ;
若為零,輸出 0 。

59
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
如果不只兩種可能 …… ?
 if … elif … else 句型
A
#A if condition1:
{
真 } B1
#B1
elif condition2:

{

#B2 B2
}

真 elif condition3: 這段程式有幾種
#B3 可能的執行流程?
{
假 } B3
...

else:
#BX {
BX
}

#C C
60
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
如果不只兩種可能 …… ?
 最常見的多分法 – 單值

grade = int(input(' 你的年級 >')) bt = input(' 你的血型 >')


if grade == 1: if bt == 'O':
print(' 一年級 ') print('O 型人 ')
elif grade == 2: elif bt == 'A':
print(' 二年級 ') print('A 型人 ')
elif grade == 3: elif bt == 'B':
print(' 三年級 ') print('B 型人 ')
elif grade == 4: elif bt == 'AB':
print(' 四年級 ') print('AB 型人 ')
else: else:
print(' 大大級 ') print(' 外星人 ')

 雖然 if 句型不一定要有 else 的部份,但建議


保留此部份作為檢查時的最後一道關卡。

61
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
如果不只兩種可能 …… ?
 另一種常見的多分法:區間判斷
price = 100
number = int(input())
if number>=12:
price = price*number*0.9 12 人以上
elif number>=6:
price = price*number*0.95 6-11 人
elif number>=2:
price = price*number*0.99 2-5 人
else:
price = price*number 1 人

print(' 人數 ', number, ' 人,總價 ',


price)

 要特別注意「由上而下」的判斷順序。

62
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
如果不只兩種可能 …… ?
 預備測驗題:請問以下 Python 程式中,若 a
的值為 [0, 1, 2, ..., 9] 中的值,請問有幾個值會
讓程式輸出 B ?
 答對率 19/57

if a > 3:
print('A')
elif a > 8:
print('B')
else:
print('C')

0 個

63
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
挑戰時刻
 多分法練習:請撰寫一個程式,使用者輸入一
個分數,請依以下區間輸出等第。 臺師大等第制

完成的同學請向你鄰近的同學說明你的程式邏輯如何運作。 分數區間 等第
90~100 A+
score = int(input(' 請輸入分數 > '))
85~89 A
if 90<=score:
print(score, 'A+') 80~84 A-
elif 85<=score: 77~79 B+
print(score, 'A')
elif 80<=score: 73~76 B
print(score, 'A-')
elif 77<=score: 70~72 B-
print(score, 'B+') 這個程式的小缺點:當使用者輸
elif 73<=score:  入其它範圍的分數時(如 500 或
print(score, 'B') 65 ),程式沒有輸出錯誤訊息。
elif 70<=score:
print(score, 'B-') 這個程式你至少要測試過幾次 ?

64
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
挑戰時刻
補強版 A 補強版 B
score = int(input(' 請輸入分數 > ')) score = int(input(' 請輸入分數 > '))

if 100<score: if 90<=score<=100:
print(score, ' 不在本程式接受範圍 ') print(score, 'A+')
elif 90<=score: elif 85<=score<=89:
print(score, 'A+') print(score, 'A')
elif 85<=score: elif 80<=score<=84:
print(score, 'A') print(score, 'A-')
elif 80<=score: elif 77<=score<=79:
print(score, 'A-') print(score, 'B+')
elif 77<=score: elif 73<=score<=76:
print(score, 'B+') print(score, 'B')
elif 73<=score: elif 70<=score<=72:
print(score, 'B') print(score, 'B-')
elif 70<=score: else:
print(score, 'B-') print(score, ' 不在本程式接受範圍 ')
else:
print(score, ' 不在本程式接受範圍 ')
90<=score<=100 在 Python 中是
90<=score and score<=100 的意思。

我們很快就會談到邏輯運算子 and 。

65
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
總結:「如果」句型
 一個「如果」句型是由
 一個 if
 零個以上的 elif
 零個或一個 else

組成的。

 巢狀:
「如果」句型裡面可以繼續使用「如果」句型。

66
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
邏輯運算子:如果句型的好幫手
 邏輯運算子可以簡化「如果」句子。
if month == 8:
if day == 15: 請舉例 month 和 day 的值為何
 ,會進入到三個不同的分支。
print(' 中秋節快樂 !')
else:
print(' 平常日 ')
else:
print(' 平常日 ')

使用邏輯運算子 and

if month == 8 and day == 15:


print(' 中秋節快樂 ')
else:
print(' 平常日 ')

67
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
邏輯運算子 and

a b a and b 非 0 的數值都視為 True 。

False False False a = 3.14


if a:
False True False print(' 這行會印出
來 ')
True False False
True True True
若 a 為 False ,無論 b 是 True
或是 False , a and b 的結果都
是 False 。
if month == 8 and day == 15: 在 Python 中,若 a 為 False ,
print(' 中秋節快樂 !') a and b 運算並不會評估 b 的值

else: 此稱為短路 (short-circuit) 。
print(' 平常日 ')
if False and 1/0:
print(' 沒有除以零錯誤 ')

68
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
邏輯運算子 or
若 a 為 True ,無論 b 是 True
a b a or b 或是 False , a or b 的結果都
是 True 。
False False False
在 Python 中,若 a 為 True ,
False True True a or b 運算並不會評估 b 的值

True False True 此稱為短路 (short-circuit) 。

True True True if True or 1/0:


print(' 沒有除以零錯誤 ')

if score >= 60 or times_absence < 3:


注意:這只是個範例。
print(' 及格了 ') 
else:
print(' 不及格 ')

Snakify 平台主題
3 Conditions: if, then, else 的習題
Rook Move
題意:如果前兩行的數字所成的座標 (x1, y1) 和後兩
行數字所成的座標 (x2, y2) 在同一列或同一欄,即輸
出 YES ,代表城堡 rook 可以從 (x1, y1) 走到 (x2,
y2) ;否則,輸出 NO 。 69
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
邏輯運算子 not

a not a
False True
True False

if not (month == 8 and day == 15):


print(' 平常日 ')
else:
print(' 中秋節快樂 !')

if not month == 8 and day == 15:


print(' 平常日 ')
else:
print(' 中秋節快樂 !') 漏了小括號 這樣寫一年有幾天中秋節 ?

如果你只測試 8 15 和 7 15 兩組資料,你就會 * 誤 *
 以為你的程式是正確的。 -- 再次例證完整測試的重要
性。

70
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
邏輯運算子
 預備測驗題:請問以下 Python 程式的輸出
為何?
 答對率 29/57
x = 1
y = 2
if x!=0 or y!=0:
if x>2 and y<3:
print('A')
else:
print('B')
else:
if x<2 and y>1:
print('C')
else:
print('D') B

71
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
「如果」句型與「分類」

請描述 / 想像你在修完本課程後,會使用程式進行什麼樣的資料分析
/ 自動化工作?如果可以,請進一步說明你想處理的資料格式與樣貌。

「可以將資料分群、分類,因為在處理地理資料時分群分類很重要 。」
-- 文學院同學

「透過簡單的問卷 ( 像是 google 表單 ) 調查出一些想知道的數據,


然後用程式分析出那些數據再加以分類。」
-- 理學院同學

「我希望能夠分析收集到的語料,通過自動化工作來篩選語料,
快速分類並總結出某種特定用法可使用的語境等等」
-- 文學院同學

72
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
「如果」句型與「分類」
 我們已經會使用「如果」來「分類」了耶!
grade = int(input(' 你的年級 >')) score = int(input(' 請輸入分數 > '))
if grade == 1:
print(' 一年級 ')
if 90<=score<=100: 分數區間分類
elif grade == 2:
print(' 二年級 ') print(score, 'A+')
elif grade == 3: elif 85<=score<=89:
print(' 三年級 ') print(score, 'A')
elif grade == 4: elif 80<=score<=84:
print(' 四年級 ') print(score, 'A-')
else:
年級分類
elif 77<=score<=79:
print(' 大大級 ')
print(score, 'B+')
bt = input(' 你的血型 >') elif 73<=score<=76:
if bt == 'O': print(score, 'B')
print('O 型人 ') elif 70<=score<=72:
elif bt == 'A': print(score, 'B-')
print('A 型人 ') else:
elif bt == 'B':
print('B 型人 ')
print(score, ' 不在本程式接受範圍 ')
elif bt == 'AB':
print('AB 型人 ')
else:
print(' 外星人 ') 血型分類

73
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
「如果」句型與「分類」
 以下兩群數字怎麼分類?

4 16 4 44 26 64 84 86 89
88
2 6 10 21 65 40 80
81 87
8 68
12 20 82 81 82 0
14 24 83 85
18 8
3 5 17 19 34 52 79 43 52 79
37 37
1 15 57 11 57
21 11 14 -96 -14
9 96
11 91 -74 -30 91
7 13 74 30

if num%2==0: if (num//10)%2==0: if num==0 or


#blue #blue 80<=num<=89:
else: else: #blue
#pink #pink else:
#pink

74
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
「如果」句型與「分類」
 以下兩群數字怎麼分類?

1996 12 2108 34 65 65
4 8 96
800 1887 19 773
if num%4 == 0: 2400 400
if num%100!=0: 799 13
82
# 左上 100 300 21
else: 500 275 443
200
# 左下
2100 2700 19 317 159 191
else:
# 右邊

if num%4 == 0:
# 左邊
else:
# 右邊

75
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
「如果」句型與「分類」
 Snakify 平台主題
3 Conditions: if, then, else 的習題
 Leap year 四年一閏,逢百不閏,四百又閏
閏年: 4, 8, 12, 400, 800, 2000
非閏年: 2, 3, 5, 7, 100, 200, 300, 500, 2001

如果可能,與一位鄰近同學合力完成此程式:一人口述想法,另一人撰寫程式。

if y%4 == 0: if y%400 == 0:
print('LEAP') print('LEAP')
if y%100 == 0: elif y%100 == 0:
if y%400 == 0: elif y%4 == 0:
else: else: 剩下的部份自行補齊

else:
else: 剩下的部份自行補齊

上面的程式碼使用三層巢狀結構,下面的程式碼僅使用一層。
 不過,有些人會覺得下面的程式碼不好懂。
和同學交換你的想法。

76
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Snakify 線上練習平台:作業三
 請完成 Snakify 平台主題
3 Conditions: if, then, else 的習題。

 計分方式(以題數計):
 第 1-12 題,每題做完加總分 0.5 分

 提示
 Chocolate bar 的題意是給一片有 n  m 小塊的巧克力,折一
次,能不能變成含 k 小塊的巧克力。

42 的巧克力,沿虛線折
會變成 6 小塊的巧克力。
77
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Python Tutor http://pythontutor.com/

 步進 (step-by-step) 執行程式
 視覺化變數內容
 線上和它人一起觀看程式並即時傳訊討論

78
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Python Tutor http://pythontutor.com/

 如何新增自己的程式?
 從首頁進入,點擊 Python Tutor 連結。

79
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Python Tutor http://pythontutor.com/

 如何新增自己的程式?
 接下來就能鍵入自己的程式囉!
 打完程式,再按 Visualize Execution 即可。

80
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Python Tutor http://pythontutor.com/

 開始執行

輸入資料(因為你的程式第一
行要執行 input() )

產生一個長期連結,可分享給它人。
81
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Python Tutor http://pythontutor.com/

 步進執行 (Next >)

視覺展示區

步進執行

82
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Python Tutor http://pythontutor.com/

 互動、求助與 …… 聊天/交友?

按下此按鈕後,會讓所有在這個網站上的使用者有機會協助你。

Get live help!

83
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Python Tutor http://pythontutor.com/

 互動、求助與 …… 聊天 / 交友?

84
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Python Tutor http://pythontutor.com/

 互動、求助與 …… 聊天 / 交友?

Start private chat

按下此按鈕後,會產生一個連結,你可傳送此連結給朋友,並和
朋友一起互動討論程式的執行過程以及相關問題。

85
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Python Tutor http://pythontutor.com/

 互動、求助與 …… 聊天 / 交友?
Start private chat

按下此按鈕後,會產生一個連結,你可傳送此連結給朋友,並和
朋友一起互動討論程式的執行過程以及相關問題。

86
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
Python Tutor http://pythontutor.com/

 多看、多說、多學習: Coding is fun.


你的視窗

傳給朋友,朋友點擊後 ……
朋友的視窗

87
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
更多範例:「如果」句型
 多分法:籃球賽最後 10 秒的戰術
if our_score > opp_score: # 贏球
print(' 把球給罰球命中率高的,拖完時間 ')
elif our_score >= opp_score-2: # 差距 2 分以內
print(' 進攻禁區 ')
elif our_score == opp_score-3: # 差 3 分
print(' 設計三分球戰術 ')
else: # 差 4 分以上
print(' 快速進攻,能進就好 ')

88
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
更多範例:「如果」句型
 巢狀與多分法:調薪策略

if married:
if num_kids == 0: 已婚 未婚
bonus = 1000
elif num_kids == 1: 收入小於門檻
bonus = 2000
else: #more than one kid $
bonus = 4000
兩人生活
else: #single 一子 多子

if salary <= 50000:


bonus = 500
$ $$ $$$

89
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
更多範例:「如果」句型
 巢狀與多分法:大富翁遊戲 - 升級土地
if money>=price:
print('You can upgrade your land to one of these buildings:\n'
'(1) Department store\n'
'(2) Park\n'
'(3) Business building\n')
choice = int(input('Which type of building do you want?...>'))

if choice == 1:
# 升級為百貨公司
elif choice == 2:
# 升級為公園
elif choice == 3:
# 升級為商辦 pass
else:
大富翁 :
# 不夠錢 http://rich.joypark.com.tw/player/player.aspx
pass

90
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
更多範例:「如果」句型
 巢狀與多分法:角色扮演遊戲 - 戰鬥選單
action = int(input(' 選擇行動 ...>'))
if action == 1: # 物理攻擊
weapon = int(input(' 選擇武器 ...>'))
if weapon == 1:
print(' 使用長劍 ')
elif weapon == 2:
print(' 使用拳頭 ')

elif action == 2:
# 法術攻擊
elif action == 3:
# 使用物品

91
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春
更多範例:「如果」句型
 巢狀與多分法:角色扮演遊戲 - 接觸 NPC

if not visited:
print('Welcome, adventurer. I will give you some
gift.')

if job == 1: #warrior
attack += 1
elif job == 2: #archer
dexterity += 1
...

else: #already visited


print('Good day')

92
Python 初體驗。資料科學與程式設計。臺師大通識。 2020 春

You might also like