zoukankan      html  css  js  c++  java
  • 路飞学城-Python开发-第三章

    # 数据结构:
    # goods = [
    # {"name": "电脑", "price": 1999},
    # {"name": "鼠标", "price": 10},
    # {"name": "游艇", "price": 20},
    # {"name": "美女", "price": 998},
    # ......
    # ]
    # 功能要求:
    # 基础要求:
    # 1、启动程序后,输入用户名密码后,让用户输入工资,然后打印商品列表
    # 2、允许用户根据商品编号购买商品
    # 3、用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
    # 4、可随时退出,退出时,打印已购买商品和余额
    # 5、在用户使用过程中, 关键输出,如余额,商品已加入购物车等消息,需高亮显示
    # 扩展需求:
    # 1、用户下一次登录后,输入用户名密码,直接回到上次的状态,即上次消费的余额什么的还是那些,再次登录可继续购买
    # 2、允许查询之前的消费记录
    # 参考博客https://www.cnblogs.com/heimu24/p/8613071.html
    import json
    import os
    goods = [
    {"name": "电脑", "price": 1999},
    {"name": "鼠标", "price": 10},
    {"name": "游艇", "price": 20},
    {"name": "美女", "price": 998},
    ]
    user_info = {}
    shopping_list = {}
    money_list = {}
    def init_user():
        user_init = {'panda':'123',
                     'pandaboy':'456',
                     'boy':'789',
                     'root':'110'}
        user_info.update(user_init)
        for item in user_info:
            shopping_list[item] = []
            money_list[item] = 0
        save()
    
    def save():
        with open('user_info','w',encoding='UTF-8') as f:
            json.dump(user_info,f)
        with open('shopping_list','w',encoding='UTF-8') as f:
            json.dump(shopping_list,f)
        with open('money_list', 'w',encoding='UTF-8') as f:
            json.dump(money_list, f)
    
    def download():
        with open("user_info", 'r',encoding='UTF-8') as f:
            user_info = json.load(f)
        with open("shopping_list", 'r',encoding='UTF-8') as f:
            shopping_list = json.load(f)
        with open("money_list", 'r',encoding='UTF-8') as f:
            money_list = json.load(f)
        return user_info, shopping_list, money_list
    
    def show_money():
        print('>>>>>>>>33[1;31;40m您的余额是:33[0m	%s<<<<<<<'% money_list[user])
    
    def show_shopping_list():
        print(">>>>>>>>你的历史购物清单<<<<<<<")
        [print(shopping_list[user][i]) for i in range(len(shopping_list[user]))]
    
    def show_out():
        print(">>>>>>>>你的购物清单<<<<<<<")
        [print(shopping_list[user][i]) for i in range(len(shopping_list[user]))]
        show_money()
    
    def show_recharge():
        recharge_number = input("请输入您要充值的金额:").strip()
        while True:
            if recharge_number.isdigit():
                money_list[user]+=int(recharge_number)
                break
            else:
                recharge_number = input("输入错误,请重新输入您要充值的金额").strip()
        print("33[31;1m充值成功,您的账户当前余额为%d33[0m" % money_list[user])
    def show_shopping():
        while True:
            print('>>>>>>>>>>商品清单<<<<<<<<<<')
            [print(goods[i]) for i in range(len(goods))]
            choice_input = input("请输入你要购买的商品编号(1--4):").strip()
            if choice_input.isdigit() and 1 <= int(choice_input) <= 4:
                if goods[int(choice_input) - 1]['price'] <= money_list[user]:
                    money_list[user] -= goods[int(choice_input) - 1]['price']
                    shopping_list[user].append(goods[int(choice_input) - 1])
                    print("商品>>>33[1;31;40m[%s]33[0m>>>已经加入购物车" % goods[int(choice_input) - 1]['name'])
                    while True:
                        out = input("退出请按Q,继续请按D").strip()
                        if out.lower() == 'q':
                            save()
                            show_out()
                            exit()
                        elif out.lower() == 'd':
                            break
                        else:
                            print('错误的指令,请重新输入')
                else:
                    while True:
                        print("您的账户当前余额为:33[31;1m%d33[0m" % money_list[user])
                        choose_user = input("您的账户余额不足,充值选择c,退出选择q").strip()
                        if choose_user.lower() == 'q':
                            save()
                            show_out()
                            exit()
                        elif choose_user.lower() == 'c':
                            show_recharge()
                            break
                        else:
                            print("错误的命令,请重新输入")
            else:
                print("商品编号不存在,你再看看吧")
    
    if os.path.isfile("user_info") and os.path.isfile("shopping_list") and os.path.isfile("money_list"):
        print('正在读取数据')
        user_info, shopping_list, money_list = download()
    else:
        print("正在初始化用户信息")
        init_user()
    while True:
        user = input("请输入账号:").strip()
        pwd = input("请输入密码:").strip()
        if user in user_info and pwd == user_info[user]:
            if not shopping_list[user]:
                salary_input = input("XXX小卖铺欢迎你,请输入第一次冲入的金额:").strip()
                money_list[user] = int(salary_input)
                show_money()
                show_shopping()
            else:
                print('您以前有过消费哦')
                while True:
                    choose_user = input("查询消费记录请按S,查询余额请按A,继续购物请按D,退出请按q").strip()
                    if choose_user.lower() == 's':
                        show_shopping_list()
                    elif choose_user.lower() == 'a':
                        show_money()
                    elif choose_user.lower() == 'q':
                        save()
                        show_out()
                        exit()
                    elif choose_user.lower() == 'd':
                        show_shopping()
                    else:
                        print("错误的命令,请重新输入")
        else:
            print("账户或密码错误,请重新输入>>")
    购物车

     参考他人优秀的思路,阅读优秀的程序是程序员进步最经济实惠的方式>>github

    如果几段代码中,思路和大部分实现都一直,只有少部分不同,那么我们应该将不同的代码不断修改该变量的值,来实现优化

    字典和集合底层都是hash表,但是集合比较适合用在互相运算,求交集、并集等,所以这里用字典更合适

    #####################################################################################

    #有缩进的代码表示局部作用域的代码
    #if_name_ =='_main_'
    # while True
    #先引入一个os模块
    import os,sys,time,json
    # print(os.path.dirname())
    #BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(_file_)))
    # sys.path.append(BASE_DIR) 不写死找到相对路径
    #################################################################################################################
    # print(os.getcwd())
    # 获取当前工作目录,即当前python脚本工作的目录路径-->F:Python_Leaning每日学习打卡
    # os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
    # os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
    # os.curdir 返回当前目录: ('.')
    # os.pardir 获取当前目录的父目录字符串名:('..')
    # os.makedirs('dirname1/dirname2') 可生成多层递归目录
    # os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,
    # 依此类推,如果不是空文件则不给删除
    # os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
    # os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    # os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    # os.remove() 删除一个文件
    # os.rename("oldname","newname") 重命名文件/目录
    # os.stat('path/filename') 获取文件/目录信息
    # os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    # os.linesep 输出当前平台使用的行终止符,win下为" ",Linux下为" "
    # os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
    # os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    # os.system("bash command") 运行shell命令,直接显示
    # os.environ 获取系统环境变量
    # os.path.abspath(path) 返回path规范化的绝对路径
    # os.path.split(path) 将path分割成目录和文件名二元组返回
    # res = os.path.split('F:Python_LeaningvenvScriptspython.exe F:/Python_Leaning/每日学习打卡/Day22.py')
    # print(res)
    # ('F:\Python_Leaningx0benv\Scripts\python.exe F:/Python_Leaning/每日学习打卡', 'Day22.py')
    ############################################################################################################
    # os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
    # os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
    # os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
    # os.path.isabs(path) 如果path是绝对路径,返回True
    # os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
    # os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
    # os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    #join是将路径进行拼接,最常用的方法
    # os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
    # os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
    ##################################################################################################################
    # SYS模块
    # sys.argv 命令行参数List,第一个元素是程序本身路径
    # sys.exit(n) 退出程序,正常退出时exit(0)
    # sys.version 获取Python解释程序的版本信息
    # sys.maxint 最大的Int值
    # sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    # sys.platform 返回操作系统平台名称
    ######################################################################################################################
    # 进度条
    # for i in range(10):
    # sys.stdout.write('#')
    # time.sleep(1)
    # sys.stdout.flush()
    # print(sys.argv)
    #######################################################################################################################
    #json模块用于数据交换,json可以进行任何语言的数据交换
    # dic = {'name':'alex'}
    # data = json.dumps(dic)
    # print(data)
    # print(type(data)) #json字符串一定是双引号
    # f = open("json_test","r")
    # data = f.read()
    # print(data)
    # print(type(data))
    # data1 = json.loads(data)
    # print(data1["name"])
    # f.close()
    # {"name":"alex"}
    # <class 'str'>
    # alex
    ########################################################################################################################
    # 什么是序列化?
    # 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,
    # 在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。
    # 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
    # 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
    # # ----------------------------序列化
    # import pickle
    # dic = {'name': 'alvin', 'age': 23, 'sex': 'male'}
    # print(type(dic)) # <class 'dict'>
    # j = pickle.dumps(dic)
    # print(type(j)) # <class 'bytes'>
    # f = open('序列化对象_pickle', 'wb') # 注意是w是写入str,wb是写入bytes,j是'bytes'
    # f.write(j) # -------------------等价于pickle.dump(dic,f)
    # f.close()
    # # -------------------------反序列化
    # import pickle
    # f = open('序列化对象_pickle', 'rb')
    # data = pickle.loads(f.read()) # 等价于data=pickle.load(f)
    # print(data['age'])
    # Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,
    # 并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。
    #######################################################################################################################
    # import shelve
    # f = shelve.open(r'shelve.txt')
    # # f['stu1_info']={'name':'alex','age':'18'}
    # # f['stu2_info']={'name':'alvin','age':'20'}
    # # f['school_info']={'website':'oldboyedu.com','city':'beijing'}
    # # f.close()
    # print(f.get('stu_info')['age'])
    # shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,
    # 而值可以是python所支持的数据类型
    #######################################################################################################################
    #XMl是等同于现在的json的数据处理交换文件,但是由于时间使用长,所以xml需要了解,xml使用的是标签语言,所有的语法都是标签实现的
    #xml需要对数据进行解析
    import xml.etree.cElementTree as ET #简写
    # tree = ET.parse("F:/Python_Leaning/测试专用文件夹/xmltest")
    # root = tree.getroot() #找到根节点————>root
    # print(root.tag) # tag就是标签的名字
    #遍历文档内容
    # for child in root:
    # print(child.tag,child.attrib)
    # for i in child:
    # print(i.text)
    #______________________________________________________________#
    #只遍历year节点
    # for node in root.iter('gdppc'):
    # print(node.tag,node.text)
    #_______修改_________________________________________________________#
    # for node in root.iter('year'):
    # new_year = int(node.text)+1
    # node.text = str(new_year)
    # node.set('updated','yes')
    # tree.write('xmltest.xml')
    #_____删除_______________________________________________________________#
    # for country in root.findall('country'):
    # rank = int(country.find('rank').text)
    # if rank >50:
    # root.remove(country)
    # tree.write('xmltest.xml')
    #__________________________________________________________________________#
    #创建xml数据
    # new_xml = ET.Element('namelist')
    # name = ET.SubElement(new_xml,'name',attrib = {'enrolled':'yes'})
    # age = ET.SubElement(name,'age',attrib = {'checked':'no'})
    # et = ET.ElementTree(new_xml) #生成文档树
    # et.write('test.xml',encoding='UTF-8',xml_declaration=True)
    #——————————————————————————————————————#
    #正则表达式:对字符串进行处理
    # 就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,
    # (在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,
    # 然后由用 C 编写的匹配引擎执行。
    # 字符匹配(普通字符,元字符):
    #
    # 1 普通字符:大多数字符和字母都会和自身匹配
    # >>> re.findall('alvin','yuanaleSxalexwupeiqi')
    # ['alvin']
    #
    # 2 元字符:. ^ $ * + ? { } [ ] | ( ) --->>提供了模糊匹配的可能
    # .通配符:什么都可以代替,数字、字母等,除了_不能替换
    import re
    # res = re.findall('^a..x','aappxasdasdiahsoldasidhxaosiduasx')
    # print(res)
    #^ 以什么开头,必须在字符串的开头匹配
    #$ 以什么为结尾,必须在字符串的结尾匹配
    #* 重复符号,零到无穷个,贪婪匹配,有多少都必须匹配上
    # res = re.findall('^a*','aaaaaappxasdasdiahsoldasidhxaosiduasx')
    # print(res)
    #+ 重复符号,1到无穷个,至少出现一次,贪婪匹配,有多少都必须匹配上
    # res = re.findall('alex*','aasdleasdasdxxxxxx')
    # print(res)
    #? 重复符号,匹配0到1个
    # res = re.findall('alex?','asdasdaalfalexasdasgaalexasdataalex')
    # print(res)
    #{} 范围自己定 {0,}==* {1,}==+ {0,1}==?
    #前面的*+?等都是贪婪匹配,后面加?号就是使其变成惰性匹配
    #[]字符集 代表或的作用,在字符集中不能存在匹配符号,字符集里有功能的符号:-至 ^非
    # res = re.findall('w[a-z]*','wwwbaidu')
    # print(res)
    # res = re.findall('([^()]*)','12+(34*6+2-5*(2-1))')
    # print(res)
    # 转译符
    # 元字符之转义符
    # 反斜杠后边跟元字符去除特殊功能,比如.
    # 反斜杠后边跟普通字符实现特殊功能,比如d
    # d 匹配任何十进制数;它相当于类 [0-9]。
    # D 匹配任何非数字字符;它相当于类 [^0-9]。
    # s 匹配任何空白字符;它相当于类 [ fv]。
    # S 匹配任何非空白字符;它相当于类 [^ fv]。
    # w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
    # W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
    #  匹配一个特殊字符边界,比如空格 ,&,#等
    #()是做分组用的
    Win a contest, win a challenge
  • 相关阅读:
    BZOJ2843:极地旅行社(LCT入门题)
    BZOJ2049:Cave 洞穴勘测 (LCT入门)
    【LSGDOJ1383】修改回文 dp
    【NOIP2016】愤怒的小鸟
    【USACO11NOV】牛的阵容Cow Lineup 尺取法+哈希
    【LSGDOJ1836】: 量化交易 贪心
    【网络流24题】魔术球问题 二分答案+最小路径覆盖
    【网络流24题】1745: 餐巾计划问题
    【网络流24题】分配问题 最小最大费用最大流
    【LSGDOJ1834 Tree】树链剖分
  • 原文地址:https://www.cnblogs.com/pandaboy1123/p/9211170.html
Copyright © 2011-2022 走看看