zoukankan      html  css  js  c++  java
  • Python之购物商场

    作业:购物商场

    1、流程图

    2、初始化用户账号存储文件

    初始化存储一个空的用户账号字典,保存到文件 user.pkl。执行如下代码,即可初始化完成。
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Version:Python3.5.0
    
    import pickle
    
    def init_user():
        '''
        构造一个空的用户字典,格式:{'用户名':['密码',账号被锁状态,余额]}
        :return:None
        '''
        # 先构造一个空字典,存储用户信息的文件 user.pkl
        user_dict = {}
        with open('user.pkl','wb') as f:
            pickle.dump(user_dict,f)
        print('init user info finish!')
        return None
    
    if __name__ == '__main__':
        init_user()
    

    3、管理用户账号脚本

    用来解锁被锁的账号,以及可以修改账号密码

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Version:Python3.5.0
    
    import pickle
    
    def unlock_user():
        '''
        输入解锁的账号,即可解锁
        :return: None
        '''
        while True:
            # 输入解锁的账号
            user = input('Please input unlock the user: ').strip()
            # 判断该账号是否存在
            if user in user_dict:
                # 把锁状态标志3 修改为 0
                user_dict[user][1] = 0
                with open('user.pkl','wb') as f:
                    # 更新解锁后的账号信息,保存到user.pkl文件中
                    pickle.dump(user_dict,f)
                    print('The %s unlock successfully!' % user)
                    break
            else:
                 print('Account does not exist, try again!')
                 continue
        return None
    
    def change_pwd():
        '''
        输入要修改密码的账号,然后更新密码
        :return: None
        '''
        while True:
            # 输入解锁的账号
            user = input('Please input the user of change password: ').strip()
            # 判断该账号是否存在
            if user in user_dict:
                # 输入新的密码
                new_pwd = input('Please input the %s new password: ' % user).strip()
                user_dict[user][0] = new_pwd
                with open('user.pkl','wb') as f:
                    # 更新密码后的账号信息,保存到user.pkl文件中
                    pickle.dump(user_dict,f)
                    print('The %s change password successfully!' % user)
                    break
            else:
                 print('Account does not exist, try again!')
                 continue
        return None
    
    
    
    if __name__ == '__main__':
        # 设置界面功能选项列表
        choose = [['1','unlock user'], ['2','change password'], ['3', 'exit']]
        # 读取账号文件 user.pkl
        with open('user.pkl','rb') as f:
            user_dict = pickle.load(f)
    
        while True:
            # 打印界面功能选项
            print('=' * 50)
            for i in choose:
                for j in i:
                    print(j, end= ' ')
                print('')
    
            input_choose = input('Please choose the index: ').strip()
            # 选择解锁功能
            if input_choose == '1':
                unlock_user()
            # 选择修改密码
            elif input_choose == '2':
                change_pwd()
            # 选择退出界面
            elif input_choose == '3':
                break
            else:
                print('You input error, try again!')
                print('-' * 30)
                continue
    

      

    4、主程序购物商城

         第一次运行,默认没有账号,需要注册一个账号(新账号余额为)。
    登录成功后,要充值后,才可以购买商品。
    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    # Version:Python3.5.0
    
    import pickle
    
    def product_info():
        '''
        商品信息,返回一个商品信息的字典
        :return:product_list 和 product_list_index
        '''
        # 初始化商品列表
        product_dict = {'bike': 688, 'iphone6s': 5088, 'coffee': 35,
                        'car':88888, 'iPad Air': 3500, 'jacket': 300,
                        'MacBook pro': 12345, 'hamburger': 80}
        # 给商品添加索引
        product_list_index = [(index+1, key, product_dict[key]) for index, key in enumerate(product_dict)]
        return product_dict,product_list_index
    
    def register():
        '''
        注册新用户
        :return: None
        '''
        while True:
            # 输入注册账号
            username = input('Please input registered account: ').strip()
            # 输入为空,重新输入
            if username == '':continue
            if username in user_dict:
                print('Account already exists, please input again!')
                continue
            else:
                pwd = input('Please input password: ')
                user_dict[username] = [pwd, 0, 0]
                print('Registered successfully!')
                # 把更新后的账号字典保存到文件 user.pkl
                with open('user.pkl', 'wb') as f:
                    pickle.dump(user_dict, f)
                    break
    
    def login():
        '''
        用户登录,验证账号密码是否正确,密码输入3次则锁定账号
        :return: None
        '''
        flag = False
        # 初始化尝试的次数
        try_count = 0
        while True:
            username = input('Please input the user: ').strip()
            # 输入为空,重新输入
            if username == '':
                continue
            # 如果账号存在
            if username in user_dict:
                # 读取用户字典里面账号输错次数,count为输错次数
                count = user_dict[username][1]
                while True:
                    if count < 3:
                        pwd = input('Please input password: ')
                        # 验证密码是否正确
                        if user_dict[username][0] == pwd:
                            print('Login successfully!')
                            # 进入二级菜单选项界面
                            flag = login_module(username)
                            if flag:
                                break
                        else:
                            # 密码错误次数 count 加 1
                            count += 1
                            print('Password error! You have %s times,try again!' % (3-count))
                            continue
                    else:
                        # 输错3次后,账号被锁定
                        print('the %s is locked!' % username)
                        # 把该账号的错误次数更新到用户字典中
                        user_dict[username][1] = 3
                        with open('user.pkl', 'wb') as f:
                            # 重新写入到文件user.pkl
                            pickle.dump(user_dict, f)
                        # 账号被锁定后,返回上级菜单
                        break
            else:
                try_count += 1
                # 若果尝试3次后,则返回上级菜单
                if try_count == 3:
                    break
                else:
                    # 账号不存在,则重新输入,有3次机会
                    print('Account does not exist.you have %s times,try again!' %(3-try_count))
                    continue
            # 返回上级菜单
            if flag:
                break
    
    def shopping(user):
        '''
        显示商品信息,选择商品索引号,即可加入购物车
        :param user: 登录账号
        :return:
        '''
        # 调用商品信息函数,获取商品信息字典以及索引
        product, product_index = product_info()
        # 读取user_dict字典,记录登录的账号拥有的余额
        money = user_dict[user][2]
        print('Your own %s YUAN'.center(35) % money)
        print('-' * 35)
        # 初始化一个空商品列表,记录购买的商品
        shopping_list = []
        # 初始化购买商品总件数
        total_number = 0
        # 初始化花费金额
        total_cost = 0
        # 记录商品最低价格
        mix_price = min(product.values())
        while True:
            for i in product_index:
                # 打印索引号,添加两个空格显示
                print(i[0],end='  ')
                # 设置商品名称长度13,左对齐显示
                print(i[1].ljust(13),end='')
                 # 打印商品价格
                print(i[2])
    
            choose = input('Please choose the index of the product: ').strip()
            if choose.isdigit():
                # 判断输入的索引是否正确,设置索引从1开始
                if int(choose) in range(1, len(product_index)+1):
                    # 记录购买商品名称,choose-1 为 该商品在product_index 列表中的索引
                    choose_product = product_index[int(choose)-1][1]
                    # 判断余额是否大于等于产品的价格
                    if money >= product[choose_product]:
                        # 把商品加入购买清单
                        shopping_list.append(choose_product)
                        # 计算花费的金额
                        total_cost += product[choose_product]
                    # 余额可以购买最低价的商品
                    elif  money >= mix_price:
                        print('Your own %s YUAN, please choose other product.' % money)
                    else:
                        print('Your own money can not pay for any product,bye bye!')
                        break
                else:
                    print('Input the index error,try again!')
                    continue
                # 标记退出
                flag = False
                while True:
                    print('Your rest money is %s.' % (money-total_cost))
                    continue_shopping = input('Continue shopping?y or n: ').strip()
                    if continue_shopping == 'y':
                        break
                    elif continue_shopping == 'n':
                        flag = True
                        break
                    else:
                        continue
                if flag:
                    break
            else:
                print('Input error,try again!')
                continue
    
        product_set = set(shopping_list)
        print('*' * 35)
        # 打印购物单表头信息
        print('Your shopping list'.center(35))
        print('Product'.ljust(15),'Price'.ljust(7),'Number'.ljust(5),'cost'.ljust(7))
        print('-' * 35)
        for i in product_set:
            number = shopping_list.count(i)
            total_number += number
            cost = product[i] * number
            print('%s %s %s  %s' % (i.ljust(15),str(product[i]).ljust(7),
                                str(number).ljust(5), str(cost).ljust(7)))
        print('-' * 35)
        print('''All number: %s All cost: %s'''
              % (str(total_number).ljust(7), str(total_cost).ljust(7)))
        print('Your rest money is %s.' % (money-total_cost))
    
        with open('user.pkl','wb') as f:
            # 更新账号的余额,保存到文件user.pkl
            user_dict[user][2] = money-total_cost
            pickle.dump(user_dict, f)
    
    def  rechange(user):
        '''
        新注册的账号默认余额都是0元,登录系统后需要进行充值才可以购买商品
        :param user: 登录账号
        :return: None
        '''
        # 获取参数user
        input_money = input('Please input the money of yourself: ').strip()
        while True:
            if input_money.isdigit():
                user_dict[user][2] = int(input_money)
                with open('user.pkl','wb') as f:
                    # 更新账号的余额,保存到文件user.pkl
                    pickle.dump(user_dict, f)
                print('Rechange successfully!')
                break
            else:
                print('Input error,try again!')
                continue
    
    def  query_balance(user):
        '''
        查询自己的余额
        :param user: 登录账号
        :return: None
        '''
        # 打印余额
        print('Your own money %s YUAN.'% user_dict[user][2])
    
    def login_module(user):
        '''
        显示登录成功后的界面
        :param user: 登录账号
        :return: True
        '''
        # 登录后显示界面的选项信息
        second_menu = [['1', 'rechange'], ['2','query_balance'], ['3', 'shopping'],
                       ['4', 'return'], ['5', 'exit']]
        while True:
            print('*' * 35)
            # 打印二级菜单选项
            for i in second_menu:
                for j in i:
                    print(j, end=' ')
                print('')
            choose = input('Please input the index: ').strip()
            if choose == '':
                continue
            # 选择充值索引,执行充值函数
            if choose == '1':
                rechange(user)
            # 选择查询余额索引,执行查询余额函数
            elif choose == '2':
                query_balance(user)
    
            # 选择购物索引,执行购物函数
            elif choose == '3':
                shopping(user)
            # 返回上级菜单
            elif choose == '4':
                break
            # 结束程序
            elif choose == '5':
                exit()
            # 输入不匹配,重新输入
            else:
                print('Input error, try again!')
                continue
        return True
    if __name__ == '__main__':
        # 预读取账号信息文件 user.pkl,给函数调用
        with open('user.pkl', 'rb') as f:
            # 读取用户信息
            user_dict = pickle.load(f)
    
        # 构造主菜单列表选项
        main_menu = [['1', 'register'], ['2','login'], ['3', 'exit']]
        while True:
            print('**** Welcome to mall ****')
            # 打印主菜单选项
            for i in main_menu:
                for j in i:
                    print(j, end=' ')
                print('')
            choose = input('Please input the index: ').strip()
            if choose == '':
                continue
            # 选择注册索引,执行注册函数
            if choose == '1':
                register()
            # 选择登录索引,执行登录函数
            elif choose == '2':
                login()
            # 选择退出,则程序运行结束
            elif choose == '3':
                print('Good bye!')
                break
            # 输入不匹配,重新输入
            else:
                print('Input error, try again!')
                continue
    

      



    
    
  • 相关阅读:
    [bbk5153]第15集 Chapter 06 Working with Composite Data Types(Collection)
    [bbk5128]第12集 Chapter 06 Working with Composite Data Types 014998(Record)
    [bbk4998]第11集 Chapter 06 Working with Composite Data Types 004998(Record)
    [bbk4979]第06集 Chapter 04 Interacting with Oracle Database Server:SQL Statements in PL/SQL Programs(01)
    PHP与MYSQL事务处理
    Selenium封装
    pytest 失败重跑截图
    python 编码规范起源:PEP8 编码规范中文版
    pytest setup和teardown初始化
    谷歌浏览器linux,windows下载
  • 原文地址:https://www.cnblogs.com/suke99/p/5176339.html
Copyright © 2011-2022 走看看