TQC+ Python 第2版|第四章「字串與檔案處理」詳解答案

BY PJ. -2025 年 7 月 8 日
(最後更新於: 2025 年 7 月 11 日)


Chapter 4 字串與檔案處理 習題

習題 1:計算單字數量

  • 題目描述
    請撰寫一程式,讓使用者輸入一個英文字句,計算並輸出句子內的單字數量。

  • 輸入輸出
    (a) 輸入說明:一個英文字句
    (b) 輸出說明:句子內的單字數量

  • 範例

> 範例輸入1
Life is short, use Python.
> 範例輸出1
5
> 範例輸入2
Above all, don’t lie to yourself.
> 範例輸出2
6
  • 參考解法
sentence = input('')
print(f'單字數量 = {len(sentence.split(' '))}')

習題2:算術運算

  • 題目描述
    請撰寫一程式,讓使用者輸入數學運算式(包含數字 0~9、加號 +、減號 -),計算並輸出運算結果。 注意:本題禁止直接套用內建函式 eval() 到使用者輸入的運算式。

  • 輸入輸出
    (a) 輸入說明:數學運算式(包含數字 0~9、加號 +、減號 -)
    (b) 輸出說明:運算結果

  • 範例

> 範例輸入1
輸入運算式:3+5.6-7.1+8
> 範例輸出1
運算結果:9.5
> 範例輸入2
輸入運算式:-2.5+5-3.14-9.7
> 範例輸出2
運算結果:-10.34
  • 參考解法
# 去掉空白
expr = input("輸入運算式:").replace(" ", "")

# 開頭為負號的情況:在最前面補一個 0,讓後面 split 時不會漏掉第一個負數
if expr.startswith('-'):
    expr = '0' + expr

# 先以 '+' 切割
parts = expr.split('+')
ans = 0.0

for part in parts:
    # 再以 '-' 切割
    subparts = part.split('-')
    # 加上第一個數字
    ans += float(subparts[0])
    # 減去後面的每一個數字
    for num_str in subparts[1:]:
        # subparts[1:] 肯定不是空字串,直接減即可
        ans -= float(num_str)

print(f"運算結果:{ans}")

習題3:大小寫轉換

  • 題目描述
    請撰寫一程式,讓使用者輸入一個英文字句,依下列規則轉換每個單字內字母的大小寫:

  • 單字字首的大小寫互換

  • 除字首外,其餘皆為小寫

  • 輸入輸出
    (a) 輸入說明:一個英文字句
    (b) 輸出說明:依規則轉換後的英文字句

  • 範例

> 範例輸入1
輸入:Light TomorrOw wiTH toDAy.
> 範例輸出1
輸出:light tomorrow With Today.
> 範例輸入2
輸入:soRRy, i GoT loSS in Your EyEs Again.
> 範例輸出2
輸出:Sorry, I got Loss In your eyes again.
  • 參考解法
sentence = input("輸入:")

parts = sentence.split(' ')
new_sentence = []

for part in parts:
    new_word = ''
    for i in range(len(part)):

        if i == 0: #每個單字首字轉換大小寫
            if part[i].isupper():
                new_word += part[i].lower()
            else:
                new_word += part[i].upper()
        else:
            new_word += part[i].lower()

    new_sentence.append(new_word)

print('輸出:',' '.join(new_sentence),sep='')

習題4:迴文判斷

  • 題目描述
    請撰寫一程式,讓使用者輸入一個英文字句,在忽略字母大小寫及標點符號(逗點 ,、句點 .、問號 ? 與空白)的前提下,判斷是否為迴文。

  • 輸入輸出
    (a) 輸入說明:一個英文字句
    (b) 輸出說明:判斷該英文字句是否為迴文,輸出「是迴文」或「不是迴文」

  • 範例

> 範例輸入1
請輸入:Do geese see God?
> 範例輸出1
是迴文
> 範例輸入2
請輸入:Was it a car or a cat I saw?
> 範例輸出2
是迴文
> 範例輸入3
請輸入:Step on no pet.
> 範例輸出3
不是迴文

提示:迴文(palindrome)是指由左念到右或由右念到左,字母排列順序都一樣的單字、片語、句子,甚至是數字,中間的標點符號、大小寫和間隔可以忽略。例如 deed、level、1221 等。

  • 參考解法
sentence = input('請輸入:')
sentence = [s.lower() for s in sentence if s.isalpha()] #只保留字母且統一轉換小寫
sentence = ''.join(sentence) #列表組合為字串

if sentence == sentence[::-1]:
    print('是迴文')
else:
    print('不是迴文')

習題5:檢查密碼

  • 題目描述
    請撰寫一程式,讓使用者輸入密碼,並依下列規則檢查密碼是否有效:

  • 至少八個字元

  • 只包含英文字母與數字
  • 至少包含兩個數字 符合上述規則則顯示 「valid password」,否則顯示 「invalid password」。

  • 輸入輸出
    (a) 輸入說明:一個密碼
    (b) 輸出說明:valid password 或 invalid password

  • 範例

> 範例輸入1
請輸入密碼:123pikachu
> 範例輸出1
valid password
> 範例輸入2
請輸入密碼:pokemnon9
> 範例輸出2
invalid password
> 範例輸入3
請輸入密碼:2pokemon3_5
> 範例輸出3
invalid password
  • 參考解法
pwd = input('請輸入密碼:')

num_cnt = 0

if len(pwd) >= 8:#初始化
    valid = True 
else:
    valid = False

for p in pwd:
    if p.isdigit() == True:
        num_cnt += 1
    elif p.isalpha() == True:
        pass
    else:#不是數字或字母
        valid = False

if num_cnt < 2:
    valid = False

if valid:
    print('valid password')
else:
    print('invalid password')

習題6:單字在檔案中出現的位置

  • 題目描述
    請撰寫一程式,讓使用者輸入一個英文單字 s,找出它在檔案 06.txt 中的所有位置(以字元編號計);若找不到,輸出 -1。

  • 檔案 「06.txt」 部分內容:

Pokemon is a Japanese media franchise consisting of video games,
animated series and films, a trading card game, and other related media.
The franchise takes...
  • 檔案連結: 06.txt

  • 輸入輸出
    (a) 輸入說明:一個英文單字S
    (b) 輸出說明:找出S出現在檔案內的所有位置;若找不到,則輸出-1

  • 範例

> 範例輸入1
請輸入單字:Pokemon
> 範例輸出1
單字 'Pokemon' 的出現位置:[0, 236, 737, 891, 1063, 1125]
> 範例輸入2
請輸入單字:Niantic
> 範例輸出2
單字 'Niantic' 的出現位置:[1115]
> 範例輸入3
請輸入單字:pokemon
> 範例輸出3
-1
  • 參考解法
#讀取資料
f = open('06.txt','r')
data = f.read()
f.close()

s = input('請輸入單字:')
idx = 0 #尋找單字的起始位置
locs = [] #儲存找到的位置

while True:
    loc = data.find(s,idx)
    if loc == -1:
        break
    else:
        locs.append(loc)
        idx = loc + 1

if len(locs) == 0:
    print(-1)
else:
    print(f"單字 '{s}' 的出現位置:{locs}")

習題7:寶可夢計算

  • 題目描述
    請撰寫一程式,讀取檔案 「pokemon.csv」,其第一列為欄位名稱,且各欄位以逗點(,)分隔,計算 Type1 欄位為 Water 的寶可夢數量,並計算這些寶可夢 HP 欄位的平均值。

  • 檔案 「pokemon.csv」 部分內容範例

Name,Type1,HP
妙蛙種子,Grass,45
妙蛙草,Grass,60
妙蛙花,Grass,80
妙蛙花Mega,Grass,80
小火龍,Fire,39
小火龍,Water,44
…(更多列)…
  • 檔案下載連結pokemon.csv

  • 輸入輸出
    (a) 輸入說明:無
    (b) 輸出說明:Type1欄位為Water寶可夢的數量與HP平均值

  • 範例

> 範例輸出
數量 = 122
HP平均 = 70.90163934426229
  • 參考解法
f = open('pokemon.csv','r',encoding='utf-8')
data = f.readlines()
f.close()

HPs = []

for line in data:
    parts = line.split(',')
    if parts[1] == 'Water':
        HPs.append(eval(parts[2]))

print(f'數量 = {len(HPs)}')
print(f'HP平均 = {sum(HPs) / len(HPs)}')


#TQC #Python #TQCPython第2版 #TQCPython第二版 #字串與檔案處理 #Python認證 #Python基礎 #Python教學 #Python證照 #Python入門

💬 留言區