Python 基礎

第二堂

2024 交大資訊逐夢營

講師:火鍋料換菜

算術運算子

(Arithmetic Operator)

算術運算子

  • 類似一般的加減乘除
    • 先乘除後加減
    • 括號會先算
  • 就跟國小數學一樣!
算術運算 運算子 範例 結果
加法 1 + 2 3
減法 5 - 3 2
乘法 2 * 3 6
除法 5 / 2 2.5
下高斯除法⌊⌋ // 5 // 2 2
次方 ** 2 ** 5 32
取餘數 % 13 % 5 3

進階算術運算子

對一個變數做加減乘除,再存回同一個變數

運算子 範例 等同於
+= x += 1 x = x + 1
-= x -= 5 x = x - 5
*= x *= 3 x = x * 3
/= x /= 7 x = x / 7

例題 1

計算下列算式,並印出執行結果

[(10+(23^4+25))\times 101]\div 34

請大家打開 class-2 資料夾中的 01_calculate.py

參考解答

[(10+(23^4+25))\times 101]\div 34
x = (10+(23**4+25))*101/34
print(x)
Output:
831396.3529411765

字串加法

print('chii'+'kawa')

字串加法

print('chii'+'kawa')
Output:
chiikawa

數字加法 vs. 字串加法

print("數字加法:")
print(1+2)
print("字串加法:")
print('1'+'2')
print('1+2')

數字加法 vs. 字串加法

print("數字加法:")
print(1+2)
print("字串加法:")
print('1'+'2')
print('1+2')
Output:
數字加法:
3
字串加法:
12
1+2

判斷 (If)

if

如果... 就...

if 條件:
	要執行的程式碼

如果符合條件

就執行程式碼

要怎麼列條件?

條件式 (Condition)

  • 可能的結果:True / False
  • 如何列出條件?
    • 關係運算子
    • 邏輯運算子
    • 成員運算子

關係運算子

(Comparison Operator)

名稱 運算子 例子 結果
大於 > 3 > 2 True
小於 < 3 < 2 False
不等於 != 3 != 2 True
等於 == 3 == 2 False

和 "=" 一樣嗎?

== vs. =

=:指派(assign)符號右邊的值給左邊

==:判斷符號兩側的數值是否相等

邏輯運算子

(Logical Operator)

  • and(且)
  • or(或)
  • not(非)

邏輯運算子 - and

 X              Y True False
True True False
False False False

X and Y

邏輯運算子 - or

 X              Y True False
True True True
False True False

X or Y

邏輯運算子 - not

 X True False
not X False True

not X

成員運算子

(Membership Operator)

  • in
  • not in
names = ['Bonnie', 'Vito', 'Johnny']

# 判斷串列中是否包含某元素
print('Johnny' in names)

# 判斷字串是否包含某字母/子字串
print('a' in 'apple')
print('ap' not in 'apple')

成員運算子

(Membership Operator)

names = ['Bonnie', 'Vito', 'Johnny']

# 判斷串列中是否包含某元素
print('Johnny' in names)

# 判斷字串是否包含某字母/子字串
print('a' in 'apple')
print('ap' not in 'apple')
Output:
True
True
False

運算子優先級

  1. 算術運算子(+)
  2. 成員運算子(in)、關係運算子(>)
  3. not
  4. and
  5. or

例題 2

你是生活在奇妙世界的勞動鎧甲先生,負責考核除草檢定

例題 2

這天,吉伊和小八貓相約來考除草證

例題 2

請大家打開 class-2 資料夾中的  02_weed.py

例題 2

# 考生1: 吉伊
chii = {
    "name" : "Chiikawa",
    "color" : "white",
    "height" : 30,
    "weed" : 5
}

# 考生2: 小八貓
hachi = {
    "name" : "Hachiware",
    "color" : "white and blue",
    "height" : 30,
    "weed" : 4
}

作為審核員,你得到了兩位考生的資料

 

資料中紀錄考生的姓名、顏色、身高,以及現在的除草證等級

例題 2

請回答以下三個問題:

  1. 吉伊和小八貓的顏色一樣嗎?
  2. 吉伊和小八貓的身高一樣嗎?
  3. 如果除草證分為等級1~等級5,等級1最高階,請問吉伊的等級比較高階嗎?(假設他們的等級不同)

參考解答

# 修改Q1, Q2, Q3的結果,分別代表三個問題的答案
Q1 = chii["color"] == hachi["color"]
Q2 = chii["height"] == hachi["height"]
Q3 = chii["weed"] < hachi["weed"]

參考解答

# 修改Q1, Q2, Q3的結果,分別代表三個問題的答案
Q1 = chii["color"] == hachi["color"]
Q2 = chii["height"] == hachi["height"]
Q3 = chii["weed"] < hachi["weed"]
Output:
他們的顏色不一樣~
他們的身高一樣!
小八貓持有比較高階的除草證 ヽ(=^・ω・^=)丿

if

如果... 就...

if 條件:
	要執行的程式碼

如果符合條件

就執行程式碼

縮排

if 條件1:
  	# 區塊1
  	if 條件2:
    	# 區塊2
# 區塊3
  • 用來確定哪些語句屬於同一個區塊
  • 同區塊,縮排長度相同
  • 如果編輯器沒有自動縮排,按tab
    • 相當於四個空白鍵

縮排

price = 100
if price <= 100:
    print("It's cheap.")
      print("Let's buy it!")

錯誤範例

if else

if 條件:
	程式碼1
else:
	程式碼2

如果符合條件 -> 執行程式碼1

如果不符合條件 -> 執行程式碼2

if else 範例

price = 300
if price >= 500:
    print("太貴了!")
else:
    print("合理的價格。")

if else 範例

price = 300
if price >= 500:
    print("太貴了!")
else:
    print("合理的價格。")
Output:
合理的價格。

例題 3

為了賺錢,吉伊、小八貓和烏薩奇組隊一起執行除草任務

例題 3

除草的過程中,可能會遇到會攻擊他們的奇美拉(怪物)。

給定三人的戰鬥力,加總後就是總戰鬥力。

如果他們的總戰鬥力比奇美拉低,他們就會撤退。

如果他們的總戰鬥力等於奇美拉,或比奇美拉高,他們就會攻擊。

例題 3

請大家打開 class-2 資料夾中的  03_fight.py

例題 3

monster = 500  # 奇美拉的戰鬥力
chiikawa = 30  # 吉伊的戰鬥力
hachiware = 50  # 小八貓的戰鬥力
usagi = 100  # 烏薩奇的戰鬥力

給定所有角色的戰鬥力,請問他們要攻擊還是撤退?

如果要撤退,請輸出「撤退!!」

如果要攻擊,請輸出「攻擊!!」

參考解答

# TODO: 印出他們採取攻擊還是撤退行動
total = chiikawa + hachiware + usagi

if total >= monster:
    print("攻擊!!")
else:
    print("撤退!!")

參考解答

# TODO: 印出他們採取攻擊還是撤退行動
total = chiikawa + hachiware + usagi

if total >= monster:
    print("攻擊!!")
else:
    print("撤退!!")
Output:
撤退!!

if elif else

if 條件1:
	程式碼1
elif 條件2:
	程式碼2
else:
    程式碼3

if elif else

if 條件1:
	程式碼1
elif 條件2:
	程式碼2
else:
    程式碼3

條件1

執行程式碼1

條件2

True

False

執行程式碼2

執行程式碼3

True

False

if elif else 範例

price = 50
if price >= 500:
    print("太貴了!")
elif price <= 100:
    print("好便宜喔!")
else:
    print("合理的價格。")

if elif else 範例

price = 50
if price >= 500:
    print("太貴了!")
elif price <= 100:
    print("好便宜喔!")
else:
    print("合理的價格。")
Output:
好便宜喔!

例題 4

吉伊為了增強自己的實力,想要練習單獨對抗奇美拉

例題 4

為了保障安全,他們決定根據戰鬥力來決定出戰的人選

例題 4

請大家打開 class-2 資料夾中的  04_fight_alone.py

例題 4

他們決定優先讓戰鬥力最低的吉伊出戰,再來是小八貓,最後是烏薩奇。

注意:為了確保安全,不能選擇戰鬥力比奇美拉還低的人出戰!

如果沒有單人適合出戰,他們會撤退。

monster = 70  # 奇美拉的戰鬥力
chiikawa = 30  # 吉伊的戰鬥力
hachiware = 50  # 小八貓的戰鬥力
usagi = 100  # 烏薩奇的戰鬥力

例題 4

他們決定優先讓戰鬥力最低的吉伊出戰,再來是小八貓,最後是烏薩奇。

注意:為了確保安全,不能選擇戰鬥力比奇美拉還低的人出戰!

如果沒有單人適合出戰,他們會撤退。

請印出該由誰戰鬥(例如:「吉伊戰鬥!!」)

或是選擇撤退(印出「撤退!!」)

# TODO: 印出誰要負責攻擊
if chiikawa >= monster:
    print("吉伊戰鬥!!")
elif hachiware >= monster:
    print("小八貓戰鬥!!")
elif usagi >= monster:
    print("烏薩奇戰鬥!!")
else:
    print("撤退!!")

參考解答

# TODO: 印出誰要負責攻擊
if chiikawa >= monster:
    print("吉伊戰鬥!!")
elif hachiware >= monster:
    print("小八貓戰鬥!!")
elif usagi >= monster:
    print("烏薩奇戰鬥!!")
else:
    print("撤退!!")

參考解答

Output:
烏薩奇戰鬥!!

迴圈 (Loop)

迴圈(loop)

  • for 迴圈
  • while 迴圈
  • 巢狀迴圈
  • continue & break

for 迴圈

for 變數 in 可迭代物:
	要執行的程式碼

可迭代物

  • 給迴圈一個範圍
  • 迭代:重覆做一樣的事
  • 常用:range(), string, list

range()

  • range(終末值)
for i in range(5):
	print(i)

range()

  • range(終末值)
for i in range(5):
	print(i)
Output:
0
1
2
3
4

range()

  • range(起始值, 終末值)
for i in range(2,7):
	print(i)

range()

  • range(起始值, 終末值)
for i in range(2,7):
	print(i)
Output:
2
3
4
5
6

range()

  • range(起始值, 終末值, 遞增減)
for i in range(7,2,-1):
	print(i)

range()

  • range(起始值, 終末值, 遞增減)
for i in range(7,2,-1):
	print(i)
Output:
7
6
5
4
3

string

for i in "Chiikawa":
	print(i)

把字串當成可迭代物

for i in "Chiikawa":
	print(i)
Output:
C
h
i
i
k
a
w
a

string

把字串當成可迭代物

for i in ['c','h','i',1,2,3]:
	print(i)

list

把串列當成可迭代物

for i in ['c','h','i',1,2,3]:
	print(i)
Output:
c
h
i
1
2
3

list

把串列當成可迭代物

例題 5

近期,在吉伊家附近,出現會每天再生的奇美拉

例題 5

請大家打開 class-2 資料夾中的  05_monster.py

例題 5

monster_list = ["粉紅色奇美拉", "綠色奇美拉", "藍色奇美拉", "白色奇美拉", "咖啡色奇美拉"]

串列中列了每天都會再生的五種奇美拉

吉伊每天都會按照順序討伐他們

但他有時候狀態不好,沒有辦法討伐全部的奇美拉

例題 5

請讓吉伊輸入他當天討伐的怪物數量,並列印出當天討伐的怪物名稱

例題 5

請讓吉伊輸入他當天討伐的怪物數量,並列印出當天討伐的怪物名稱

範例輸出:
要討伐的怪物數量(1~5):3    # input
吉伊討伐了粉紅色奇美拉    # output
吉伊討伐了綠色奇美拉
吉伊討伐了藍色奇美拉

例題 5

請讓吉伊輸入他當天討伐的怪物數量,並列印出當天討伐的怪物名稱

範例輸出:
要討伐的怪物數量(1~5):3    # input
吉伊討伐了粉紅色奇美拉    # output
吉伊討伐了綠色奇美拉
吉伊討伐了藍色奇美拉

執行 x 次一樣的任務       可以用 for 迴圈!

參考解答

# TODO: 輸入要討伐的怪物數量(1~5),印出討伐的怪物名稱
num = int(input("要討伐的怪物數量(1~5):"))

for i in range(num):
    print(f"吉伊討伐了{monster_list[i]}")

參考解答

# TODO: 輸入要討伐的怪物數量(1~5),印出討伐的怪物名稱
num = int(input("要討伐的怪物數量(1~5):"))

for i in range(num):
    print(f"吉伊討伐了{monster_list[i]}")
Output:
要討伐的怪物數量(1~5):4
吉伊討伐了粉紅色奇美拉
吉伊討伐了綠色奇美拉
吉伊討伐了藍色奇美拉
吉伊討伐了白色奇美拉

while 迴圈

while 條件:
	要執行的程式碼

條件式寫法和前面的 if 一樣!

while 迴圈

while 條件:
	要執行的程式碼

條件

程式碼

結束迴圈

True

False

while 迴圈範例

i = 0
while i<5:
	print(i)
    i += 1

while 迴圈範例

i = 0
while i<5:
	print(i)
    i += 1
Output:
0
1
2
3
4

巢狀迴圈 (nested loop)

  • 在迴圈中包覆其他迴圈
  • 使用兩個以上的迭代變數
  • 類似時鐘的概念

巢狀迴圈 (nested loop)

for i in range(12):
  
	for j in range(60):
		# 分針走一格
       
    # 時針走一格

巢狀迴圈範例

name = ["Bill", "Benson"]
action = ["熬夜趕作業", "吃了一塊蛋糕"]

for i in name:
	for j in action:
		print(f"{i} {j}")

巢狀迴圈範例

name = ["Bill", "Benson"]
action = ["熬夜趕作業", "吃了一塊蛋糕"]

for i in name:
	for j in action:
		print(f"{i} {j}")
Output:
  Bill 熬夜趕作業
  Bill 吃了一塊蛋糕
  Benson 熬夜趕作業
  Benson 吃了一塊蛋糕

例題 6

小八貓和烏薩奇得知吉伊家附近有很多奇美拉,決定來幫他討伐,順便除草賺錢

例題 6

他們決定三個人輪流,一天討伐一隻奇美拉

例題 6

請大家打開 class-2 資料夾中的  06_monster_turn.py

例題 6

monster_list = ["粉紅色奇美拉", "綠色奇美拉", "藍色奇美拉", "白色奇美拉", "咖啡色奇美拉"]
character_list = ["吉伊", "小八貓", "烏薩奇"]

給定怪物和角色的串列

他們三人決定按照順序,一人討伐一種奇美拉一次

三人輪流 

一層 for 迴圈

怪物也輪流 

另一層 for 迴圈

例題 6

monster_list = ["粉紅色奇美拉", "綠色奇美拉", "藍色奇美拉", "白色奇美拉", "咖啡色奇美拉"]
character_list = ["吉伊", "小八貓", "烏薩奇"]

他們三人決定按照順序,一人討伐一種奇美拉一次

請根據順序列印出討伐的過程

範例輸出:
第 1 天: 吉伊討伐了粉紅色奇美拉
第 2 天: 小八貓討伐了粉紅色奇美拉
第 3 天: 烏薩奇討伐了粉紅色奇美拉
第 4 天: 吉伊討伐了綠色奇美拉
第 5 天: 小八貓討伐了綠色奇美拉
...

參考解答

# TODO: 根據天數,印出負責討伐的人和討伐的怪物
day = 1
for m in monster_list:
    for c in character_list:
        print(f"第 {day} 天: {c}討伐了{m}")
        day += 1

參考解答

# TODO: 根據天數,印出負責討伐的人和討伐的怪物
day = 1
for m in monster_list:
    for c in character_list:
        print(f"第 {day} 天: {c}討伐了{m}")
        day += 1
Output:
第 1 天: 吉伊討伐了粉紅色奇美拉
第 2 天: 小八貓討伐了粉紅色奇美拉
第 3 天: 烏薩奇討伐了粉紅色奇美拉
第 4 天: 吉伊討伐了綠色奇美拉
第 5 天: 小八貓討伐了綠色奇美拉
第 6 天: 烏薩奇討伐了綠色奇美拉
第 7 天: 吉伊討伐了藍色奇美拉
第 8 天: 小八貓討伐了藍色奇美拉
第 9 天: 烏薩奇討伐了藍色奇美拉
第 10 天: 吉伊討伐了白色奇美拉
第 11 天: 小八貓討伐了白色奇美拉
第 12 天: 烏薩奇討伐了白色奇美拉
第 13 天: 吉伊討伐了咖啡色奇美拉
第 14 天: 小八貓討伐了咖啡色奇美拉
第 15 天: 烏薩奇討伐了咖啡色奇美拉

continue & break

  • continue
    • 跳過該次迭代剩下的程式碼,執行下一次
  • break
    • 跳出目前的迴圈結構

continue 

跳過該次迭代剩下的程式碼,執行下一次

for i in range(5):
  	if i == 2:
    	continue
	print(i)

continue 

for i in range(5):
  	if i == 2:
    	continue
	print(i)
Output:
0
1
3
4

跳過該次迭代剩下的程式碼,執行下一次

break

跳出目前的迴圈結構

for i in range(5):
  	if i == 2:
    	break
	print(i)

break

跳出目前的迴圈結構

for i in range(5):
  	if i == 2:
    	break
	print(i)
Output:
0
1

例題 7

前來支援的小八貓和烏薩奇,其實各自有特別害怕的奇美拉

例題 7

請大家打開 class-2 資料夾中的  06_monster_turn.py

我們要在例題 6 的程式碼上加入一些變化

例題 7

monster_list = ["粉紅色奇美拉", "綠色奇美拉", "藍色奇美拉", "白色奇美拉", "咖啡色奇美拉"]
character_list = ["吉伊", "小八貓", "烏薩奇"]

給定怪物和角色的串列(和例題6一樣)

我們得知:

小八貓特別害怕藍色奇美拉

烏薩奇特別害怕白色奇美拉

例題 7

monster_list = ["粉紅色奇美拉", "綠色奇美拉", "藍色奇美拉", "白色奇美拉", "咖啡色奇美拉"]
character_list = ["吉伊", "小八貓", "烏薩奇"]

小八貓特別害怕藍色奇美拉,他會逃跑,並輪到下一個順位的烏薩奇戰鬥。

烏薩奇特別害怕白色奇美拉,他會帶著大家一起逃跑,終止討伐的過程。

要如何用程式實現這個過程呢?

例題 7

範例輸出:
第 1 天: ...
...
小八貓遇到藍色奇美拉,小八貓逃走了
...
烏薩奇遇到白色奇美拉,全體撤退	
# 輸出結束

小八貓 v.s. 藍色奇美拉:小八貓逃跑,輪到烏薩奇戰鬥

烏薩奇 v.s. 白色奇美拉:烏薩奇帶著大家一起逃跑

例題 7

範例輸出:
第 1 天: ...
...
小八貓遇到藍色奇美拉,小八貓逃走了
...
烏薩奇遇到白色奇美拉,全體撤退	
# 輸出結束

小八貓 v.s. 藍色奇美拉:小八貓逃跑,輪到烏薩奇戰鬥

烏薩奇 v.s. 白色奇美拉:烏薩奇帶著大家一起逃跑

  • Hint 1:當有兩層迴圈,可能需要 break 一次以上
  • Hint 2:可以使用一個 True / False 值來判斷何時要 break

參考答案

# TODO: 根據天數,印出負責討伐的人和討伐的怪物
flag = False
day = 1
for m in monster_list:
    for c in character_list:
        if c == "小八貓" and m == "藍色奇美拉":
            print("小八貓遇到藍色奇美拉,小八貓逃走了")
            continue
        elif c == "烏薩奇" and m == "白色奇美拉":
            print("烏薩奇遇到白色奇美拉,全體撤退")
            flag = True
            break

        print(f"第 {day} 天: {c}討伐了{m}")
        day += 1
    
    if flag == True:
        break

參考答案

# TODO: 根據天數,印出負責討伐的人和討伐的怪物
flag = False
day = 1
for m in monster_list:
    for c in character_list:
        if c == "小八貓" and m == "藍色奇美拉":
            print("小八貓遇到藍色奇美拉,小八貓逃走了")
            continue
        elif c == "烏薩奇" and m == "白色奇美拉":
            print("烏薩奇遇到白色奇美拉,全體撤退")
            flag = True
            break

        print(f"第 {day} 天: {c}討伐了{m}")
        day += 1
    
    if flag == True:
        break
Output:
第 1 天: 吉伊討伐了粉紅色奇美拉
第 2 天: 小八貓討伐了粉紅色奇美拉
第 3 天: 烏薩奇討伐了粉紅色奇美拉
第 4 天: 吉伊討伐了綠色奇美拉
第 5 天: 小八貓討伐了綠色奇美拉
第 6 天: 烏薩奇討伐了綠色奇美拉
第 7 天: 吉伊討伐了藍色奇美拉
小八貓遇到藍色奇美拉,小八貓逃走了
第 8 天: 烏薩奇討伐了藍色奇美拉
第 9 天: 吉伊討伐了白色奇美拉
第 10 天: 小八貓討伐了白色奇美拉
烏薩奇遇到白色奇美拉,全體撤退

總結

總結

  • 算術運算子
  • 判斷
  • 迴圈
  • 算術運算子
    • 加減乘除
    • 進階算術運算子
    • 字串加法
  • 算術運算子
    • 加減乘除
    • 進階算術運算子
    • 字串加法
  • 判斷
    • 條件式
      • 關係、邏輯、成員
    • if...elif...else...
  • 算術運算子
    • 加減乘除
    • 進階算術運算子
    • 字串加法
  • 判斷
    • 條件式
      • 關係、邏輯、成員
    • if...elif...else...
  • 迴圈
    • 可迭代物
      • range(), string, list
    • for 迴圈、while 迴圈
    • 巢狀迴圈
    • continue & break

class-2

By bonniechuang

class-2

  • 108