一些講義中沒講的東西
這份講義以 APCS 三級為短期目標來撰寫,所以有些指令與函數沒有納入,另外有需要提醒的事情,以下做簡略說明。
for 迴圈的注意事項
我們知道 for 迴圈的使用方法是 for x in A: 對於 A 中的每一個 x,每個都要來、一個一個來、依照順序來。如果執行下面的程式會如何呢?
for i in range(5):
print(i)
i += 3
print(i)
猜對了嗎?如果你在迴圈內改變 i 的值,並不能控制迴圈執行的次數,事實上每回合進入迴圈時,i 都依照原有的 [0,1,2,3,4] 被重新賦值。以下的程式呢?
a = [0,1,2,9,4]
for i in range(5):
if a[i] < 5:
a.pop(i)
從表面上看,這程式對 a 中的每個元素檢查,如果 <5 就將它刪除。但它是錯的。因為當執行 a.pop(i) 時改變了 a 的內容,所以會造成 runtime error(index out of range)。即使加上 index 檢查也不是正確的結果。
a = [0,1,0,1,0]
for i in range(5):
if i < len(a) and a[i] == 0:
a.pop(i)
原因是當刪除發生時,後面的元素 index 改變了。下面的迴圈將導致無窮迴圈:
a = [1,2,3]
for x in a:
print(x)
a.append(x)
這裡就是告訴大家注意兩件事:
for i in range(n)的迴圈內改變i的值是不能控制迴圈的執行。- 不要在
for x in A的迴圈中改變A,那是件危險的事情。
EOF 結尾的測資
所謂 EOF 是 End Of File 的意思,是檔案結尾的一個符號,但不同平台用的不一樣,Windows 是 control-z,而 Linux 下是 control-d。在 ZJ 與鋼路上都有不少題目測資是 EOF 結尾的格式,例如題目這樣說:
輸入有多行,每行兩個數字,輸出每行兩數的和(直到 EOF)。
不管有沒有說直到 EOF,都意思是直到輸入檔案結束為止。每個程式語言處理 EOF 的方法各異,APCS 從來沒有考過這樣的測資,因為跟她檢測的理念不符吧(考一個很特定的用法,不會就認定不會寫程式,這大概也不適合)。
那 Python 到底怎麼處理 EOF 呢?執行下面的程式:
while True:
try:
a, b = map(int, input().split())
# except: break
except EOFError:
break
print(a + b)
執行程式後你可不知道怎麼讓程式正常結束,試著輸入幾行測資後按下 control-d(或 control-z),程式就會正常結束了。「try: ... except: ...」指令的意思就是「嘗試做…,如果碰到錯誤就…」。這裡因為只會有 EOF 的錯誤,所以寫不寫 EOFError 都可以。
下面程式碼用 Exception(例外) 其實就是 except + ion。
Exception 是指所有錯誤都
while True:
try:
a, b = map(int, input().split())
except Exception:
break
print(a + b)