引言
很久沒有寫 Python 了,有一點生疏。這是學習《Python 編程:從入門到實踐(第3版)》的課后練習記錄,主要目的是快速回顧基礎知識。
練習1:汽車租賃
編寫一個程序,詢問用戶要租什么樣的汽車,并打印一條消息。
# 使用 input() 函數獲取用戶輸入
car_type = input("請問您想要租什么樣的汽車? ")# 使用 f-string 格式化輸出,使回復更具動態性
print(f"好的,我來幫您看看是否能找到一輛 {car_type.title()}。")
請問您想要租什么樣的汽車? Subaru
好的,我來幫您看看是否能找到一輛 Subaru。
知識點回顧:
input()
函數:這是 Python 中獲取用戶在終端輸入的標準方式。程序會在此處暫停,等待用戶輸入并按回車。- 變量存儲:
input()
返回的是一個字符串,我們將其存儲在變量car_type
中以便后續使用。 - f-string:通過在字符串前加上字母
f
,可以直接在花括號{}
中嵌入變量,使字符串的拼接和格式化變得非常簡潔和易讀。 - 字符串方法:
.title()
方法可以將用戶輸入的汽車品牌(即使是小寫)以首字母大寫的規范形式顯示出來。
練習2:餐館訂位
編寫一個程序,詢問用戶有多少人用餐。如果超過8個人,就打印一條消息,指出沒有空桌;否則指出有空桌。
# 獲取用餐人數的輸入
guest_count_str = input("您好,請問總共有多少人用餐? ")# 將輸入從字符串轉換為整數
guest_count = int(guest_count_str)# 使用 if-else 結構進行條件判斷
if guest_count > 8:print("非常抱歉,目前沒有足夠大的空桌,請您稍等片刻。")
else:print("好的,有空桌,這邊請!")
您好,請問總共有多少人用餐? 9
非常抱歉,目前沒有足夠大的空桌,請您稍等片刻。
知識點回顧:
- 類型轉換:
input()
總是返回字符串類型。要進行數值比較(如大于、小于),必須使用int()
函數將其顯式轉換為整數。 - 條件判斷:
if-else
語句是編程中最基本的控制流結構,用于根據條件的真假執行不同的代碼塊。 - 比較運算符:
>
(大于) 是一個比較運算符,用于判斷一個數是否大于另一個數,返回布爾值True
或False
。
練習3: 10的整數倍
讓用戶輸入一個數,并指出這個數是否是10的整數倍。
# 獲取用戶輸入的數字
number_str = input("請輸入一個整數,我將判斷它是否是10的整數倍:")
number = int(number_str)# 使用求模運算符 % 進行判斷
if number % 10 == 0:print(f"數字 {number} 是10的整數倍。")
else:print(f"數字 {number} 不是10的整數倍。")
請輸入一個整數,我將判斷它是否是10的整數倍:30
數字 30 是10的整數倍。
知識點回顧:
- 求模運算符
%
:也叫取余運算符,它返回兩數相除的余數。如果一個數n % 10
的結果是0
,說明n
可以被10整除,即是10的倍數。這是判斷整除性的通用方法。 ==
運算符:用于判斷兩個值是否相等。注意與=
(賦值運算符)區分。
練習4:比薩配料
編寫一個循環,提示用戶輸入一系列比薩配料,并在用戶輸入’quit’時結束循環。每當用戶輸入一種配料后,都打印一條消息,指出要在比薩中添加這種配料。
# 定義一個提示信息,方便復用
prompt = "\n請輸入您想添加的比薩配料:"
prompt += "\n(輸入 'quit' 即可完成點餐) "# 使用 while True 循環,直到遇到 break
while True:topping = input(prompt)if topping == 'quit':break # 當用戶輸入 'quit' 時,跳出循環else:print(f"好的,我們會在您的比薩中添加 {topping}。")
請輸入您想添加的比薩配料:
(輸入 'quit' 即可完成點餐) 蘑菇
好的,我們會在您的比薩中添加 蘑菇。請輸入您想添加的比薩配料:
(輸入 'quit' 即可完成點餐) 培根
好的,我們會在您的比薩中添加 培根。請輸入您想添加的比薩配料:
(輸入 'quit' 即可完成點餐) quit
知識點回顧:
while
循環:用于重復執行一段代碼,直到某個條件不再滿足。- 無限循環與
break
:while True:
創建了一個理論上會永遠執行的循環。break
語句是控制這種循環的關鍵,它提供了一個出口,當滿足特定條件(用戶輸入’quit’)時,可以立即終止循環。 - 代碼簡潔性:將多行提示語存儲在一個變量中,可以讓
input()
調用本身更整潔。
練習5:電影票
有家電影院根據觀眾的年齡收取不同的票價:不到3歲的觀眾免費;3(含)~12歲的觀眾收費10美元;年滿12歲的觀眾收費15美元。請編寫一個循環,在其中詢問用戶的年齡,并指出其票價。
prompt = "請輸入您的年齡(輸入非數字或'quit'退出):"while True:age_input = input(prompt)# 允許用戶輸入 'quit' 退出if age_input == 'quit':break# 使用 try-except 處理無效輸入(例如非數字)try:age = int(age_input)except ValueError:print("請輸入有效的年齡數字或 'quit'。")continue # 跳過本次循環的余下部分if age < 3:price = "免費"elif age < 12:price = "10美元"else:price = "15美元"print(f"您的票價是:{price}。")
請輸入您的年齡(輸入非數字或'quit'退出):2
您的票價是:免費。
請輸入您的年齡(輸入非數字或'quit'退出):10
您的票價是:10美元。
請輸入您的年齡(輸入非數字或'quit'退出):25
您的票價是:15美元。
請輸入您的年齡(輸入非數字或'quit'退出):quit
知識點回顧:
if-elif-else
結構:當有多個互斥的條件需要判斷時,使用if-elif-else
鏈條。Python 會從上到下依次檢查每個條件,一旦找到滿足的,就會執行對應代碼塊并忽略余下的所有條件。- 邊界條件:注意條件
age < 3
和age < 12
的設置。因為程序會按順序檢查,所以第二個條件age < 12
隱含了age >= 3
的前提。 try-except
錯誤處理 (可選但推薦):在將輸入轉換為整數時,如果用戶輸入了非數字字符,int()
函數會拋出ValueError
錯誤導致程序崩潰。使用try-except
可以優雅地捕獲這個錯誤,提示用戶,并使用continue
語句跳過當前無效的輸入,繼續下一次循環。
練習6:三種出路
以不同的方式完成練習5,在程序中采取如下做法。
- 在
while
循環中使用條件測試來結束循環。 - 使用變量
active
來控制循環結束的時機。 - 使用
break
語句在用戶輸入 ‘quit’ 時退出循環。(已在練習5中演示)
# 方法二:使用 active 標志位
prompt = "請輸入您的年齡(輸入'quit'退出):"
active = True # 設置一個活動標志while active:age_input = input(prompt)if age_input == 'quit':active = False # 將標志位置為 False,循環將在下次檢查時結束else:age = int(age_input)if age < 3:print("您的票是免費的")elif age < 12:print("您的票是10美元")else:print("您的票是15美元")
請輸入您的年齡(輸入'quit'退出):18
您的票是15美元
請輸入您的年齡(輸入'quit'退出):5
您的票是10美元
請輸入您的年齡(輸入'quit'退出):quit
知識點回顧:
- 標志位 (Flag):使用一個布爾變量(如
active
)來控制循環的執行狀態是一種常見的編程技巧。循環的繼續條件是while active:
。當需要退出時,只需在循環內部將active
設為False
,循環在完成當前迭代后就會自然終止。這種方法比while True
+break
在邏輯上顯得更明確。
練習7:無限循環
編寫一個沒完沒了的循環,并運行它。(要結束該循環,可按Ctrl + C
)
# 這是一個無限循環的經典例子
while True:print("這個循環將永遠運行下去,按 Ctrl+C 可以強制停止。")
這個循環將永遠運行下去,按 Ctrl+C 可以強制停止。
這個循環將永遠運行下去,按 Ctrl+C 可以強制停止。
...
Traceback (most recent call last):File "main.py", line 2, in <module>print("...")
KeyboardInterrupt
知識點回顧:
- 無限循環:
while True:
是最直接的無限循環。它在需要程序持續運行直到被外部干預(如用戶、操作系統)的情況下非常有用,例如服務器監聽請求、游戲主循環等。 KeyboardInterrupt
:在終端中運行 Python 程序時,按下Ctrl+C
會發送一個“鍵盤中斷”信號給程序。如果程序沒有特殊處理這個信號,默認行為就是終止執行,并拋出KeyboardInterrupt
異常。
練習8:熟食店
創建一個名為 sandwich_orders
的列表,其中包含各種三明治的名字,再創建一個名為 finished_sandwiches
的空列表。遍歷列表,制作三明治并將其移到已完成列表中。
sandwich_orders = ['金槍魚三明治', '雞肉法棍', '雞蛋美乃滋三明治', '素食三明治']
finished_sandwiches = []# 當 sandwich_orders 列表不為空時,循環繼續
while sandwich_orders:# 使用 .pop() 取出訂單列表中的最后一個三明治current_sandwich = sandwich_orders.pop()print(f"我做好了您的 {current_sandwich}。")# 使用 .append() 將做好的三明治添加到已完成列表finished_sandwiches.append(current_sandwich)print("\n--- 所有三明治都做好了! ---")
for sandwich in finished_sandwiches:print(sandwich)
我做好了您的 素食三明治。
我做好了您的 雞蛋美乃滋三明治。
我做好了您的 雞肉法棍。
我做好了您的 金槍魚三明治。--- 所有三明治都做好了! ---
素食三明治
雞蛋美乃滋三明治
雞肉法棍
金槍魚三明治
知識點回顧:
- 將列表用作循環條件:
while sandwich_orders:
是一個非常 Pythonic 的寫法。當列表sandwich_orders
中有元素時,它在布爾上下文中被視為True
;當列表變為空時,它被視為False
,循環自動結束。 list.pop()
方法:從列表中移除并返回一個元素,默認是最后一個。這是“處理并移除”任務的理想選擇。list.append()
方法:將一個元素添加到列表的末尾。- 移動元素:這個練習完美演示了在兩個列表之間移動元素的標準模式:從一個列表中
pop
,然后append
到另一個列表中。
練習9:五香煙熏牛肉賣完了
使用練習8的列表,確保 'pastrami'
在其中至少出現了三次。在程序開頭打印消息指出 pastrami
賣完了,然后使用 while
循環將列表中的 'pastrami'
全部刪除。
sandwich_orders = ['pastrami', '金槍魚三明治', 'pastrami', '雞肉法棍', '雞蛋美乃滋三明治', 'pastrami', '素食三明治'
]
finished_sandwiches = []print("抱歉,我們的五香煙熏牛肉(pastrami)今天賣完了。")# 使用 while 循環刪除所有的 'pastrami'
while 'pastrami' in sandwich_orders:sandwich_orders.remove('pastrami')print("\n正在處理剩余訂單...")
while sandwich_orders:current_sandwich = sandwich_orders.pop()print(f"我做好了您的 {current_sandwich}。")finished_sandwiches.append(current_sandwich)print("\n--- 所有三明治都做好了! ---")
print(finished_sandwiches)
抱歉,我們的五香煙熏牛肉(pastrami)今天賣完了。正在處理剩余訂單...
我做好了您的 素食三明治。
我做好了您的 雞蛋美乃滋三明治。
我做好了您的 雞肉法棍。
我做好了您的 金槍魚三明治。--- 所有三明治都做好了! ---
['素食三明治', '雞蛋美乃滋三明治', '雞肉法棍', '金槍魚三明治']
知識點回顧:
in
關鍵字:用于檢查列表中是否包含某個特定元素。'pastrami' in sandwich_orders
會返回True
或False
。list.remove()
方法:從列表中刪除第一個匹配的元素。while
循環刪除所有匹配項:如果需要刪除列表中所有出現的某個特定值,while value in list:
配合list.remove(value)
是一個簡潔有效的方法。如果使用for
循環并在循環中刪除元素,會因為列表長度動態改變而導致意外行為,所以while
循環是更安全的選擇。
練習10:夢想中的度假勝地
編寫一個程序,調查用戶夢想中的度假勝地。使用提示,并編寫一個打印調查結果的代碼塊。
# 創建一個空字典來存儲調查結果
responses = {}# 設置一個標志來控制循環是否繼續
polling_active = Truewhile polling_active:# 收集姓名和回答name = input("\n您好,您叫什么名字? ")place = input("如果您能去世界上的任何一個地方,您會去哪里? ")# 將回答存儲在字典中responses[name] = place# 詢問是否還有其他人要參與調查repeat = input("還有其他人要參與調查嗎? (yes/no) ")if repeat == 'no':polling_active = False# 調查結束,打印結果
print("\n--- 調查結果 ---")
for name, place in responses.items():print(f"{name.title()} 夢想的度假勝地是 {place.title()}。")
您好,您叫什么名字? 張三
如果您能去世界上的任何一個地方,您會去哪里? 冰島還有其他人要參與調查嗎? (yes/no) yes您好,您叫什么名字? 李四
如果您能去世界上的任何一個地方,您會去哪里? 馬爾代夫還有其他人要參與調查嗎? (yes/no) no--- 調查結果 ---
張三 夢想的度假勝地是 冰島。
李四 夢想的度假勝地是 馬爾代夫。
知識點回顧:
- 動態填充字典:程序開始于一個空字典
responses
,在循環中根據用戶的輸入動態地添加鍵值對。responses[name] = place
這行代碼完成了賦值。 - 結合
while
循環和字典:這個練習展示了如何使用循環來收集信息,并用字典這種強大的數據結構來組織和存儲這些信息。 dict.items()
方法:在最后的for
循環中,.items()
方法被用來同時遍歷字典的鍵(name
)和值(place
),這使得打印格式化的結果非常方便。