zoukankan      html  css  js  c++  java
  • 初学 python 之 购物车程序实现原理

    购物车程序要求:

    1、启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表

    2、允许用户根据商品编号选择商品

    3、可查看已经选择的商品以及总价,所选商品总价大于工资提醒,

    4、选好后确认结算,打印已购买商品和余额,可随时退出

    5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示

    6、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买

    7、允许查询之前的消费记录

    目标:

    练习文件读写,列表和列表解析,函数使用,循环表达式.

    程序流程:

    1.开始,读取文本文件内容,商品文本和会员信息文本,生成商品列表,会员名密码工资列表,购物车列表和已购商品列表,进入2

    2.输入用户名和密码,用户名密码错误就返回2重新输入,用户名密码正确进入3

    3.判断工资是否为默认none,是none就输入工资,更新会员名密码工资列表,数据输出至会员信息文本保存再进入4,不是none直接进入4

    4.显示不同操作,

       输入q直接退出程序,

     输入s进入42,

        42.显示商品,选择商品序列把商品加入购物车, 更新列表,数据输出至会员信息文本保存,提示余额状态,再返回4,

       输入p进入43,

        43.余额充足,即结算购物车,更新各列表,数据输出至会员信息文本保存在返回4,余额不足,显示提示,直接返回4,

       输入c进入44,

        44.显示购物车商品,

           选择要删除的商品序号,从购物车列表中删除,数据输出至会员信息文本保存再返回44,

           选择b,返回4.

    知识点:

    1.文件读写

    1 with open('file','r',) as f:
    2     ..... # do something

    打开文件的模式有:

    • r,只读模式(默认)。
    • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
    • a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

    "+" 表示可以同时读写某个文件

    • r+,可读写文件。【可读;可写;可追加】
    • w+,写读
    • a+,同a

    "U"表示在读取时,可以将 自动转换成 (与 r 或 r+ 模式同使用)

    • rU
    • r+U

    "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

    • rb
    • wb
    • ab

    2.列表解析表达式

    1 >>> list = [[1,2,3],[4,5,6],[7,8,9]]
    2 >>> list
    3 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    4 >>> col = [m[0] for m in list]    # 提取list中各列表的第一个元素创建新列表col
    5 >>> col
    6 [1, 4, 7]
    7 >>> 

     这个可以很方便的数据处理

    3.函数使用,

    定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

    特性:

    1. 减少重复代码
    2. 使程序变的可扩展
    3. 使程序变得易维护

    语法定义

    1 def sayhi():#函数名
    2     print("Hello, I'm nobody!")
    3  
    4 sayhi() #调用函数

    可以带参数

     1 #下面这段代码
     2 a,b = 5,8
     3 c = a**b
     4 print(c)
     5  
     6  
     7 #改成用函数写
     8 def calc(x,y):
     9     res = x**y
    10     return res #返回函数执行结果
    11  
    12 c = calc(a,b) #结果赋值给c变量
    13 print(c)

    4. while 循环和if...else表达式用于控制流程

    5. 终端文字颜色显示.

     格式:33[显示方式;前景色;背景色m  
     说明:
     前景色            背景色           颜色
     ---------------------------------------
     30                40              黑色
     31                41              红色
     32                42              绿色
     33                43              黃色
     34                44              蓝色
     35                45              紫红色
     36                46              青蓝色
     37                47              白色
     显示方式           意义
     -------------------------
     0                终端默认设置
     1                高亮显示
     4                使用下划线
     5                闪烁
     7                反白显示
     8                不可见
    
     例子:
     33[1;31;40m    <!--1-高亮显示 31-前景色红色  40-背景色黑色-->
     33[0m          <!--采用终端默认设置,即取消颜色设置-->

    代码:

      1 with open('product_list', 'rU', encoding='utf-8') as f,
      2         open('userinfo', 'rU', encoding='utf-8') as f2:
      3     # 打开商品列表文件和会员信息文件
      4     product_list = [pr.strip().split(',') for pr in f]   # 构建商品列表
      5     user_info = [u.split() for u in f2]                  # 构建会员信息列表
      6 
      7     if len(user_info[1]) == 1:
      8         cart = []   # 购物车是空
      9     else:
     10         cart = [c.strip().split(',') for c in user_info[1][1:]]  # 去掉购物车标记标签user_info[1][0]
     11         for i in cart:
     12             i.pop()
     13         # 处理多余的列表空元素
     14     # 构建购物车列表
     15 
     16     if len(user_info[2]) == 1:
     17         purchased = []  # 已购商品为空
     18     else:
     19         purchased = [pu.strip().split(',') for pu in user_info[2][1:]]  # 去掉已购商品标记标签user_info[2][0]
     20         for i2 in purchased:
     21             i2.pop()
     22         # 处理多余的列表空元素
     23     # 构建已购商品列表
     24     username = user_info[0][0]
     25     password = user_info[0][1]
     26     salary = user_info[0][2]
     27     # 提取信息方便使用
     28 
     29 
     30 def consume(x):
     31     money = 0
     32     for gods in x:
     33         money += int(gods[1])*int(gods[2])
     34     return money
     35 # 计算商品总价函数
     36 
     37 
     38 def my_cart(x):
     39     for index, gods in enumerate(x):
     40         price = str(int(gods[1])*int(gods[2]))
     41         print('%s %s 单价:%s 数量:%s 合计:%s' % (str(index+1), gods[0], gods[1], gods[2], price))
     42     print('消费金额: 33[1;36m%s33[0m' % str(consume(x)))
     43 # 打印商品(购物车和已购商品通用)信息函数
     44 
     45 
     46 def _cart():
     47     print('33[1;34m购物车中的商品如下:33[0m')
     48     my_cart(cart)
     49 # 打印购物车信息函数
     50 
     51 
     52 def _purchased():
     53     print('33[1;34m已购商品如下:33[0m')
     54     my_cart(purchased)
     55 # 打印已购商品信息函数
     56 
     57 
     58 def info():
     59     if int(salary) < consume(cart):
     60         print('------会员:%s--当前余额:33[1;31m%s 余额不足无法结算33[0m------' % (username, salary))
     61     else:
     62         print('------会员:%s--当前余额:33[1;36m%s33[0m------' % (username, salary))
     63     _cart()
     64     _purchased()
     65 # 打印全部信息函数
     66 
     67 
     68 def menu():
     69     for index,  pr_message in enumerate(product_list):
     70         print(index+1, '%s %s %s' % (pr_message[0], pr_message[1], pr_message[2]))
     71 #  打印商品列表函数
     72 
     73 
     74 def output_to_file():
     75     with open('userinfo', 'w', encoding='utf-8') as f3:
     76         f3.write('%s %s %s
    ' % (username, password, salary))
     77         for ca_message1 in cart_output:
     78             for ca_message2 in ca_message1:
     79                 f3.write(ca_message2+',')
     80             f3.write('	')
     81         f3.write('
    ')
     82         for pu_message1 in purchased_output:
     83             for pu_message2 in pu_message1:
     84                 f3.write(pu_message2+',')
     85             f3.write('	')
     86 # 数据输出至文本文件函数,更新userinfo文件
     87 # 每次更新都是全部信息一起更新(会员信息,购物车,已购商品)
     88 
     89 while True:
     90     name = input('输入用户名>>')
     91     password = input('输入密码>>')
     92     if name == username and password == user_info[0][1]:
     93         print('欢迎 %s 回来!' % name)
     94         break
     95     else:
     96         print('用户名密码错误!')
     97 # 用户认证,正常情况还需要更细致(不是本次主要练习,简单带过)
     98 
     99 if salary == 'none':
    100     while True:
    101         salary = input('第一次登录请输入工资>>')
    102         if salary.isdigit():
    103             cart_output = [['购物车']]+cart
    104             # 创建准备输出的购物车的列表
    105             purchased_output = [['已购商品']]+purchased
    106             # 创建准备输出的已购商品列表
    107             output_to_file()
    108             # 输出数据,更新userinfo文件
    109             break
    110         else:
    111             print('输入的不是数字!!')
    112 # 判断是否第一次登录
    113 while True:
    114     choice = input('''
    115  _______________请选择操作_______________
    116 | 输入c进入我的商品,可删除购物车中的商品 |
    117 |         输入p结算付款,并退出           |
    118 |             输入s选购商品              |
    119 |_______________输入q退出________________|
    120 >>>''')
    121     if choice == 'c':
    122         while True:
    123             info()
    124             c_choice = input('''
    125  ______________请选择操作________________
    126 |  输入商品序列删除购物车中序列对应商品  |
    127 |        输入b返回选择其他操作           |
    128 |________________________________________|
    129 >>>''')
    130             if c_choice.isdigit():
    131                 if 0 < int(c_choice) <= len(cart):
    132                     del_name = cart[int(c_choice)-1][0]
    133                     del_number = cart[int(c_choice)-1][2]
    134                     cart.pop(int(c_choice)-1)
    135                     cart_output = [['购物车']]+cart
    136                     # 创建准备输出的购物车的列表
    137                     purchased_output = [['已购商品']]+purchased
    138                     # 创建准备输出的已购商品列表
    139                     output_to_file()
    140                     # 输出数据,更新userinfo文件
    141                     print('33[1;31m商品: %s 数量: %s 已从购物车中删除33[0m' % (del_name, del_number))
    142                 else:
    143                     print('33[1;31m商品不存在!33[0m')
    144             elif c_choice == 'b':
    145                 break
    146         continue
    147     # 查看购物车和已购商品信息
    148     elif choice == 's':
    149         print('33[1;34m----商品列表如下,请选择商品----33[0m')
    150         menu()
    151         while True:
    152             s_choice = input('输入序列号把商品加购物车>>')
    153             s_quantity = input('输入商品数量>>')
    154             if s_choice.isdigit():
    155                 if 0 < int(s_choice) <= len(product_list):
    156                     choice_product = product_list[(int(s_choice)-1)]
    157                     # 读取product_list中选择序列对应商品列表
    158                     cart.append([choice_product[0], choice_product[1], s_quantity])
    159                     # 把选择的商品加入cart列表中
    160                     cart_output = [['购物车']]+cart
    161                     # 创建准备输出的购物车的列表
    162                     purchased_output = [['已购商品']]+purchased
    163                     # 创建准备输出的已购商品列表
    164                     output_to_file()
    165                     # 输出数据,更新userinfo文件
    166                     c_name = choice_product[0]
    167                     c_number = str(s_quantity)
    168                     print('33[1;34m商品: %s 数量: %s 已加入购物车33[0m' % (c_name, c_number))
    169                     # 提示商品成功加入购物车
    170                     if int(salary) < consume(cart):
    171                         a = str(consume(cart))
    172                         b = salary
    173                         print('购物车商品总价: 33[1;36m%s33[0m 余额: 33[1;31m%s 余额不足!33[0m' % (a, b))
    174                         print('请进入我的商品,调整购物车里的商品')
    175                         # 余额不足,提示!
    176                         break
    177                     else:
    178                         a = str(consume(cart))
    179                         b = salary
    180                         print('购物车商品总价: 33[1;36m%s33[0m 余额: 33[1;36m%s 余额充足!33[0m' % (a, b))
    181                     break
    182                 else:
    183                     print('33[1;31m商品不存在33[0m')
    184                     continue
    185     elif choice == 'p':
    186         if int(salary) < consume(cart):
    187             a = str(consume(cart))
    188             b = salary
    189             print('购物车商品总价: 33[1;36m%s33[0m 余额: 33[1;31m%s 余额不足无法结算!33[0m' % (a, b))
    190             print('请进入我的商品,调整购物车里的商品')
    191             continue
    192             # 余额不足,不能结算
    193         else:
    194             salary = str(int(salary) - consume(cart))
    195             # 计算余额
    196             purchased = purchased + cart
    197             # 金额结算后,把cart中的商品放入purchased列表中
    198             purchased_output = [['已购商品']]+purchased
    199             # 创建准备输出的已购商品列表
    200             cart = []
    201             # 然后cart列表清空,继续中转使用
    202             cart_output = [['购物车']]+cart
    203             # 创建准备输出的购物车的列表
    204             output_to_file()
    205             # 输出数据,更新userinfo文件
    206             info()
    207             # print('欢迎再次光临,再见!')
    208             continue
    209     # 购物车结算
    210     elif choice == 'q':
    211         print('欢迎再次光临,再见!')
    212         break
    213     # 退出
    View Code
  • 相关阅读:
    题解文本生成器
    莫比乌斯反演学习笔记
    数论整除分块
    线段树
    AC自动机学习笔记
    game theory
    Android 学习 笔记_05. 文件下载
    Android 学习 笔记_08. 广播机制
    Android 学习 笔记_07. XML文件解析
    Android 学习 笔记_09. WIFI网络操作
  • 原文地址:https://www.cnblogs.com/JayeHe/p/6498227.html
Copyright © 2011-2022 走看看