• Python编程学习基础笔记03


    五、复习

    5.1 图书管理系统

    在这个章节里,所写的是基于线性脚本,纯代码堆砌,随着学习的深入,会在后面章节,通过模块化的方式来优化。

    '''
    图书管理系统:
        至少5本书
        library = [{'bookname':xxx,'Author':xxx,'price':xxx,'number':xx},{},{}]
    要求:
    1,借书
        不存在
        存在 -->
            判断数量:number 多本的情况
            可能不同作者: 根据作者选择要借的书
            借书成功后:修改库存数量
    2,还书:
        输入书名和作者 -->判断是否存在 --> 检查书名和作者,还书成功,修改库存数量number
    3,查询(可以根据书名或作者查询)
        1,输入1 或 2 来选择按书名或作者查询
        2,不区分:
            search = input('书名或作者'), 比较2次
            if search in namelist:
                pass
            elif search in authorlist:
                pass
    4,查看所有
    5,退出
        提示读者借到或归还的书数目!
    '''
    #定义一个数据库来存放图书
    library = [
        {'bookname':'红楼梦','Author':'曹雪芹','price':88,'number':10},
        {'bookname':'废艺斋集稿','Author':'曹雪芹','price':28,'number':5},
        {'bookname':'世界是平的','Author':'托马斯·弗里德曼','price':28,'number':5},
        {'bookname':'三国演义','Author':'罗贯中','price':68,'number':10},
        {'bookname':'儒林外史','Author':'吴敬梓','price':38,'number':0},
        {'bookname':'西游记','Author':'吴承恩','price':68,'number':6},
        {'bookname':'西厢记','Author':'王实甫','price':38,'number':4},
        {'bookname':'百年孤独','Author':'加西亚·马尔克斯','price':48,'number':3},
        {'bookname':'简.爱','Author':'夏洛蒂·勃朗特','price':28,'number':3},
        {'bookname':'封神榜','Author':'许仲琳','price':58,'number':0},
        {'bookname':'Python入门到精通','Author':'Forrest','price':58,'number':3},
        {'bookname':'Python入门到精通','Author':'Jessica','price':38,'number':3},
        {'bookname':'Python入门到精通','Author':'Jim','price':38,'number':3},
        {'bookname':'水浒传','Author':'施耐庵','price':78,'number':5}
    ]
    print('*************欢迎进入天大图书管理系统*************')
    #获取书名并将将其放入一个列表
    bookname_list = []
    for i in library:
        bookname_list.append(i['bookname'])
    #获取作者名并将将其放入一个列表
    author_list = []
    for i in library:
        author_list.append(i['Author'])
    #容器接收本次借阅的图书
    borrowed_booklist = []
    #容器接收本次归还的图书
    returned_booklist = []
    #定义循环控制变量
    flag = True
    while flag:
        print('\n1,借书 \n2,还书 \n3,查询(可以根据书名或作者查询)\n4,查看所有书籍 \n5,退出')
        oper = input('请输入你要使用的功能编号:')
        #借书
        if oper == '1':
            #输入你要借阅的书名
            book = input('请输入你要借阅的书名:').strip()
            #判断图书是否存在系统,不存在即返回提示
            if book in bookname_list:
                #将检索到是书的数量累加给num
                num = 0
                #先定义个空的作者集合,添加书的作者,如果同一书名对应多位作者,这里可供选择
                author_sublist = []
                #定义一个新的图书列表
                sub_library = []
                #遍历图书列表,添加数量和作者到变量
                for i in library:
                    #找到书名后,累加数量和作者
                    if i['bookname'] == book:
                        #将搜索到的书添加到新的列表
                        sub_library.append(i)
                        #将作者名直接追加到列表
                        author_sublist.append(i['Author'])
                        #书的数量累加
                        num += i['number']
                #判断图书存在且数量大于0
                if num > 0:
                    # 判断书名相同,但是作者不同
                    if len(author_sublist) >= 2:
                        print('你打算借阅的图书有不同的作者,请选择你需要借阅的作者名:')
                        #列出不同的作者,供读者选择
                        for j in range(len(author_sublist)):
                            print(f'{j + 1}:{author_sublist[j]}')
                        # 读者选择作者,去掉空格
                        choice = input('请选择作者:').strip()
                        #选择之后回到数据库查询
                        for k in library:
                            #判断书名和作者名都满足要求
                            if k['bookname'] == book and k['Author'] == choice:
                                #读者选择是否借阅
                                select = input('请确认是否借阅:是Y/否N')
                                # 确认借书
                                if select.lower() == 'y':
                                    #确认借阅,先减库存
                                    k['number'] -= 1
                                    #将借到的书放入借书车
                                    borrowed_booklist.append(k)
                                    #给读者返回提示信息和剩余库存量
                                    print(f"你已成功借阅图书:<<{book}>>,作者:{k['Author']}")
                                    print(f"该图书:<<{book}>>,作者:{k['Author']},还剩下库存量{k['number']}本")
                                # 放弃借书
                                elif select.lower() == 'n':
                                    print('放弃借阅图书!')
                    else:
                        print(f"你打算借阅的图书<<{book}>>作者是:{author_sublist[0]},请确认是否借阅!")
                        for k in library:
                            #判断是否存在多名作者
                            if k['bookname'] == book:
                                #读者选择是否借阅
                                select = input('请确认是否借阅:是Y/否N')
                                # 确认借书
                                if select.lower() == 'y':
                                    #确认借阅,先减库存
                                    k['number'] -= 1
                                    #将借到的书放入借书车
                                    borrowed_booklist.append(k)
                                    #给读者返回提示信息和剩余库存量
                                    print(f"你已成功借阅图书:<<{book}>>,作者:{k['Author']}")
                                    print(f"该图书:<<{book}>>,作者:{k['Author']},还剩下库存量{k['number']}本")
                                # 放弃借书
                                elif select.lower() == 'n':
                                    print('放弃借阅图书!')
                else:
                    print(f'对不起,你要借阅的图书:<<{book}>>没有库存,请选择借阅其他图书!')
    
            else:
                print(f'对不起,检索不到你要借阅的图书:<<{book}>>,请重新输入!')
        #还书
        elif oper == '2':
            # 输入你要归还的书名和作者名
            book = input('请输入你要归还的书名:').strip()
            author = input('请输入你要归还的作者名:').strip()
            #判断图书是否存在系统,不存在即返回提示
            if (book in bookname_list) and (author in author_list):
                for k in library:
                    if k['bookname'] == book and k['Author'] == author:
                        # 读者选择是否归还
                        select = input('请确认是否归还图书:是Y/否N')
                        # 确认归还
                        if select.lower() == 'y':
                            # 确认归还,加库存量
                            k['number'] += 1
                            # 将归还的书放入还书列表
                            returned_booklist.append(k)
                            # 给读者返回提示信息和剩余库存量
                            print(f"你已成功归还图书:<<{book}>>,作者:{k['Author']}")
                            print(f"该图书:<<{book}>>,作者:{k['Author']},当前库存量{k['number']}本")
                        # 放弃借书
                        elif select.lower() == 'n':
                            print('放弃归还图书!')
    
            else:
                #提示错误信息
                print(f"请检查你输入的书名:<<{book}>>或作者:{author}是否正确!!")
        #查询
        elif oper == '3':
            #输入查询内容
            search = input('请输入要查询的书名或作者:').strip()
            #判断如果读者输入的是书名
            if search in bookname_list:
                print('为你检索到如下信息:')
                #遍历数据库查找结果
                for k in library:
                    if k['bookname'] == search:
                        #返回检索信息
                        print(f"书名:《{k['bookname']}》,作者:{k['Author']},价格:{k['price']},库存:{k['number']}本")
            # 判断如果读者输入的是作者名
            elif search in author_list:
                print('为你检索到如下信息:')
                #遍历数据库查找结果
                for k in library:
                    if k['Author'] == search:
                        #返回检索信息
                        print(f"书名:《{k['bookname']}》,作者:{k['Author']},价格:{k['price']},库存:{k['number']}本")
            else:
                #提示错误信息
                print(f"未检索到你查询的内容,请检查你输入关键字'{search}'是否正确!!")
        #查看所有
        elif oper == '4':
            #提示信息
            print('当前数据库所有图书列表如下:')
            for k in library:
                print(f"书名:《{k['bookname']}》,作者:{k['Author']},价格:{k['price']},库存:{k['number']}本")
        elif oper == '5':
            # 读者确认是否退出系统
            select = input('请确认是否退出系统:是Y/否N\n')
            # 确认退出
            if select.lower() == 'y':
                #判断已借到书
                if len(borrowed_booklist) > 0:
                    #提示读者本次借阅或归还的图书
                    print(f"你本次共借阅{len(borrowed_booklist)}本图书!")
                elif len(returned_booklist) > 0:
                    #提示读者本次借阅或归还的图书
                    print(f"你本次共归还{len(returned_booklist)}本图书!")
                else:
                    print('你本次没有借或还书的操作!')
                # 给读者提示信息
                print(f">>>>>>>>正在退出系统,欢迎再次光临>>>>>>>>")
                flag = False
            # 放弃退出
            elif select.lower() == 'n':
                print('请继续浏览!')
        else:
            #提示错误信息
            print('输入格式有误,请重新输入!')
    

    5.2 列表推导

    ''''
    列表推导式:最终得到一个列表
    格式1:[i for i in 可迭代的]
    格式2:[i for i in 可迭代的 if 条件]
    格式3:[结果1 if 条件 esle 结果2 for i in 可迭代的 ]
    '''
    #得到一个列表
    list1 =[]
    for i in range(1,21):
        list1.append(i)
    print(list1) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
    
    #list2 == list1,先循环,再赋值给i,加到外层的列表
    list2 = [i for i in range(1,21)]
    print(list2)
    
    list2 = [i+2 for i in range(1,10)]
    print(list2) #[3, 4, 5, 6, 7, 8, 9, 10, 11]
    
    #格式2:[i for i in 可迭代的 if 条件]
    list2 = [i for i in range(1,21) if i%2 == 0]
    print(list2) #[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
    
    #提取
    list3 = ['hello','55','world','88','beauty','love']
    #取出里面的单词
    list4 = [word for word in list3 if word.isalpha()]
    print(list4) #['hello', 'world', 'beauty', 'love']
    
    list4 = [word.title() if word.startswith('h') else word.upper() for word in list3 ]
    print(list4) #['Hello', '55', 'WORLD', '88', 'BEAUTY', 'LOVE']
    
    #1-20,按3位截取
    a = [x for x in range(1,21)]
    b = [a[i:i+3] for i in range(0,len(a),3)]
    print(b) #[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20]]
    

    5.3 集合和字典推导式

    #集合推导式,{} 类似于列表推导式,在列表推导式的基础上增加了去重的功能
    
    list = [1,3,2,5,9,8,5,6,3,2,7,6,5]
    
    set1 = {x for x in list}
    print(set1) #{1, 2, 3, 5, 6, 7, 8, 9}
    
    set1 = {x for x in list if x > 5}
    print(set1) #{8, 9, 6, 7}
    
    set1 = {x-2 for x in list if x > 5}
    print(set1) #{4, 5, 6, 7}
    
    #字典推导式
    dict1 = {'a':'A','b':'B','c':'C','d':'C',}
    #key 和value对换,key是唯一的
    new_dict = {value:key for key,value in dict1.items()}
    print(new_dict) #{'A': 'a', 'B': 'b', 'C': 'd'}
    

    5.4 生成器

    5.4.1 生成器基础

    通过列表生成式(列表推导式),我们可以直接创建一个列表,但是,收到内存现在,列表的容量是有限的而且,创建一个包含100万个元素的列表,不仅占用很大的内存空间,如果我们仅仅需要访问到前面几个元素,那后面大多数元素占用的空间都白白浪费。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在python中,这种一边循环一边计算的机制,成为生成器:Generator。

    '''
    得到生成器的方式:
        1,通过列表推导式得到生成器
    
    '''
    
    #[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
    new_list = [x*3 for x in range(10)]
    print(new_list)
    #得到生成器
    g = (x*3 for x in range(5))
    print(type(g)) #<class 'generator'>
    #方式一,通过调用__next__ 方式得到元素
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    #方式二,next(生成器对象) 系统内置函数,没调用一次next,则会产生一个元素
    print(next(g))
    print(next(g))
    print(next(g)) #StopIteration 超出生成器的范围,再调用就会抛出StopIteration异常
    
    # 通过循环来处理生成器异常
    # 得到生成器
    g = (x*3 for x in range(10))
    
    while True:
        try:
            e = next(g)
            print(e)
        except:
            print('没有更多的元素了!')
            break
    

    5.4.2 借助函数完成生成器

    #定义生成器的方式二:借助函数完成
    #只要函数中出现了yield 关键字,说明函数就不是函数啦,变成生成器啦
    '''
    步骤:
        1,定义一个函数,函数中使用yield 关键字
        2,调用函数,接收调用的结果
        3,得到的结果就算是生成器
        4,借助next() 或__next__
    '''
     def func():
         n = 0
         while True:
             n += 1
             yield n
    #斐波那契数列
    def fib(length):
        a,b = 0,1
        n = 0
        while n < length:
            # print(b)
            yield b #return b + pause
            a,b = b, a+b
            n += 1
        return '没有更多元素了!'  #StopIteration: 没有更多元素了!
    
    #调用
    g = fib(8)
    
    print(next(g))
    

    5.4.3 生成器应用

    #定义生成器的方式二:借助函数完成
    '''
    生成器方法:
        1,next() 或__next__ 获取下一个元素
        2,send(value): 向每次生成器调用中传值
            注意:第一次调用,必须先传None
    '''
    def gen():
        n = 0
        while n < 5:
            temp = yield n
            print('temp:',temp)
            for x in range(temp):
                print('---->',x)
            n += 1
        return '没有更多元素!'
    #调用
    g = gen()
    r = g.send(None)
    print(r)
    n1 = g.send(2)
    print('n1:',n1)
    n2 = g.send(3)
    print('n2:',n2)
    
    #结果分析
    '''
    0  --》 第一次,循环开始,yield 返出 n =0,此时被r = g.send(None) 接收
    temp: 2 --> temp 接收外部send 的值 2
    ----> 0  --》 for循环2次
    ----> 1
    n1: 1   --》 第二次循环,n1 接收到yield 返出的值 1
    temp: 3 temp: 2 --> temp 接收外部send 的值 3
    ----> 0  --》 for循环3次
    ----> 1
    ----> 2
    n2: 2 --》 第三次循环,n2 接收到yield 返出的值 2, 没有后续的值,yield处于暂停,然后整个程序退出
    '''
    

    5.4.3 生成器应用之多任务

    '''
    进程 --> 线程 --> 协程
    生成器:generator
    1,定义生成器的方式
        通过列表推导式
        借助函数 + yield
    2,产生元素:
        next() 每次调用都会产生一个新元素,元素产生完毕再调用就会抛异常
        生成器自己的方法:
            g.__next__()
            g.send(value)
    '''
    #生成器应用--》 多任务
    def task1(n):
        for i in range(n):
            print(f'正在做第{i}个任务')
            yield
    
    def task2(n):
        for i in range(n):
            print(f'正在听第{i}首歌')
            yield
    g1 = task1(5)
    g2 = task2(5)
    
    while True:
        try: #交替执行任务
            next(g1)
            next(g2)
        except:
            print('任务完成')
            break
    
  • 相关阅读:
    Spark Streaming企业运用
    spark企业运用
    sparkcore企业运用
    Spark GraphX从入门到实战
    sparkstreaming入门到实战
    sparkSql从入门到实战
    sparkcore入门到实战
    spark机器算法从入门到实战
    flink实时数仓从入门到实战
    github上克隆私有项目
  • 原文地址:https://www.cnblogs.com/orange2016/p/16399999.html
Copyright © 2020-2023  润新知