当前位置: 首页 > java >正文

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.xdnf.cn/news/15546.html

相关文章:

  • 算法精讲--正则表达式(二):分组、引用与高级匹配技术
  • GENERALIST REWARD MODELS: FOUND INSIDE LARGELANGUAGE MODELS
  • 7.17 滑动窗口 |assign |memo |pii bfs
  • 【Linux】如何使用nano创建并编辑一个文件
  • 使用token调用Spring OAuth2 Resource Server接口错误 insufficient_scope
  • Redis1:高并发与微服务中的键值存储利器
  • 第四章 OB SQL调优
  • OJ题目里面的复杂图形的输出类型的汇总展示(巧妙地利用对称性offset偏移量)
  • 轻松将文件从 iPhone 传输到 Mac
  • 牛客:HJ26 字符串排序[华为机考][map]
  • 暑期算法训练.2
  • ArcGISPro应用指南:使用ArcGIS Pro创建与优化H3六边形网格
  • PHP 社区正在讨论变更许可证,预计 PHP 9.0 版本将完全生效
  • 基于MATLAB的决策树DT的数据分类预测方法应用
  • 【Unity】Mono相关理论知识学习
  • SQL中对字符串字段模糊查询(LIKE)的索引命中情况
  • 第3章 Excel表格格式设置技巧
  • Win11专业工作站版安装配置要求
  • [NOIP][C++] 树的重心
  • Word 文档合并利器:基于 org.docx4j 的 Java 实现全解析
  • Java线程创建与运行全解析
  • GraphQL与REST在微服务接口设计中的对比分析与实践
  • Windows 启动后桌面黑屏,其他程序正常运行
  • Java接口:小白如何初步认识Java接口?
  • 一点点dd
  • WPF 加载和显示 GIF 图片的完整指南
  • 聚焦AI与物流核心技术:2025智慧物流论坛及长三角快递物流展会9月上海开幕
  • API Gateway HTTP API 控制客户端访问 IP 源
  • CSV 字段映射小工具 Demo
  • Thymeleaf 基础语法与标准表达式详解