#功能:
1.可注册账号
2.登录买家账号
3.可查询编辑购物车里商品
4.可以余额充值
5.可提示余额不足
6.购物车结算

#使用:
1.第一次使用先注册账号填写账号金额
2.账号金额信息保存在buyer_account.txt (默认为空)
3.只针对帐号文件里的用户进行判断并锁定,针对用户和密码各有三次错误重试机会。

流程图:

代码:

#!/usr/bin/env python3

#antuor:Alan

from prettytable import PrettyTable
import sys,os
import getpass,time #用户注册函数#
def register():
new_username = input('请输入注册用户名:')
new_password = input('请输入新用户密码:')
bank_money = 0 while True:
new_password_again = input('请再次确认新用户密码:') ###再次确认密码
if new_password_again != new_password: ###密码错误则循环
continue
else:
break ###正确则跳出循环执行下一个循环
while True:
bank_money = input('请输入你要充值的金额:') ###输入金额数字
if bank_money.isdigit(): ###判断金额是否为数字
bank_money = int(bank_money) ###金额数字整数化
break
else: ###如果金额非数字则不断循环
print('请输入正确的金额') user_account = "%s %s %d" % (new_username,new_password,bank_money)
# file = open('login_account.txt','a+')
# save_file = file.write(user_account)
# file.close() # print (("++++++++++恭喜你注册成功:%s++++++++++++") % (user_account)) with open('login_account.txt','a+') as file: ###把用户信息存入文档,a+为读写追加模式
file.write(user_account+'\n') ###写入并换行
print (("==============恭喜你注册成功:%s==============") % (user_account))
print("================请重新登录你的账号======================")
############################################################################ def digit_input(s):
if str.isdigit(s): #对输入是否是数字进行判断
s = int(s) #如果输出的是个数字,则转化为整数类型
return s #返回输入字符 #用户信息函数#
def shopping_func(user='',init_money='',now_money='',recharge_money='',value=''):
os.system('clear') #清屏###
init_money = int(init_money) #初始总金额数字化
now_money= int(now_money) #当前余额数字化
recharge_money = int(recharge_money) #充值金额数字化 ###########################通过prettytable模块将输出内容如表格方式整齐#########
product_page = PrettyTable(['用户名','金额','当前余额','充值余额','购物车'])
product_page.align['用户名'] = '1' #对齐
product_page.add_row([user,init_money,now_money,recharge_money,value])
print(product_page) #商品页面展示函数#
def products_page(my_dict): items_dict = {} #定义函数内部字典
############对商品列表进行遍历并加上数字编号###########################
i = 1
print('商品列表 : ')
print(30*'===')
print('%-5s \t %-20s \t%s \t%-10s \t %s' % ('编号','商品名称','商品价格(元)','商品总数量(个)','商品剩余数量(个)'))
for k in my_dict:
v = my_dict[k]
if type(v) is dict:
print('%-5d %-30s %-10d %-10d %-40d' % (i,k,v['price'],v['sum'],v['num']))
items_dict[i] = [k,v['price'],v['num'],v['sum']] #将商品列表赋值到items_dict
i += 1
print(30*'===') return items_dict #返回格式化后的字典 ########################显示购物车商品列表函数#############################
def shopping_cart(show_dict):
show_all_sum = 0 #初始化购物车商品总价
show_all_num = 0 #初始化购物车商品数量
############对商品列表进行遍历并加上数字编号###########################
print('%s ,%s ,%-10s,%s,%s,%s' % ('编号','商品名称','商品价格(元)','商品总数量(个)','购买数量(个)','购买金额(元)'))
for k in show_dict:
v = show_dict[k]
if type(v) is list:
print('%-5s \t %-20s \t %-10d \t %-10d \t %-10d \t %-10d' % (k,v[0],v[1],v[2],v[3],v[4]))
show_all_sum += v[4] #商品总价累计
show_all_num += 1 #商品个数累计
print('请确认您购买商品,总金额:%d(元)'.center(84,'#') % show_all_sum)
return (show_all_sum,show_all_num) #返回商品总价和商品个数 #编辑购物车商品函数#
def shopping_cart_edit(modify_dict,modify_goods_dict): a_flag = 1 #初始化第一层编号循环标记
while a_flag:
index = input('请输入商品编号 | 完成修改(q) : ')
if len(index) != 0: #商品编号不为空进行字符转化
index = digit_input(index) #调用函数(自建)
if index == 'q': #输入为q,即完成修改退出
break
elif index in modify_dict: #输入为正确编号###
b_flag = 1 #初始化第二层数量循环标记
name = modify_dict[index][0] #对name赋值商品名称
while b_flag:
num = input('请输入新的商品数量(最大值为%d) | 完成修改(q) : ' % modify_dict[index][2] )
if len(num) != 0: #商品数量不为空进行字符转化###
num = digit_input(num)
if num == 'q': #输入为q,即完成修改退出###
break
elif num == 0: #输入为0,即删除字典中的这个条目
modify_goods_dict[name]['num'] = modify_dict[index][2] #商品列表中的商品数量变为初始值
del modify_dict[index] #购物车删除这个商品
b_flag = 0
elif num > 0 and num <= modify_dict[index][2]: #输入为要求数字,则进行数量和金额修改
modify_dict[index][3] = num
modify_dict[index][4] = modify_dict[index][1] * num
modify_goods_dict[name]['num'] = modify_dict[index][2] - num #更新商品列表中的商品数量
b_flag = 0
else:
pass
else:
pass
return (modify_dict,modify_goods_dict) ###返回修改后的购物车商品列表### #购物车展示函数#
def shopping_cart_show(my_cart,my_goods_dict): print('欢迎来到您的购物车'.center(80,'#'))
goods_all_sum = 0 ###初始化购物车商品总金额###
goods_all_num = 0 ###初始化购物车商品总数量### if my_cart: ###购物车参数不为空###
###########调用购物车商品列表函数,并返回商品总金额和总数量#########
(goods_all_sum,goods_all_num) = shopping_cart(my_cart) choice = input('请进行如下操作 : 修改记录(c) | 继续购物(!c)')
if choice == 'c': ###对购物车商品列表进行修改###
(my_shop_cart,my_goods_dict) = shopping_cart_edit(my_cart,my_goods_dict) ###调用商品修改函数,并返回新的商品列表###
(goods_all_sum,goods_all_num) = shopping_cart(my_shop_cart) ###购物车商品展示,并返回最新的商品总价###
else:
pass
else:
print('当前您的购物车为空'.center(80,' ')) time.sleep(2)
return (goods_all_sum,goods_all_num,my_goods_dict) #购物车中商品总价、数量和用户商品列表# #余额充值函#
def balance_recharge(recharge_init_balance,recharge_now_balance,recharge_money):
recharge_flag = 1 #充值循环参数初始化###
while recharge_flag:
recharge_num = input('请输入充值金额 | 返回(b) | 退出(q):')
if len(recharge_num) != 0: #如果输入非空,对输入进行判断并转化类型
recharge_num = digit_input(recharge_num)
if recharge_num == 'q': #如果输入为q,则退出程序
sys.exit(0)
elif recharge_num == 'b': #如果输入为b,则返回第一层循环,重新选择商品编号
break
elif type(recharge_num) is int and recharge_num > 0 : #输入要求充值金额
recharge_init_balance += recharge_num #初始金额增加
recharge_now_balance += recharge_num #当前余额增加
recharge_money += recharge_num #充值金额增加
recharge_flag = 0 #改变充值循环参数
print('充值成功,请查收'.center(80,' ')) #提示充值成功
else:
pass
return (recharge_init_balance,recharge_now_balance,recharge_money) #返回初始、当前、充值金额 #用户结帐函数#
def pending_order(billing_list,my_cart,billing_balance): print('欢迎来到结算菜单'.center(80,'#'))
if my_cart: #购物车参数不为空
#############调用购物车商品列表函数################################
shopping_cart(my_cart)
billing_flag = input('请确认是否商品结算(y | n):')
if billing_flag == 'y': #商品结算确认
billing_file = open('buyer_account','w') #打开读写帐号文件
for user_info in billing_list:
billing_file.writelines(user_info) #回写用户列表信息
billing_file.close() #关闭帐号文件
sys.exit('结帐成功,你当前余额 :%d'.center(80,' ') % billing_balance)
else:
print('退出结算菜单,继续购物'.center(80,' '))
time.sleep(2)
else:
print('当前您的购物车为空,无需结算'.center(80,' '))
time.sleep(2) ################################主程序开始################################## ################################商品列表#################################### goods_list = {
'iphone6s': {'price':6000,'num':10,'sum':10}, #num为当前库存,sum为商品总数量
'ipad pro': {'price':3000,'num':20,'sum':20},
'Bike': {'price':2000,'num':15,'sum':15},
'DLS Camera': {'price':1999,'num':8,'sum':8},
'macbook pro': {'price':14000,'num':5,'sum':5},
'macbook air': {'price':7000,'num':10,'sum':10},
'Fountain Pen':{'price':15,'num':50,'sum':50}, } ######用户注册,写入login_account.txt文件里###################### ask_question = input('是否已经有账号? y|n:') ###是否有账号,是则登录,不是则注册 while True: if ask_question == 'y':
break
else:
register() ###调用登录函数
break ##############################################################
i = 0
while i < 3: ###只要用户登录异常不超过3次就不断循环###
username = input('请输入用户名:') ###输入用户名###
password = input('请输入密码:') ###输入隐藏密码###
user_file = open('login_account.txt','r') ###打开帐号文件###
#next(user_file)
user_list = user_file.readlines() ###用户列表信息###
user_file.close() ###关闭帐号文件### for user_line in user_list: #对帐号文件进行遍历,因为只有三个用户,所以只读前3行
######################分别获取帐号、密码信息和当前余额##############
(user,passwd,init_balance) = user_line.strip('\n').split()
init_balance = int(init_balance) ###对总金额进行数字化###
now_balance = init_balance ###对当前余额进行数字化###
my_goods_sum = 0 ###初始化购买商品总金额### if username == user and password == passwd: ###如用户名和密码正常匹配###
user_shopping_cart = {} ###初始化用户购物车字典###
user_shopping_cart_count = 0 ###初始化用户购物车内商品的数量###
recharge_value = 0 ###初始化充值金额###
line_num = user_list.index(user_line) ###赋值匹配用户的下标###
first_flag = 1 ###定义第一层循环变量参数### while first_flag: ########################调用框架函数输出用户信息############
shopping_func(username,init_balance,now_balance,recharge_value,user_shopping_cart_count) goods_output_dict = products_page(goods_list) ###调用商品列表展示函数输出商品信息###
goods_index = input('请选择菜单 :输入商品编号 | 购物车(c) | 余额充值(r) | 结帐(b) | 退出(q) : ') if len(goods_index) != 0: ###如果输入非空,对输入进行判断并转化类型###
goods_index = digit_input(goods_index) if goods_index == 'q': ###如果输入为q,则退出程序###
sys.exit(0) elif goods_index == 'c': ###如果输入为c,则展示购物车###
###调用购物车显示函数,并返回购物车商品总金额###########
(my_goods_sum,user_shopping_cart_count,goods_list) = shopping_cart_show(user_shopping_cart,goods_list)
now_balance = init_balance - my_goods_sum ###计算出当前余额###
if now_balance < 0:
print('您的余额不足,请及时充值,谢谢')
time.sleep(2) elif goods_index == 'r': ###如果输入为r,则进行余额充值###
(init_balance,now_balance,recharge_value) = balance_recharge(init_balance,now_balance,recharge_value) elif goods_index == 'b': ###如果输入为b,则进入结账菜单###
##############更新用户文件中用户的余额##################
user_list[line_num] = user + ' ' + passwd + ' ' + repr(now_balance) + '\n'
pending_order(user_list,user_shopping_cart,now_balance) ###调用结算函数### elif goods_index in goods_output_dict: ###输入编号为正确的商品编号### ###############################取出goods_index商品列表信息并进行赋值和展示############
(goods_name,goods_price,goods_num) = (goods_output_dict[goods_index][0], goods_output_dict[goods_index][1], goods_output_dict[goods_index][2])
print('【 编号:%-5d \t 名称:%-15s \t 价格:%-5d(元) \t 数量:%-5d(个)】' % (goods_index,goods_name,goods_price,goods_num)) second_flag = 1 ###定义第二层循环变量参数###
while second_flag:
buy_num = input('请输入购买商品个数(最大值为%d) | 返回(b) | 退出(q): ' % goods_num)
if len(buy_num) != 0: ###如果输入非空,对输入进行判断并转化类型###
buy_num = digit_input(buy_num)
if buy_num == 'q': ###如果输入为q,则退出程序###
sys.exit(0)
elif buy_num == 'b': ###如果输入为b,则返回第一层循环,重新选择商品编号###
break
elif type(buy_num) is int and buy_num > 0 and buy_num <= goods_num: ###输入要求商品数量###
my_goods_sum = goods_price * buy_num ###计算购买商品的总金额###
if my_goods_sum <= now_balance:
print('购买商品 %s 总价格为 : %d' % (goods_name,my_goods_sum))
add_flag = input('请确认是否加入购物车(y | n):')
if add_flag == 'y': ###购买商品确认加入购物车### ###判断购物车不存在该商品###############
if goods_index not in user_shopping_cart:
user_shopping_cart_count += 1 ###购物车里商品数量加1###
####将该商品加入用户购物车字典中####
user_shopping_cart[goods_index] = [goods_name,goods_price,goods_num,buy_num,my_goods_sum]
####购物车已经存在该商品,则进行数量和金额累计计算############
else:
user_shopping_cart[goods_index][3] += buy_num
user_shopping_cart[goods_index][4] += my_goods_sum now_balance -= my_goods_sum ###计算出当前余额### goods_list[goods_name]['num'] -= buy_num ###商品列表的商品数量更新###
second_flag = 0 ###设置第二层循环值为0,结束第二层循环#### else:
break
else:
print('您的余额不足,请充值或重新选择,谢谢')
time.sleep(2)
else:
pass
else:
pass
else:
if i != 2: ###i=2时,最后一次机会,不在提示还剩余0次机会了##
print('用户或密码错误,请重新输入,还有 %d 次机会' % (2 - i))
i += 1 ###当用户输入错误时,循环值增加1###
else:
sys.exit('用户或密码输入错误超过三次,退出系统,欢迎下次光临') #三次错误后,异常退出###

python基础day2作业:购物车的更多相关文章

  1. python基础 实战作业 ---Excel基本读写与数据处理

    代码地址如下:http://www.demodashi.com/demo/11650.html 看完本篇需要: 10min 作业练习需要: 0.5h~3h(依练习者对python熟悉程度而定) 看完本 ...

  2. Python培训12期-day2作业-购物车

    #!/usr/bin/env python import sys import os import getpass 商品={ '图书': { "<Puppet实战>": ...

  3. Python基础-day2

    1.Python模块python 中导入模块使用import语法格式:import module_name示例1: 导入os模块system('dir')列出当前目录下的所有文件 # _*_ codi ...

  4. (Python基础)简单购物车代码

    以下是最简单,最基础的购物车代码,一起学习,一起参考.product_list = [ ('Iphone',5800), ('Mac Pro',15800), ('car',580000), ('co ...

  5. python 基础之简单购物车小程序实现

    购物车 all_list = [ ('mac',9000), ('kindle',900), ('tesla',800), ('python',105), ('bile',2000), ] savin ...

  6. python基础:day3作业

    修改haproxy配置文件 基本功能:1.获取记录2.添加记录3.删除记录 代码结构:三个函数一个主函数 知识点:1.python简单数据结构的使用:列表.字典等 2.python两个模块的使用:os ...

  7. 我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)

    作业二:三级菜单 三级菜单 可一次进入各个子菜单 思路: 这个题看似不难,难点在于三层循环的嵌套,我的思路就是通过flag的真假来控制每一层的循环的,简单来说就是就是通过给每一层循环一个单独的布尔变量 ...

  8. 我的Python成长之路---第一天---Python基础(作业1:登录验证)---2015年12月26日(雾霾)

    作业一:编写登录接口 输入用户名密码 认证成功系那是欢迎信息 输错三次后锁定 思路: 1.参考模型,这个作业我参考了linux的登录认证流程以及结合网上银行支付宝等锁定规则 1)认证流程参考的是Lin ...

  9. python基础day2

    一.python字符串 字符串是 Python 中最常用的数据类型.可以使用引号('或")来创建字符串 1.1Python访问字符串中的值 Python不支持单字符类型,单字符在 Pytho ...

随机推荐

  1. codeforces Round #258(div2) D解题报告

    D. Count Good Substrings time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  2. 初次接触CodeSmith

    说到开发效率的提高,代码生成器肯定是其中必不可少的重点.说到代码生成器,鼎鼎大名CodeSmith肯定是如雷贯耳. CodeSmith最大的特点是能够自定义模板(通俗的说就是想生成什么样就可以生成什么 ...

  3. 构建移动Web应用程序的技术堆栈

    编写web应用程序时,有很多的技术决策.笔者最近回来编写现代Web应用程序,并希望总结一些曾经在开发周期过程中做了记录零散的想法.这篇文章是关于一套对笔者最近开发的项目有帮助的框架.笔者重温了一些最重 ...

  4. 0c-39-ARC下单对象内存管理

    1.ARC工作原理详述 ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease A ...

  5. offer档次排名,2014最新版

    转自:http://tieba.baidu.com/p/2748469183 综合考虑发展,薪水,环境,压力. 第0档:美国互联网总部special offer(15万刀起薪) 第一档: 股份制银行总 ...

  6. 40 JavaScript Chart and Graph Libraries for Developers--reference

    reference:http://www.egrappler.com/javascript-chart-and-graph-libraries-for-developers/ BY TEAMEGRAP ...

  7. Linux / Unix Command: bunzip2--reference

    http://linux.about.com/library/cmd/blcmdl1_bunzip2.htm NAME bzip2, bunzip2 - a block-sorting file co ...

  8. Android 自定义组合控件

    1, you need to add this kind of code to the constructors of your custom view which must extend ViewG ...

  9. Amazon Launches FBA Export to Expand Beyond Media Categories

    Amazon launched a new program called FBA Export for third-party sellers to help them export products ...

  10. [Java] Eclipse+Spring学习(一)环境搭建

    转自:http://blog.sina.com.cn/s/blog_7c3736810100qhia.html 最近由于投了一家公司实习,他要java工程师,而我大学3年的精力都花到了ASP.NET和 ...