Python编程基础(六)| 用户输入和while循环

发布于:2025-07-17 ⋅ 阅读:(19) ⋅ 点赞:(0)

引言

很久没有写 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 = True

while 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),这使得打印格式化的结果非常方便。

网站公告

今日签到

点亮在社区的每一天
去签到