购物列车逻辑思路
1. 商品列表,第一个商品是什么,价钱是多少
2. 提示与用户交互要购买什么商品,选择了商品后就可以取出对应的值
3. 判断存储钱的变量是否有足够的钱来购买
4. 如果鸲钱,把商品存储到购物车和将本金减去商品的价格
操作实现要点
1.把提供的商品存储到列表上,但是要实现商品与价格的一一对应起来要使用嵌套,列表是使用中括号括起来,再用逗号分割的,这之中的元素可以是数字,字符串,甚至是列表,元组,字典,可以是任何数据类型,所以存储列表时,就列表时一个商品对应一个价格
In [1]: a = [[1,2,3],'li',3,(2,3,4)]
In [2]: print(a[0][1]) #相当于b=[1,2,3],b=a[0],b[1]
2
2.用户进来后,要提示它输入自己所拥有的本金,相当于一个充值过程,而且需要对用户的字符转换成数字
saving=input('please enter your money: ')
3.把列表中的商品信息给用户做一个展示,使用for循环打印商品信息,for后面加的是一个可迭代的对象
for i in product_list: # in 后面可加列表 ,列出新产品信息
print(product_list.index(i)+1,i) #商品展示后,要给用户去选择所需的商品,每个元组的商品都有一个索引,索引:商品
[root@zabbix day1]# python3 shopping_cart.py
please enter your money: 333
1 ('Mac', 9000) 对应的索引和商品
2 ('kindle', 800)
3 ('tesla', 900000)
4 ('python book', 105)
5 ('bike', 2000)
另一种方法:使用enumerate方法,不使用索引的方法要取值,1是指定它顺序开始
for i in enumerate(product_list,1):
print(i)
[root@zabbix day1]# python3 shopping_cart.py
please enter your money: 33
(1, ('Mac', 9000))
(2, ('kindle', 800))
(3, ('tesla', 900000))
(4, ('python book', 105))
(5, ('bike', 2000))
以上是使用i一个变量来接收整个元组,使用得输出的格式上不太美观,可以使用两个变量来接收,i,v,这样会把i赋值给元组中的第一个值,v赋值给第二个值
for i,v in enumerate(product_list,1):
print(i,v)
[root@zabbix day1]# python3 shopping_cart.py
please enter your money: 333
1 ('Mac', 9000)
2 ('kindle', 800)
3 ('tesla', 900000)
4 ('python book', 105)
5 ('bike', 2000)
#如果没使用两个变量时,是以上的外面有个括号,如果要在序列号和商品信息中间加一些处理就无法实现,因为它整体一个i
for i,v in enumerate(product_list,1):
print(i,': ',v)
[root@zabbix day1]# python3 shopping_cart.py
please enter your money: 34
1 : ('Mac', 9000)
2 : ('kindle', 800)
3 : ('tesla', 900000)
4 : ('python book', 105)
5 : ('bike', 2000)
小例子:
In [8]: a,b=[2,3]
In [9]: print(a,b)
2 3
In [10]: a,b=[2,3],[4,5]
In [11]: print(a,b)
[2, 3] [4, 5]
4.实现用户选择所需一件商品后,记录商品并扣除本金,如果用户一直选择退出,就一直处理商品选择的循环状态,放在选择的部分
while True:
5.引导用户选择
a.选择商品的编号而且要给用户一个退出的程序,并对它输入提是否数据做一个判断,如果是要把它转换成数字,
if choice.isdigit():
choice=int(choice)
b.因为商品只有6个,因此还要给choice限定范围, 是q就给予退出
if choice>0 and choice<=len(product_list): ##如果直接小于6,就相当于直接写死了,硬编码,使用len让它去取长度
elif choice=='q':
print('---------bought---------')
for i in shopping_cart: ###退出时,把用户的已购商品和剩余的钱打印出来
print(i)
print('your money is %s'%saving)
break ###不建议使用exit,因为使用它直接整个程序退出,如果是比较大的程序,购买可能是其中一部分,使用break就可以只跳出循环,如果还有其他的程序还可以继续执行
else:
print('invalid input')
c.选择好商品后,要判断商品的价格,根据choice把对应的商品从对应的列表中取出来
p_item=product_list[choice-1] #因为Product_list是根据索引来取是从0开始,choice是从1开始,所以要减1
d.取商品对应的价格,p_item是一个元组('Mac', 9000),它的价格是在第二个位置上,所以价格为p_item[1],再与它存的钱做个对应是否够钱购买商品,如果够要把商品放到购物车里面,然后还要把本金减去商品的价格
if p_item[1]<saving:
saving-=p_item[1]
shopping_cart.append(p_item)
注:把已经选定的商品追加到一个列表里记录,要先在开始时定义一个shopping_cart的空列表,相当于已买的
saving=input('please enter your money: ')
shopping_cart=[]
e. 如果用户钱不够,要有提示而且显示它所剩下的钱
else:
print('you dont have enough money,and your money is %s'%saving)
6.完整的程序
[root@zabbix day1]# cat shopping_cart.py
#!/usr/local/python3/bin/python3
#
product_list=[
('Mac',9000),
('kindle',800),
('tesla',900000),
('python book',105),
('bike',2000),
]
saving=input('please enter your money: ')
shopping_cart=[]
if saving.isdigit():
saving=int(saving)
while True:
for i,v in enumerate(product_list,1):
print(i,'>>> ',v)
choice=input('choose the product number[quit:q]: ')
if choice.isdigit():
choice=int(choice)
if choice>0 and choice<=len(product_list):
p_item=product_list[choice-1]
if p_item[1]<saving:
saving-=p_item[1]
shopping_cart.append(p_item)
else:
print('you dont have enough money,and your money is %s'%saving)
else:
print('number is not exist')
elif choice=='q':
print('---------bought---------')
print(p_item)
print('your money is %s'%saving)
break
else:
print('invalid input')
7.summary
程序还比较简单,后续还会作相应的优化的,如放入购物车的东西会重复打印的,思路可以给它一个商品的统计