Python編程基礎(六)| 用戶輸入和while循環

引言

很久沒有寫 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 語句是編程中最基本的控制流結構,用于根據條件的真假執行不同的代碼塊。
  • 比較運算符> (大于) 是一個比較運算符,用于判斷一個數是否大于另一個數,返回布爾值 TrueFalse

練習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 循環:用于重復執行一段代碼,直到某個條件不再滿足。
  • 無限循環與 breakwhile 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 < 3age < 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 會返回 TrueFalse
  • 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),這使得打印格式化的結果非常方便。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914779.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914779.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914779.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【華為機試】HJ52 計算字符串的編輯距離

文章目錄HJ52 計算字符串的編輯距離描述輸入描述輸出描述示例1HJ52 計算字符串的編輯距離描述輸入描述輸出描述示例1解題思路算法分析動態規劃狀態轉移狀態轉移方程算法流程圖DP表格示例三種操作詳解代碼實現思路時間復雜度分析關鍵優化技巧實際應用場景算法擴展面試考點完整題…

15.手動實現BatchNorm(BN)

15.1 BatchNorm操作手動實現 import torch from torch import nndef batch_norm(X,gamma,beta,moving_mean,moving_var,eps,momentum):if not torch.is_grad_enabled():#這個是推理模式X_hat(X-moving_mean)/torch.sqrt(moving_vareps)else:assert len(X.shape) in (2,4)if le…

【項目實踐】SMBMS(Javaweb版)匯總版

文章目錄前期準備工作數據庫、數據表創建web項目創建項目文件目錄配置Tomcat&#xff0c;導入依賴建立實體類編寫基礎公共方法類導入基礎資源登錄功能登錄頁面持久層dao層的用戶登錄及接口實現dao層接口實現所需的方法業務層sevice層的接口的實現接口實現相關的業務邏輯編寫ser…

隱藏源IP的核心方案與高防實踐

一、源IP暴露的風險 直接DDoS攻擊&#xff1a;2025年Q2全球DDoS攻擊峰值達3.8Tbps&#xff08;來源&#xff1a;Cloudflare報告&#xff09;漏洞利用&#xff1a;暴露的SSH端口平均每天遭受12,000暴力破解嘗試數據泄露&#xff1a;直接連接數據庫風險提升300% 二、4種有效隱藏方…

深度學習圖像分類數據集—五種電器識別分類

該數據集為圖像分類數據集&#xff0c;適用于ResNet、VGG等卷積神經網絡&#xff0c;SENet、CBAM等注意力機制相關算法&#xff0c;Vision Transformer等Transformer相關算法。 數據集信息介紹&#xff1a;五種電器識別分類&#xff1a;[notebook, phone, powerbank, tablet, w…

Windows11家庭版配置frigate 嵌入自研算法(基于Yolov8)-【2】

使用 YOLOv8 的 results.xyxy 結構&#xff0c;下面是一個完整的 MQTT 推送腳本&#xff0c;用于把識別到的目標&#xff08;比如突涌水、水漬、障礙物等&#xff09;發送到 Frigate 的 MQTT 接口。? 前提假設 YOLOv8 推理代碼已經運行并生成 results.xyxy。每一行是 [x1, y1,…

安裝llama-factory報錯 error: subprocess-exited-with-error

報錯信息如下 Using cached https://mirrors.aliyun.com/pypi/packages/17/89/940a509ee7e9449f0c877fa984b37b7cc485546035cc67bbc353f2ac20f3/av-15.0.0.tar.gz (3.8 MB)Preparing metadata (pyproject.toml) ... errorerror: subprocess-exited-with-error Preparing metad…

QT 多線程 管理串口

記錄一下自己使用多線程進行串口管理和數據讀取的過程。如果有問題的話可以發消息給我。背景在使用QT制作一個串口數據讀取處理的小軟件的時候&#xff0c;發現了存在界面卡頓的情況&#xff0c;感覺性能太低&#xff0c;于是考慮把串口數據的讀取和處理都放到子線程的緩沖區中…

在虛擬環境中復現論文(環境配置)

前提&#xff1a;已經下載condawinR&#xff0c;輸入cmd進入命令行conda create -n PPT python3.8.3 pytorch1.7.0conda create -n PPT(虛擬環境名) python3.8.3(包名) pytorch1.7.0(包名)安裝完畢&#xff0c;激活虛擬環境&#xff1a;conda activate PPT根據論文readme要求安…

Flutter Web 的發展歷程:Dart、Flutter 與 WasmGC

Flutter Web 應該是 Flutter 開發者里最不“受寵”的平臺了&#xff0c;但是其實 Flutter 和 Dart 團隊對于 Web 的投入一直沒有減少&#xff0c;這也和 Flutter 還有 Dart 的"出生"有關系&#xff0c;今天就借著 Dart 團隊的 mer A?acan 和 Martin Kustermann 在油…

c#方法關鍵字,ref、out、int

在 C# 中&#xff0c;ref、out 和 in 是用于方法參數傳遞的關鍵字&#xff0c;它們控制參數如何在方法和調用者之間傳遞數據。以下是對這三個關鍵字的詳細分析&#xff1a;1. ref 關鍵字&#xff08;引用傳遞&#xff09;作用允許方法修改調用者的變量&#xff1a;通過引用傳遞…

設計模式—初識設計模式

1.設計模式經典面試題分析幾個常見的設計模式對應的面試題。1.1原型設計模式1.使用UML類圖畫出原型模式核心角色&#xff08;意思就是使用會考察使用UML畫出設計模式中關鍵角色和關系圖等&#xff09;2.原型設計模式的深拷貝和淺拷貝是什么&#xff0c;寫出深拷貝的兩種方式的源…

深度學習-參數初始化、損失函數

A、參數初始化參數初始化對模型的訓練速度、收斂性以及最終的性能產生重要影響。它可以盡量避免梯度消失和梯度爆炸的情況。一、固定值初始化在神經網絡訓練開始時&#xff0c;將權重或偏置初始化為常數。但這種方法在實際操作中并不常見。1.1全零初始化將所有的權重參數初始化…

格密碼--Ring-SIS和Ring-LWE

1. 多項式環&#xff08;Polynomial Rings&#xff09; 設 f∈Z[x]f \in \mathbb{Z}[x]f∈Z[x] 是首一多項式&#xff08;最高次項系數為1&#xff09; 則環 RZ[x]/(f)R \mathbb{Z}[x]/(f)RZ[x]/(f) 元素為&#xff1a;所有次數 <deg?(f)< \deg(f)<deg(f) 的多項式…

前端工作需要和哪些人打交道?

前端工作中需要協作的角色及協作要點 前端工作中需要協作的角色及協作要點 前端開發處于產品實現的 “中間環節”,既要將設計方案轉化為可交互的界面,又要與后端對接數據,還需配合團隊推進項目進度。日常工作中,需要頻繁對接的角色包括以下幾類,每類協作都有其核心目標和…

萬字長文解析 OneCode3.0 AI創新設計

一、研究概述與背景 1.1 研究背景與意義 在 AI 技術重塑軟件開發的浪潮中&#xff0c;低代碼平臺正經歷從 “可視化編程” 到 “意圖驅動開發” 的根本性轉變。這種變革不僅提升了開發效率&#xff0c;更重新定義了人與系統的交互方式。作為國內領先的低代碼平臺&#xff0c;On…

重學前端006 --- 響應式網頁設計 CSS 彈性盒子

文章目錄盒模型一、盒模型的基本概念二、兩種盒模型的對比 舉例三、總結Flexbox 彈性盒子布局一、Flexbox 的核心概念??二、Flexbox 的基本語法????1. 定義 Flex 容器???2. Flex 容器的主要屬性????3. Flex 項目的主要屬性????三、Flexbox 的常見布局示例??…

rLLM:用于LLM Agent RL后訓練的創新框架

rLLM&#xff1a;用于LLM Agent RL后訓練的創新框架 本文介紹了rLLM&#xff0c;一個用于語言智能體后訓練的可擴展框架。它能讓用戶輕松構建自定義智能體與環境&#xff0c;通過強化學習進行訓練并部署。文中還展示了用其訓練的DeepSWE等智能體的出色表現&#xff0c;以及rLL…

rocky8 --Elasticsearch+Logstash+Filebeat+Kibana部署【7.1.1版本】

軟件說明&#xff1a; 所有軟件包下載地址&#xff1a;Past Releases of Elastic Stack Software | Elastic 打開頁面后選擇對應的組件及版本即可&#xff01; 所有軟件包名稱如下&#xff1a; 架構拓撲&#xff1a; 集群模式&#xff1a; 單機模式 架構規劃&#xff1a…

【JVM】內存分配與回收原則

在 Java 開發中&#xff0c;自動內存管理是 JVM 的核心能力之一&#xff0c;而內存分配與回收的策略直接影響程序的性能和穩定性。本文將詳細解析 JVM 的內存分配機制、對象回收規則以及背后的設計思想&#xff0c;幫助開發者更好地理解 JVM 的 "自動化" 內存管理邏輯…