#功能:
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. Android ViewPager 应该及技巧

    1.   android 中的ViewPager 功能类似于iOS中的scrollView,实现最主要的页面的左右滑动功能.该类存在于Google的兼容包里面,所以在引用时记得在BuilldPath中 ...

  2. WCF和WPF读取xml的路径问题

    使用WCF编写服务,涉及到xml的读取,使用了System.AppDomain.CurrentDomain.BaseDirectory来获取路径,获得的是项目的基目录 例如: string path ...

  3. 海量数据处理算法—Bit-Map

    原文:http://blog.csdn.net/hguisu/article/details/7880288 1. Bit Map算法简介 来自于<编程珠玑>.所谓的Bit-map就是用一 ...

  4. 被淡忘的c#析构函数

    析构函数在C#中已经很少使用了,以至于很多人已经把它淡忘了,虽然用处不大,研究一下也无防.(原文:http://bbs.csdn.net/topics/300178463)一. 析构函数的特征:析构函 ...

  5. 使用apt-mirror建立本地debian仓库源

    先介绍一下环境: 主机:Win7 虚拟机:VirtualBox + Debian7 由于软件源的体积比较大,所以我又给虚拟机添加了一块50GB的虚拟硬盘(给虚拟机添加虚拟硬盘的方法参见:http:// ...

  6. flume1.5.2安装与简介

    关于flume的简介看参考:http://www.aboutyun.com/thread-7415-1-1.html 其实一张图就简单明了了 简单安装: 1.下载解压 ... 2.配置JDK,flum ...

  7. Masonry 布局 cell 高度适应的一种方案(实现类似朋友圈简单布局)

    来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89298/ 点击 → 申请加入伯乐在线专栏作者 前言: 我模仿的是微博的布局所以也就没有 评论动态刷新cell. 1 ...

  8. Winform下实现图片切换特效的方法

    本文实例讲述了Winform下实现图片切换特效的方法,是应用程序开发中非常实用的一个功能.分享给大家供大家参考之用.具体方法如下: 本实例源自网络,功能较为齐全.丰富!主要功能代码如下: using ...

  9. postgres函数

    1.数据修复最先考虑通过db内做修复,实在不行,在考虑外部应用程序通过jdbc修复. 比如一个场景:profile_image_url与enlarge_image_url都是微博用户信息返回的字段. ...

  10. 1.4.6 其他Schema元素

    这里描述了schema.xml中的其他几个重要的元素. 唯一主键-Unique Key uniqueKey元素一篇文档的唯一标记,它几乎总是保证您的应用程序设计,例如,如果你更新索引中的文档,需要用到 ...