上一篇我们借助循环结构,让程序学会了重复执行代码,完成了自助收银台的连续商品处理、优惠券核销等功能。在案例中我们初次用到了列表这个 “数据容器”,它能帮我们把零散的商品名称、价格等数据有序地整合在一起。这一篇,我们就来深入学习 Python 中最常用、最灵活的基础数据结构 —— 列表,让我们的收银台系统能更高效地管理商品与订单数据。
1. 目标
掌握 Python 列表的核心特性与基础操作,能使用列表完成数据的有序存储、增删改查与遍历,结合上一篇学习的循环结构,实现更灵活的业务逻辑,完成智能收银台系统的全面升级。
2. 知识点
- for循环遍历列表的进阶用法(含 enumerate 枚举)
3. 代码示例:全面升级智能收银台 —— 用列表实现购物车全功能管理
我们将基于上一篇的自助收银台,用列表重构并升级功能,实现购物车的动态管理、商品排序、多订单处理等核心能力,同时巩固循环结构的用法。
# 第四天:列表结构 —— 升级版智能收银台购物车系统
import random
import time # 导入时间模块,用于模拟处理过程
# --- 案例1:列表的创建与索引/切片——商品库与购物车初始化 ---
print("=== 欢迎使用升级版智能自助收银台 ===")
# 列表创建:用[]存储固定商品库,包含名称、单价,一一对应
goods_library =["矿泉水","方便面","火腿肠","面包","牛奶","饮料"]
price_library =[2.0,4.5,3.0,8.0,5.5,4.0]
# 初始化空列表,用于存储用户购物车的商品
cart_names =[]# 购物车商品名称
cart_prices =[]# 购物车商品单价
cart_quantity =[]# 购物车商品数量
print("当前超市在售商品:")
# 基础索引取值:列表索引从0开始,通过[序号]获取对应元素
for i inrange(len(goods_library)):
print(f" 编号 {i+1}:{goods_library[i]},单价 {price_library[i]} 元")
print("-"*50)
# 切片操作演示:获取前3款引流商品
hot_goods = goods_library[:3]# 取列表前3个元素
hot_prices = price_library[:3]
print(f"今日爆款商品:{hot_goods},对应单价:{hot_prices}")
time.sleep(1)
print("-"*50)
# --- 案例2:列表的增删改操作——购物车动态管理 ---
print("\n--- 购物车商品管理 ---")
print("操作说明:输入商品编号添加商品,输入0完成选购,输入-1删除商品,输入-2修改商品数量")
# 结合while循环,实现购物车的持续操作
whileTrue:
# 为了代码自动运行演示,生成随机操作指令,实际使用可替换为input输入
# 实际应用替换为:operation = input("请输入您的操作指令:")
operation = random.choice(["1","2","3","4","5","6","0","-1","-2"])
print(f"\n您输入的操作指令:{operation}")
# 结束选购
if operation =="0":
print("✅ 选购完成,正在结算...")
break
# 删除商品
elif operation =="-1":
ifnot cart_names:# 判断购物车是否为空
print("❌ 购物车为空,暂无商品可删除")
continue
# 随机选择要删除的商品,实际使用可让用户输入商品序号
del_index = random.randint(0,len(cart_names)-1)
del_name = cart_names.pop(del_index)# pop方法:根据索引删除元素,并返回该元素
cart_prices.pop(del_index)
cart_quantity.pop(del_index)
print(f"🗑️ 已删除商品:{del_name}")
continue
# 修改商品数量
elif operation =="-2":
ifnot cart_names:
print("❌ 购物车为空,暂无商品可修改")
continue
# 随机选择要修改的商品和新数量,实际使用可让用户输入
modify_index = random.randint(0,len(cart_names)-1)
modify_name = cart_names[modify_index]
new_num = random.randint(1,5)
cart_quantity[modify_index]= new_num # 列表元素修改:通过索引直接赋值
print(f"📝 已修改商品【{modify_name}】的数量为:{new_num} 件")
continue
# 添加商品
else:
try:
goods_index =int(operation)-1
# 校验商品编号是否合法
if goods_index <0or goods_index >=len(goods_library):
print("❌ 无效的商品编号,请重新输入")
continue
# 获取商品信息
add_name = goods_library[goods_index]
add_price = price_library[goods_index]
add_num = random.randint(1,3)# 随机生成购买数量,实际可让用户输入
# append方法:在列表末尾添加元素
if add_name in cart_names:# 商品已在购物车,仅修改数量
exist_index = cart_names.index(add_name)
cart_quantity[exist_index]+= add_num
print(f"🛒 商品【{add_name}】已在购物车,数量追加 {add_num} 件")
else:# 商品不在购物车,新增条目
cart_names.append(add_name)
cart_prices.append(add_price)
cart_quantity.append(add_num)
print(f"🛒 成功添加商品:{add_name} × {add_num} 件")
time.sleep(0.5)
except:
print("❌ 输入格式错误,请输入数字指令")
continue
# --- 案例3:列表遍历进阶与排序/统计——购物车结算与整理 ---
print("\n--- 购物车结算清单 ---")
ifnot cart_names:
print("🛒 您的购物车为空,无需结算")
total_price =0
else:
total_price =0
# 进阶遍历:enumerate枚举,同时获取元素的索引和值,无需手动计数
print("序号 | 商品名称 | 单价 | 数量 | 小计")
print("-"*50)
for idx,(name, price, num)inenumerate(zip(cart_names, cart_prices, cart_quantity), start=1):
item_total = price * num
total_price += item_total
print(f"{idx} | {name:<6} | {price:.1f} 元 | {num:>2} 件 | {item_total:.2f} 元")
print("-"*50)
print(f"🛍️ 本次共选购 {len(cart_names)} 种商品,总计:{total_price:.2f} 元")
# 列表统计与查找方法
print("\n--- 商品统计信息 ---")
# count方法:统计元素出现次数
total_num =sum(cart_quantity)
print(f"本次购买商品总数量:{total_num} 件")
# index方法:查找元素的索引位置
if"牛奶"in cart_names:
milk_index = cart_names.index("牛奶")
print(f"您购买的牛奶在购物车第 {milk_index+1} 位")
# 列表排序:sort方法,按商品小计金额从高到低排序
print("\n--- 商品金额排序(从高到低)---")
# 组合商品信息并排序
sort_items =sorted(zip(cart_names, cart_prices, cart_quantity), key=lambda x: x[1]*x[2], reverse=True)
for name, price, num in sort_items:
print(f"{name}:{price*num:.2f} 元")
# 列表反转:reverse方法
cart_names.reverse()
print(f"\n购物车商品倒序排列:{cart_names}")
# --- 案例4:嵌套列表——多订单批量管理 ---
print("\n--- 当日多订单批量管理 ---")
# 嵌套列表:列表中的元素也是列表,每个子列表代表一个用户的订单
today_orders =[
["顾客1",["矿泉水","面包"],[2.0,8.0],[2,1],12.0],
["顾客2",["方便面","火腿肠","饮料"],[4.5,3.0,4.0],[3,2,2],27.5],
["顾客3",["牛奶","面包"],[5.5,8.0],[2,2],27.0]
]
# 把当前用户的订单加入当日订单列表
current_order =["当前顾客", cart_names, cart_prices, cart_quantity, total_price]
today_orders.append(current_order)
# 嵌套循环遍历嵌套列表,统计当日营业数据
print(f"今日累计订单数:{len(today_orders)} 单")
day_total =0
for order in today_orders:
customer_name = order[0]
order_total = order[4]
day_total += order_total
print(f"{customer_name} 订单金额:{order_total:.2f} 元")
print(f"💰 今日营业总额:{day_total:.2f} 元")
print(f"\n=== 本次购物结算完成,欢迎下次光临 ===")
4. 代码解释
列表的基础特性
列表是 Python 中最常用的可变序列容器,用[]包裹,元素之间用逗号分隔,支持存储不同类型的数据(字符串、数字、列表等),元素可修改、可重复、有序排列。
索引与切片
- 索引:列表的元素按顺序编号,索引从0开始,通过列表 [索引]可以获取、修改对应位置的元素,反向索引从-1开始(代表最后一个元素)。
- 切片:通过列表 [start:end:step]快速截取列表的子片段,start为起始索引,end为结束索引(不包含),step为步长,省略参数时会使用默认值。
列表核心增删改方法
append()pop():根据索引删除列表中的元素,默认删除最后一个元素,同时返回被删除的元素值。remove():根据元素值删除列表中第一个匹配的元素,若元素不存在会报错。insert():在指定索引位置插入一个元素,原位置及后续元素自动后移。- 元素修改:直接通过列表 [索引] = 新值即可完成对应位置元素的修改。
列表遍历进阶
- 基础遍历:配合
range (len (列表))通过索引遍历,适合需要同时操作多个对应列表的场景。 - 枚举遍历:
enumerate (列表,start=1)可以同时获取元素的序号和值,无需手动计数,让代码更简洁。 zip():可以将多个长度相同的列表打包,同步遍历对应位置的元素,适合多列表关联操作。
列表统计与排序方法
index():查找指定元素在列表中第一次出现的索引位置,元素不存在会报错。count()sort():对列表进行原地排序,默认升序,设置reverse=True可实现降序。sorted():返回一个排序后的新列表,不修改原列表,灵活性更高。reverse()
嵌套列表
列表中的元素可以是另一个列表,形成嵌套结构,适合存储二维、结构化的数据(如多订单、表格数据),通过多层索引列表 [一级索引][二级索引]即可获取内层元素,配合嵌套循环可完成遍历与操作。
5. 运行结果示例(由于大量随机数,结果每次不同)
=== 欢迎使用升级版智能自助收银台 ===
当前超市在售商品:
编号 1:矿泉水,单价 2.0 元
编号 2:方便面,单价 4.5 元
编号 3:火腿肠,单价 3.0 元
编号 4:面包,单价 8.0 元
编号 5:牛奶,单价 5.5 元
编号 6:饮料,单价 4.0 元
--------------------------------------------------
今日爆款商品:['矿泉水', '方便面', '火腿肠'],对应单价:[2.0, 4.5, 3.0]
--------------------------------------------------
--- 购物车商品管理 ---
操作说明:输入商品编号添加商品,输入0完成选购,输入-1删除商品,输入-2修改商品数量
您输入的操作指令:2
🛒 成功添加商品:方便面 × 2件
您输入的操作指令:5
🛒 成功添加商品:牛奶 × 1件
您输入的操作指令:2
🛒 商品【方便面】已在购物车,数量追加 1件
您输入的操作指令:-2
📝 已修改商品【方便面】的数量为:4件
您输入的操作指令:0
✅ 选购完成,正在结算...
--- 购物车结算清单 ---
序号 | 商品名称 | 单价 | 数量 | 小计
--------------------------------------------------
1 | 方便面 | 4.5 元 | 4 件 | 18.00 元
2 | 牛奶 | 5.5 元 | 1 件 | 5.50 元
--------------------------------------------------
🛍️ 本次共选购 2 种商品,总计:23.50 元
--- 商品统计信息 ---
本次购买商品总数量:5 件
您购买的牛奶在购物车第 2 位
--- 商品金额排序(从高到低)---
方便面:18.00 元
牛奶:5.50 元
购物车商品倒序排列:['牛奶', '方便面']
--- 当日多订单批量管理 ---
今日累计订单数:4 单
顾客1 订单金额:12.00 元
顾客2 订单金额:27.50 元
顾客3 订单金额:27.00 元
当前顾客 订单金额:23.50 元
💰 今日营业总额:90.00 元
=== 本次购物结算完成,欢迎下次光临 ===
💡 学习建议与课后练习
动手运行
强烈建议你将代码复制到自己的 Python 环境中运行多次,观察列表的增删改方法如何改变列表内容,对比索引遍历和 enumerate 枚举遍历的区别,理解嵌套列表的层级结构。
修改条件
- 尝试修改案例 1 中的商品库,新增更多商品与对应单价,观察切片操作的结果变化。
- 修改案例 2 中的随机操作逻辑,替换为
input()手动输入,实现真正的交互式购物车操作。 - 调整案例 3 中的排序规则,将按金额降序改为按商品数量升序,观察排序结果的变化。
小练习
- 练习 1:基于案例 2 的购物车功能,新增 “清空购物车” 功能,使用列表的
clear()方法,当用户输入 - 3 时清空购物车所有商品,并给出提示。 - 练习 2:编写一个库存管理小程序,创建商品库存列表和对应库存数量列表,使用 for 循环遍历,打印出库存数量小于 5 的商品,并提示需要补货。
- 练习 3:使用嵌套列表创建一个 3 行 3 列的成绩表,存储 3 名学生的 3 门科目成绩,通过嵌套循环计算每名学生的总分和平均分,以及每门科目的班级平均分。