python实操案例__02—利用prettytable库模拟高铁售票系统

时间:2022-12-02 12:58:24

1 问题描述

设计一个简易售票系统,可循环购票并显示余票。

2 功能拆解

2.1 什么是prettytable?

PrettyTable 是python中的一个第三方库,可用来生成美观的ASCII格式的表格,本实操案例用此库完成。

基本使用

#创建表:
tb = pt.PrettyTable()

#按行/列添加数据:
tb.add_row( <llist> )
tb.add_column( <llist> )

2.2 显示初始坐席

  1. 创建列数及列名

    tb.field_names=['行号','座位1','座位2','座位3','座位4','座位5']

  2. 根据输入行数创建并显示坐席

    for i in range(row_num):
        lst=[f'第{i+1}行','有票','有票','有票','有票','有票']
        tb.add_row(lst)
    
  3. 显示坐席

    print(tb)
    

2.3 显示余票

与显示初始坐席类似,不同点在于传入的参数为售后的lst,对lst遍历

2.4 函数入口

主函数运行

2.4 订票

  1. 订票函数需要输入行数和列数;
  2. 函数对购买位置的参数设为已售;
  3. 在一个死循环中,判断是否继续购票,输入N则break跳出循环。

3 运行结果

+--------+-------+-------+-------+-------+-------+ | 行号 | 座位1 | 座位2 | 座位3 | 座位4 | 座位5 | +--------+-------+-------+-------+-------+-------+ | 第1行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第2行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第3行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第4行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第5行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第6行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第7行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第8行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第9行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第10行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第11行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第12行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第13行 | 有票 | 有票 | 有票 | 有票 | 有票 | +--------+-------+-------+-------+-------+-------+ 请输入选择的座位,如13,5表示13排5号12,2 您已成功购买第12行2座 余票显示如下: +--------+-------+-------+-------+-------+-------+ | 行号 | 座位1 | 座位2 | 座位3 | 座位4 | 座位5 | +--------+-------+-------+-------+-------+-------+ | 第1行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第2行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第3行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第4行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第5行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第6行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第7行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第8行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第9行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第10行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第11行 | 有票 | 有票 | 有票 | 有票 | 有票 | | 第12行 | 有票 | 已售 | 有票 | 有票 | 有票 | | 第13行 | 有票 | 有票 | 有票 | 有票 | 有票 | +--------+-------+-------+-------+-------+-------+ 是否继续购票y/ny

4 完整代码

import prettytable as pt
#显示坐席
def show_ticket(row_num):
    tb=pt.PrettyTable()
    tb.field_names=['行号','座位1','座位2','座位3','座位4','座位5']
    for i in range(row_num):
        lst=[f'第{i+1}行','有票','有票','有票','有票','有票']
        tb.add_row(lst)
    print(tb)
 
#订票
def order_ticket(row_num,row,column):
    print(f'您已成功购买第{row}行{column}座')
    print('余票显示如下:')
    global lst2
    lst2=[]
    for i in range(row_num):
        if int(row)==i+1:
            lst=[f'第{i+1}行','有票','有票','有票','有票','有票']
            lst[int(column)]='已售'
            lst2.append(lst)
        else:
            lst = [f'第{i + 1}行', '有票', '有票', '有票', '有票', '有票']
            lst2.append(lst)
    show(lst2)
    while True:
        anwser=input('是否继续购票y/n')
        if anwser=='y' or anwser=='Y':
            while 1:
                choose_num = input('请输入选择的座位,如13,5表示13排5号')
                try:
                    row, column = choose_num.split(',')
                    break
                except:
                    print('输入格式有误,如13排5号,应该输入13,5')
            print(f'您已成功购买第{row}行{column}座')
            j=1
            for item in lst2:
                if j <=13:
                    if int(row) == j:
                        item[int(column)] = '已售'
                    else:
                        pass
                j+=1
            print('余票显示如下:')
            show(lst2)
        else:
            break
    print('感谢您的使用')
 
 
#显示余票
def show(lst):
    tb=pt.PrettyTable()
    tb.field_names=['行号','座位1','座位2','座位3','座位4','座位5']
    for item in lst2:
        tb.add_row(item)
    print(tb)
 
 
#主函数运行
if __name__=='__main__':
    row_num=13
    show_ticket(row_num)
    while 1:
        choose_num = input('请输入选择的座位,如13,5表示13排5号')
        try:
            row,column=choose_num.split(',')
            break
        except:
            print('输入格式有误,如13排5号,应该输入13,5')
    order_ticket(row_num,row,column)