{Python 語法}

Speed Run 那種,拿來給競程ㄉ

# CHAPTER 2

Basic Trivia

就是把我懶得分類的東西

都丟到這個子標題下

# PRESENTING CODE

開發環境

  • 如果你想要生活品質,那上面四個都不推薦
  • 不太好用,但基本上 APCS 考場扣掉 vim 只有這些:
  • LeafPad:一個乾淨的 Text Editor
  • IDLE:記得創建檔案,不要在 shell 跑程式
# PRESENTING CODE

IDLE

Light Attract Bugs

  • 反正我討厭互動模式
  • 按 F5 可以執行或上面有個 Run
# PRESENTING CODE

在終端執行 python

  • linux(APCS考場):搜尋 Terminal,或 ctrl + alt + T
  • 有些 Text Edtior,會直接在下面給你終端,例如 VS Code
  • 避免你剛好用到一個純文字編輯器,沒有一鍵執行
  • windows:搜尋命令提示字元,或搜尋 cmd
# PRESENTING CODE

在終端執行 python

  • 移動工作路徑:
cd {directory}
  • 工作路徑:

你要切到要執行程式的那層資料夾,電腦才找得到檔案

  • 執行 .py 檔案:
python {filename}
# PRESENTING CODE

在終端執行 python

# PRESENTING CODE

Online Judge

讓你解題的地方,丟扣上去,他會告訴你結果

  • 其他還有 CodeForces、資訊之芽的 Sprout Judge 等

你也可以來 kankoo 看每一場比賽的題目難度

灰色是純語法、咖啡色是麻煩實作或資結

綠色是基礎演算法

# PRESENTING CODE

新制 APCS

滿級更容易,天擇不掉人,台清交可能要漲分數了,我是不理解
  • 現在觀念題可以選 C 或 Python,看起來 Python 變很水
  • 可以選你要報哪級,每個級別都有三題,會卡級分上限
# CHAPTER 2

I/O、變數、運算

python 的 i/o 和自動偵測變數很強 ...

甚至有點太強了

所以亂寫會壞掉

print("Hellooooooooooooooooooooooo World")
# 就,對,字面上的意思
# Python 的 print() 會自動換行
# 你可以在程式碼前面加米字號,變整行註解

"""
或是像這樣,用三個引號包起來
可以形成多行註解
註解在 Debug 時很好用
"""
# PRESENTING CODE

Output

print("Hellooooooooooooooooooooooo World", end = "")
# 所以你給他一個新的 end,取代掉默認值就好
# 這樣輸出的結果不會換行,後面不加空白
# PRESENTING CODE

Output

  • 如果你不想換行,或希望輸出後增加其他東西?
  • end 預設為 "\n"
# PRESENTING CODE

變數

變數類型 說明 例子 備註
int 整數 -1、7、36 向下取整
float 浮點數 0.654、-1.98 精度問題
boolean 是或否 True、False 首字母大寫
string 字串 "duck"、'cat' 單或雙引號皆可
  • 基本上 Python 沒有 char 的概念
  • 你可以用 變數類型() 強制轉換變數型別
print(int(-2/3)) # 0
# PRESENTING CODE

變數

  • Python 會自動偵測變數類型,直接宣告就好
_int = 13
_str = "duck"
_float = 3.1415926
_bool = True
_undefined = None # 這意義不大

print(type(_int)) # <class 'int'>
print(type(_str)) # <class 'str'>
print(type(_float)) # <class 'float'>
print(type(_bool)) # <class 'bool'>
print(type(_undefined)) # <class 'NoneType'>

_undefined = 7
print(type(_undefined)) # <class 'int'>
  • 你可以用 type({變數名稱}) 來檢查它的類型
# PRESENTING CODE

變數

  • 請一開始就給變數初始值,你 Debug 時也比較舒服

舉例而言,我很喜歡給 -1e9 這個值

因為一般運算時不可能達到這個數

當你 Debug 看到 -1e9

就知道這個變數從頭到尾都沒被改過

  • type() 可以幹嘛?解決你的 TypeError
# PRESENTING CODE

運算

運算子 說明 例子 備註
+ 3+7 =10
- 16-9 =7
* 3*7 =21
/ 2/3 =0.666...
** 次方 2**7 =128
% 8%3 =1
== 比較 (3+17) == (21-1) True
# PRESENTING CODE

運算

f 是一個 >0 的 float

寫一套程式幫我把 f 無條件捨去至小數點後第三位

做完之後輸出

不要用 round(),如果你知道那是什麼

f = 3.1415926
fixed = int(f * 1000)
print(fixed / 1000)

如果你是想擷取 f 的小數部分呢?

# PRESENTING CODE

運算

print(max(1, 3, 5, 9.14561, 16)) # 16
print(min(1, 3, 5, 9.14561, 16)) # 1
  • max() 和 min():老實說他們跑很慢,但基本上不管
# PRESENTING CODE

bool 運算

print(True and False) # False
print(True or False) # True
print(not True) # False
  • and、or、not
  • De Morgon's Law:

not (A and B) = (not A) or (not B)

# PRESENTING CODE

str 運算

str1 = "abc"
str2 = "efg"

print(str1 + str2) # abcefg
print(str1 * 3) # abcabcabc
  • 你可以用 {變數名}[n] 來提取 str 的第 n 個字母
str1 = "abc"
str2 = "efg"

print(str1[1]) # b
print(str1[2] + str2[0]) # ce
# PRESENTING CODE

str 運算

  • 因為 python 的記憶題儲存機制,你不能更改 str 中的字元
s = "adc"
s[1] = "b"
# TypeError: 'str' object does not support item assignment
  • 解法:
s = "abZdefg"
ss = s[0:2] + "c" + s[3:7]
print(ss)

你也可以直接用 list 裝 char,我喜歡這麼做

# PRESENTING CODE

str 運算

  • 你可以用 ord(一個字母) 來提取字母的 ASCII
ch = "a"
print(ord(ch)) # 97
print(ord(ch)+1) # 98

假設今天 ch 是任何一個小寫字母

寫一套程式幫我判斷

ch 是字母表中的第幾個字母

不要查 ASCII 表,你也不需要背

# PRESENTING CODE

str 運算

假設今天 ch 是任何一個小寫字母

寫一套程式幫我判斷

ch 是字母表中的第幾個字母

不要查 ASCII 表,你也不需要背

ch = "h"
print(ord(ch) - ord('a') + 1)
# PRESENTING CODE

str 分割

str = "A B C D E F G"
a, b, c, d, e, f, g = str.split()
print(d) # D
sen = "I like the night. Without the dark, we’d never see the stars"
a, b = sen.split(". ") # 注意那個空格
print(a)
print(b)
# PRESENTING CODE

Formatted String

pi = 3.14159
r = 3
print(f"r = {r}, perimeter = {2*r*pi}, area = {r*r*pi}")
  • 在你的引號前面加 f
  • 用大括號包住你的變數名稱或運算
  • 其實 Python 還有其他方法做到類似事情但我覺得那些方法可讀性遠低於這個
content = input()
print(f"Your input = {content}")

# 輸入一個字串,再輸出同樣的東西
# PRESENTING CODE

Input

  • input() 吃進來的所有東西都視為 string
  • input() 吃進來的所有東西都視為 string,一次吃一行
  • 用 int() 之類的來轉換型別
T = 1
print(T) # 1
print(bool(T)) # True
# PRESENTING CODE

Input

  • map(function, list):

把 list 的東西,一個一個抓過來代入 function

a, b = map(int, input().split())
print(a+b)
# 堆,你寫出了一個加法器
  • map 其實還有很多用途,但之後再慢慢講
  • 注意要接好 map 傳回來的東西,否則 map 回傳的 type 很怪
# PRESENTING CODE

華氏 / 攝氏溫度轉換

若華氏溫度為 F,一個整數

則可經由公式 \(C = (F-32)\div1.8\)

得出攝氏溫度 C

設計一套程式,吃進一個整數 F,輸出 C

C 以向零取整的方式,轉換至整數

F = int(input())
C = (F-32)/1.8
print(int(C))
# PRESENTING CODE

給你一個整數 N

把它取絕對值後輸出

  • abs({數字}) 是 python 內建的一個方法回傳數字的絕對值
# PRESENTING CODE

有個阿罵每秒走 V 公尺

她每走 A 秒就要休息 B 秒才會繼續走

求她 X 秒可以走多少公尺

喔對,雖然有 if-else 或 loop 可能會比較好做

但這題有完全不需要的辦法

頂多你會需要用到一個 min()

# CHAPTER 2

條件

if (condition_1):
	...
elif (condition_2):
	...
else:
	...
# PRESENTING CODE

條件控制

  • Python 認縮排來判斷範圍!記得加 tab 之類的
  • condition 一定要是一個 bool
if (condition_1):
  	...
	if (condition_1_1):
    	...
    else:
    	...
elif (condition_2):
	...
else:
	...
# PRESENTING CODE

巢狀

  • 再說一次,記得好好縮排
  • 非常不建議在 Python 寫成單行形式,你 debug 會很痛苦
# PRESENTING CODE

根據原始分數轉換等第

吃進一個正整數 k

代表學生的百分制分數

輸出它的等第計分

假設使用者給的分數區間

不屬於以上任何一個分數

則輸出 ?

# PRESENTING CODE

根據原始分數轉換等第

X = int(input())
result = "?"

if (X > 100):
	pass
elif (X <= 100 and X >= 90):
	result = "A+"
elif (X >= 85):
	result = "A"
elif (X >= 80):
	result = "A-"
elif (X >= 77):
	result = "B+"
elif (X >= 73):
	result = "B"
elif (X >= 67):
	result = "C+"
elif (X >= 63):
	result = "C"
elif (X >= 60):
	result = "C-"
elif (X >= 50):
	result = "D"
elif (X > 0):
	result = "F"

print(result)
# PRESENTING CODE
2016 APCS 10 月 - pA

吃進三個正整數 a、b、c 代表三角形三邊長

把他們由小到大輸出

再告訴我這個三角形是直角、鈍角、銳角

或根本不存在

  • 三角形成立條件:任兩邊長相加 > 第三邊
  • 畢氏定理:\(a^2 + b^2 = c^2\)
# PRESENTING CODE
  • 首先,如果你想把 a 和 b 的值互換,python 支援此語法:
a = 1
b = 2
a, b = b, a
# 先說,並非每個語言都支持你這麼寫
  • 那我們可以先保證 \(a \leq b \leq c\) 對吧?
a, b, c = map(int, input().split())

if (a > b):
  a, b = b, a
if (b > c):
  b, c = c, b
if (a > b):
  a, b = b, a
# PRESENTING CODE
  • 為什麼要比較三次?

3

2

1

a, b, c = map(int, input().split())

2

3

1

if (a > b):
  a, b = b, a

2

1

3

if (b > c):
  b, c = c, b

1

2

3

if (a > b):
  a, b = b, a
  • 假設有不只 3 個數字,例如 N 個數字好了,總共要比較幾次?你能找到一個通式嗎?( 實際上這東西叫 Bubble Sort )
# PRESENTING CODE
a, b, c = map(int, input().split())

if (a > b):
  a, b = b, a
if (b > c):
  b, c = c, b
if (a > b):
  a, b = b, a

print(f"{a} {b} {c}")

if (a + b <= c):
    print("No")
elif (a*a + b*b < c*c):
    print("Obtuse")
elif (a*a + b*b == c*c):
    print("Right")
else:
    print("Acute")
# PRESENTING CODE

給你兩個數字 a、b,以及 a 與 b 邏輯運算的結果

求 a 與 b 可能用到 AND、OR、XOR 的哪些運算

# PRESENTING CODE
# CHAPTER 2

迴圈

whille (condition):
  ...
# PRESENTING CODE

whille

  • Python 認縮排來判斷範圍!記得加 tab 之類的
  • condition 一定要是一個 bool
  • 如果 condition 是對的,就一路執行,走到底範圍的底時,會回到範圍最上面
whille (True):
  ...
# PRESENTING CODE

whille

  • 無窮迴圈:
  • 它會導致你迴圈外的東西永遠跳不出來debug 時可以在迴圈的第一行輸出一個提示你就知道迴圈效果是否是自己要的
# PRESENTING CODE

whille

  • break:直接跳出正在跑的這個迴圈
  • continue:剩下的部分別跑了,重新回到迴圈第一行
while (True):
    # 這裡每次迴圈都會被執行到
    if (condition_1):
        continue # 回去第二行
    # 如果 condition_1,那這行就不會跑
    if (condition_2):
        break # 過去第 10 行
    # 如果 (condition_1 or condition_2),這行就不會跑

# 這個不在迴圈中
# PRESENTING CODE

whille

  • 這個會輸出什麼?
n = 0

while (n < 100):
    n += 1
    if (n%2 == 0):
        print(n)
n = 0

while (True):
    n += 1
    if (n%2 == 1):
        continue
    print(n)
    if (n>=100):
        break
 
  
  • 這個呢?
# PRESENTING CODE

range

  • range(l, r, d) 會產生一個等差數列,首項 l 公差 d任何一項都 < r,講帥一點叫左閉右開區間 [l, r)
print(f"{list(range(1, 10, 1))}") # [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(f"{list(range(1, 10, 2))}") # [1, 3, 5, 7, 9]
print(f"{list(range(10, 1, -1))}") # [10, 9, 8, 7, 6, 5, 4, 3, 2]
print(f"{list(range(3, 18, 4))}") # [3, 7, 11, 15]
  • 它的 type 也很奇怪。如果你真的想看裡面長什麼樣子 ( 基本上不會用),要強制轉成 list
print(type(range(1, 10, 1))) # <class 'range'>
# PRESENTING CODE

for

  • for A in B:

A 是隨便一個變數名稱,B 是一個可迭代的物件

(不可迭代物件還是能用,但順序會亂跳)

  • 像在分解一個大物件。B 是一個很大的東西,你拿迴圈去遍歷 B,把 B 的零件一個一個拆下來。每次你拆下來的小零件都叫 A,你可以在迴圈內使用
  • B 有多少零件,for 迴圈就會跑幾次,例如這樣會印出 1 到 10
for i in range(1, 11, 1):
	print(i)
# PRESENTING CODE

for

  • 更多例子:
for i in range(10, 0, -1):
    print(i)
for i in [1, 3, 5, 7, 9]:
    print(i)
n = 0
for i in range(1, 11, 1):
    n += i
print(n)
  • 實例上,for 比 while 常用很多很多,競程通常搭配 range() 控制迴圈次數,例如讀取輸入。或拿來遍歷 string、list、dict、set 之類的

噢,理論上

現在 APCS 的第一題你都能解了

它的範圍真的就考到迴圈而已

# PRESENTING CODE
2017 APCS 3 月 - pA

給你一個正整數 X

找出 X 的 |奇數位數字和 - 偶數位數字和|

  • 一個有點繞的想法:

我每次對 X 做 %10,就可以取出末位數字

我每次對 X 做 // 10,就可以踢掉末位數字

最後 X 會變成 0

# PRESENTING CODE
2017 APCS 3 月 - pA
X = int(input())

now = True
# 如果 now 就加進 odd,否則加進 even
odd, even = 0, 0
while (X>0):
    if (now):
        odd += X%10
    else:
        even += X%10
    X = X // 10
    now = not now

print(abs(odd-even))
  • 我們不能直接跟 python 說我要 int 的第幾位數
  • 但我們可以說,我要 string 的第幾個字元
# PRESENTING CODE
2017 APCS 3 月 - pA
X = input()

odd, even = 0, 0
for i in range(0, len(X), 2):
    odd += ord(X[i]) - ord('0')
for i in range(1, len(X), 2):
    even += ord(X[i]) - ord('0')
print(abs(odd-even))
  • 你可以用 ord(X[i]) - ord('0') 得到這個字元實際上是多少
  • 你可以用 len(X) 來獲取 X 這個 string 的長度
# CHAPTER 2

temp,拿來給我暫放東西用的

  • i/o、變數、if-else、for-while、dict、tuple、sorted、set、list ( 要有二維、要有 deque )、math、recursion、def、class、try-except
  • abs、round、type()、debug、string、and-or-not、min-max
  • 拿 for 做迭代但不用教 iterator,EOF
# CHAPTER 2

TODO

  • Judge,記得看範測
  • 新制 APCS
  • map 不轉 list 會怎麼樣
  • if-elif-else、for、while、range

Python 語法 Speed Run

By repkironca

Python 語法 Speed Run

  • 21