循环结构——让程序学会重复
1. 目标
掌握如何让程序重复执行代码块,并学会使用两种主要的循环结构。
2. 知识点
3. 代码示例:进阶版购物小票——批量处理与重复输入
我们将继续升级“智能购物小票分析器”,这次让它能处理多个商品,并模拟收银台的连续服务。
python
# 第三天:循环结构 —— 智能收银台模拟器import randomimport time # 导入时间模块,用于模拟处理过程# --- 案例1:使用while循环处理多个商品(直到用户说停止)---print("=== 欢迎使用自助收银台 ===")print("请开始扫描商品(输入商品价格,输入0完成扫描):")total_price =0item_count =0# 使用while循环,因为不知道用户会输入多少次whileTrue:# 模拟扫描商品的过程# 注意:实际input需要用户输入,这里为了演示自动生成随机价格# 实际应用中,可以替换为:price_input = float(input("请输入商品价格: "))# 为了代码自动运行演示,我们生成随机价格,并用随机数模拟结束条件 price_input = random.randint(1,100)# 随机生成1-100元的商品# 随机有20%的概率结束购物(模拟用户输入0)if random.random()<0.2:print(" 扫描完成(检测到结束信号)")break# break语句立即结束循环 item_count +=1 total_price += price_inputprint(f" 商品{item_count}: {price_input}元,当前总计: {total_price}元") time.sleep(0.5)# 暂停0.5秒,让演示更有节奏感print(f"\n本次共购买 {item_count} 件商品,总计: {total_price}元")# --- 案例2:使用for循环处理固定数量的商品(比如称重商品)---print("\n--- 称重商品处理 ---")weight_items =["苹果","香蕉","橙子"]# 一个列表,存储商品名称prices_per_kg =[8.5,6.0,7.2]# 对应的每公斤价格print("正在处理称重商品:")# 使用for循环遍历列表for i inrange(len(weight_items)):# range(3) 生成 0, 1, 2 item_name = weight_items[i] price_kg = prices_per_kg[i]# 随机生成重量 (0.2 到 2.0 公斤) weight =round(random.uniform(0.2,2.0),2) item_total = price_kg * weightprint(f" {item_name}: {weight}kg × {price_kg}元/kg = {item_total:.2f}元") total_price += item_totalprint(f"加上称重商品后,总计: {total_price:.2f}元")# --- 案例3:演示break和continue的使用(处理优惠券)---print("\n--- 优惠券核销系统 ---")coupon_codes =["SAVE20","INVALID","SAVE10","EXPIRED","SAVE5"]valid_coupons =0print("正在验证优惠券...")for code in coupon_codes:# 跳过无效或过期的优惠券if code =="INVALID"or code =="EXPIRED":print(f" 优惠券 '{code}' 无效,自动跳过。")continue# continue语句跳过本次循环剩余部分,进入下一次循环# 处理有效优惠券print(f" 优惠券 '{code}' 有效!正在应用优惠...") valid_coupons +=1# 假设每张有效优惠券减5元 total_price -=5print(f" 已减5元,当前需支付: {total_price:.2f}元")# 如果优惠后金额低于20元,则停止使用更多优惠券if total_price <20:print(" 优惠后金额已低于20元,停止使用更多优惠。")break# break语句提前结束整个循环print(f"\n共使用了 {valid_coupons} 张有效优惠券,最终需支付: {total_price:.2f}元")# --- 案例4:循环的else子句(检查是否所有商品都打折)---print("\n--- 全场折扣检查 ---")all_items_on_sale =True# 假设所有商品都参加活动items_checked =["苹果","牛奶","面包","饮料"]for item in items_checked:# 随机模拟某些商品可能不打折if random.choice([True,False]):# 随机True或Falseprint(f" {item}: 参加活动")else:print(f" {item}: 不参加活动") all_items_on_sale =False# 这里不使用break,因为要检查完所有商品,找出所有不打折的# 这个else子句会在for循环正常结束(没有被break中断)时执行else:if all_items_on_sale:print("所有商品都参加全场折扣!您可以享受额外9折!") total_price *=0.9print(f"应用折扣后,需支付: {total_price:.2f}元")else:print("部分商品不参加活动,无法享受全场折扣。")print(f"\n=== 购物完成,您本次共需支付: {total_price:.2f}元 ===")4. 代码解释
while 循环:当条件为 True 时,重复执行代码块。while True 会创建一个无限循环,通常与 break 配合使用,在循环内部根据条件结束。
for 循环:通常用于遍历序列(如列表、字符串)或与 range() 函数配合,执行固定次数的循环。
range(n) 生成从 0 到 n-1 的整数序列。
range(start, stop, step) 可以生成更灵活的序列。
break 语句:立即终止当前循环(while 或 for),跳出循环体。
continue 语句:跳过当前循环迭代中剩余的语句,直接开始下一次迭代。
循环的 else 子句:这是一个比较少用但很有特色的特性。当循环正常结束(即没有被 break 语句中断)时,会执行 else 块中的代码。
列表:示例中引入了列表 [ ],它是一种可以存储多个数据的容器,我们将在下一天详细学习。
5. 运行结果示例(由于大量随机数,结果每次不同)
text
=== 欢迎使用自助收银台 ===请开始扫描商品(输入商品价格,输入0完成扫描): 商品1: 42元,当前总计: 42元 商品2: 87元,当前总计: 129元 商品3: 93元,当前总计: 222元 扫描完成(检测到结束信号)本次共购买 3 件商品,总计: 222元--- 称重商品处理 ---正在处理称重商品: 苹果: 1.25kg × 8.5元/kg = 10.62元 香蕉: 0.83kg × 6.0元/kg = 4.98元 橙子: 1.57kg × 7.2元/kg = 11.30元加上称重商品后,总计: 248.91元--- 优惠券核销系统 ---正在验证优惠券... 优惠券 'SAVE20' 有效!正在应用优惠... 已减5元,当前需支付: 243.91元 优惠券 'INVALID' 无效,自动跳过。 优惠券 'SAVE10' 有效!正在应用优惠... 已减5元,当前需支付: 238.91元 优惠券 'EXPIRED' 无效,自动跳过。 优惠券 'SAVE5' 有效!正在应用优惠... 已减5元,当前需支付: 233.91元共使用了 3 张有效优惠券,最终需支付: 233.91元--- 全场折扣检查 --- 苹果: 参加活动 牛奶: 不参加活动 面包: 参加活动 饮料: 参加活动部分商品不参加活动,无法享受全场折扣。=== 购物完成,您本次共需支付: 233.91元 ===
💡 学习建议与课后练习
动手运行:强烈建议你将代码复制到自己的Python环境中运行多次,观察 break 和 continue 如何影响循环的执行流程,以及循环的 else 子句何时被执行。
修改条件:
小练习:
练习1:修改案例1,使用 input() 函数让用户手动输入每个商品的价格,直到用户输入 0 为止,最后计算总价。
练习2:编写一个简单的猜数字游戏升级版:程序随机生成一个1-100的数字,让用户循环猜,每次猜完后提示“猜大了”、“猜小了”或“猜中了”,并统计用户猜了多少次。如果用户输入 -1,则使用 break 退出游戏。
练习3:使用 for 循环打印出 1 到 100 之间所有能被 3 整除的数字(提示:使用取模运算符 % 和 if 判断)。