python每日一问

families,谁懂啊,看起来没问题的代码,但是为啥运行不出来,主要是测试的时候感觉有些代码块没运行,尤其是break和continue语句


```python


#点餐小程序
ordered_meanu=dict()#记录已经点过的菜品及数量
meanu={'地道雪花鱼':68,'宣威小炒肉':28,'滇西小炒鸡':46,'杨林酸菜鱼':68,'鸡汁豆腐花':22,'丽江紫洋芋':18,'白芸豆火腿':58,'菜包肉':15,'野生菌':53,'玉米汁':23,'米饭':10}
price=0#总计
#点菜
def order():
        a=input('请选择进入点菜或加菜(按1)或者退出点菜界面(按2):')
        while True:
                
                if a==1:#进入点菜
                        key=input("请点菜:")
                        val=int(input('请选择份数:'))
                        if key not in ordered_meanu.keys():#初次点菜
                                if key not in meanu:
                                        print('本店没有这个菜品,请看看其他菜')#对于客户输入错误提醒
                                else:
                                        ordered_meanu[key]=val
                        else:                           #加菜
                                ordered_meanu[key]+=val
                elif a==2:                  #退出点菜
                        break
        return 0

#退菜
def cancel_order():
        a=int(input('请选择退菜(按1)或者退出退菜界面(按2):'))
        while True:
                
                if a==1:           #进入退菜
                        key=input('客官您要退的菜品:')
                        val=int(input('要退几份:'))
                        if key not in ordered_meanu.keys():
                                print('客官您还没有点过此菜')
                        else:                           #退菜
                                ordered_meanu[key]-=val
                                if ordered_meanu[key]==0:    #菜全退完从点单中除去
                                        del ordered_meanu[key]
                elif a==2:      #结束退菜
                        break
                a=int(input('请选择退菜(按1)或者退出退菜界面(按2):'))
        return 0

#查看已点菜单
def check():
        print('客官以下是您点的菜以及总计:')
        global price
        for key in ordered_meanu.keys():
                print(key+':'+string(ordered_meanu[key]))
                price+=ordered_meanu[key]*meanu[key]#计算总和
                print('共计'+':',price)

#后台厨师看到的餐桌以及菜单
def show(number):
        num=number
        print('桌号:',num)
        for key in ordered_meanu.keys():
                print(key+':'+string(ordered_meanu[key]))
        return 0

stri='''------------------------------
【欢迎光临本店点餐小程序】
请选择您需要的服务:
1、点餐
2、退菜
3、查看菜单
4、退出
---------------------------
在此之前请选择您的座位号'''
print(stri)
num=input('请输入座位号:')
a=int(input('请输入选项:'))
while True:
        
        if a==1:
                order()
                continue
        
        elif a==2:
                cancel_order()
                continue
        
        elif a==3:
                check()
                continue
        elif a==4:
                exit()
        a=int(input('请输入选项:'))
                
show(num)          
      
        
        

        
        

                
                        
                        
        
        
        

```


  • “点餐小程序”主界面

    img

  我重新调整了显示界面,把餐馆的菜品供应列表存入磁盘文本,启动“小程序”时计入内存生成 cuisine_dict ,重新设计了已点餐字典 ordered_dict ,以餐台号 table_num 为 key ,value 为 (cuisine, number) 元素的列表,只记录菜名和份数,单价从“供应菜品”字典 cuisine_dict 读取。循环点餐,只输入菜名序号,一份直接回车。大大方便点餐了输入。

  • 餐馆供应菜品列表文本文件

    img

  • 读取代码

# 全局变量
mypath = r'/sdcard/Documents/'
ordered_dict = dict() # 记录已经点过的菜品及数量字典初值——空字典。
cuisine_dict = {i[0]: int(i[1]) for i in (i.split('\\') for i in open(f"{mypath}cuisine_list.txt").read().split('\n')[1:])} # 解析式生成供应菜品字典。(从磁盘文本读取菜品供应列表,格式为生成器——解析式用小括号包裹。)
#input(cuisine_dict) # 调试用语句。
clear = '\033[2J' # 清屏字符串。
error_tip = f"\n{' 输入错误!':^45}\n" #  输入错误提示信息字符串。
  • 点餐小程序,代码运行效果截屏图片

    img


    img


    img


    img



0、 input() 获取的是字符段,而您 if 条件判断却用的是整型 if a == 1 。这是导致您的菜单选择不起作用的直接原因。
1、退出模块函数,用 return ,break 是退出循环。
2、Python 默认4个英文空格缩进,您有8个,缩进太深。
3、点餐时没有菜品清单列印,怎么选?
4、餐馆餐台,得给设定个范围吧
5、最好把主程序也设计成模块,看着更好

我明天抽时间给您调试一下……


  我给加了个菜品列表显示。要是把点菜设计成只输入菜名列表序号,点餐更方便。餐台号,得给定范围才好。



#!/sur/bin/nve python
# coding: utf-8

'''

点餐小程序

'''


ordered_meanu = dict() # 记录已经点过的菜品及数量
meanu = {'地道雪花鱼':68,'宣威小炒肉':28,'滇西小炒鸡':46,'杨林酸菜鱼':68,'鸡汁豆腐花':22,'丽江紫洋芋':18,'白芸豆火腿':58,'菜包肉':15,'野生菌':53,'玉米汁':23,'米饭':10}


def show_meanu(meanu):
    ''' 菜单列印 '''
    print(f"\n{' 本店特供菜品 ':~^44}\n")
    
    for key, value in meanu.items():
        print(f"{'¥':>12}{value:.2f} {'_'*6} {key}")

    print(f"\n{'~'*50}\n")


def order():
        ''' 点菜 '''
        
        a = input(f"{'1、点菜或加菜  2、退出点菜界面':^37}\n{'~'*50}\n{'请选择:':>18}")
        while True:
                show_meanu(meanu)
                if a=='1':#进入点菜
                        key=input("请点菜:")
                        if not key:

                            if not ordered_meanu:
                                print(f"\n{' 您还没有点菜呢!':^42}")
                            else:
                                break # 退出点菜循环。

                        val=int(input('请选择份数:'))

                        if key not in meanu:
                                print('本店没有这个菜品,请看看其他菜')#对于客户输入错误提醒

                        else:                           #加菜
                                ordered_meanu[key] = ordered_meanu.get(key, 0) + val # 新点或加菜数量累加,get(key) 值为 None 时,令其为 0 ,换句话说就是 key 不在字典中,加入 key 并令其值为 0 。
                elif a=='2':                  #退出点菜
                        check()
                        return # 退出此模块不可以用 break,这是退出循环。
                else:
                        print(f"\n{' 选择错误!':^45}")
                        return 

        # return 0 # python 函数可以不写返回语句,默认返回 None。




def cancel_order():
        ''' 退菜 '''
        while True:
                check()
                a=int(input('请选择退菜(按1)或者退出退菜界面(按2):'))

                if a==1:           #进入退菜
                        key=input('客官您要退的菜品:')
                        val=int(input('要退几份:'))
                        
                        if key not in ordered_meanu.keys():
                                print('客官您还没有点过此菜')
                        else:                           #退菜
                                ordered_meanu[key]-=val
                                if ordered_meanu[key]==0:    #菜全退完从点单中除去
                                        del ordered_meanu[key]

                elif a==2:      #结束退菜
                        return 
                else:
                        print(f"\n{' 选择错误!':^45}")                    

        #return 0 # 对于 Python 函数无需返回值时,此句可以不写,函数默认返回空值 None 。


def check():
        ''' 查看已点菜单 '''
        price=0 # 总计初值。
        print('\n客官以下是您点的菜以及总计:')

        for key in ordered_meanu.keys():
                #print(key+':'+string(ordered_meanu[key])) # 转字符型函数是 str 。
                print(key+':'+str(ordered_meanu[key])) # 转字符型函数是 str 。

                price+=ordered_meanu[key]*meanu[key]#计算总和
                print('共计'+':',price)


def show(number):
        ''' 后台厨师看到的餐桌以及菜单 '''
        num=number
        print('桌号:',num)
        for key in ordered_meanu.keys():
                print(key+':'+string(ordered_meanu[key]))
        return 0



'''if __name__ == '__main__':
    show_meanu(meanu)
    order()

input(55555) # 程序暂停。'''



stri='''------------------------------
【欢迎光临本店点餐小程序】
请选择您需要的服务:
1、点餐
2、退菜
3、查看菜单
4、退出
---------------------------
在此之前请选择您的座位号''

num=input('\n请输入座位号:')

while True:
        print(stri)
        a = input('请输入选项:')
        if a=='1':
                order()
        elif a=='2':
                cancel_order()
        elif a=='3':
                check()
        elif a=='4':
                exit()
        else:
                print(f"\n{' 选择错误!':^45}")
          
show(num)       
                   

  • 代码运行效果截屏图片

    img


我曾经的学习笔记——

转字符串是str方法,而不是你写的string.
其次 a =input('请选择进入点菜或加菜(按1)或者退出点菜界面(按2):')这里得到的是一个字符串,要转为int 且要放在while循环中
把continue删除掉才可以继续输入。
最终代码:



# 点餐小程序
ordered_meanu = dict()  # 记录已经点过的菜品及数量
meanu = {'地道雪花鱼': 68, '宣威小炒肉': 28, '滇西小炒鸡': 46, '杨林酸菜鱼': 68, '鸡汁豆腐花': 22, '丽江紫洋芋': 18, '白芸豆火腿': 58, '菜包肉': 15,
         '野生菌': 53, '玉米汁': 23, '米饭': 10}
price = 0  # 总计


# 点菜
def order():

    while True:
        a = int(input('请选择进入点菜或加菜(按1)或者退出点菜界面(按2):'))
        if a == 1:  # 进入点菜
            key = input("请点菜:")
            val = int(input('请选择份数:'))
            if key not in ordered_meanu.keys():  # 初次点菜
                if key not in meanu:
                    print('本店没有这个菜品,请看看其他菜')  # 对于客户输入错误提醒
                else:
                    ordered_meanu[key] = val
            else:  # 加菜
                ordered_meanu[key] += val
        elif a == 2:  # 退出点菜
            print('点菜结束!')
            break
    return 0


# 退菜
def cancel_order():
    a = int(input('请选择退菜(按1)或者退出退菜界面(按2):'))
    while True:

        if a == 1:  # 进入退菜
            key = input('客官您要退的菜品:')
            val = int(input('要退几份:'))
            if key not in ordered_meanu.keys():
                print('客官您还没有点过此菜')
            else:  # 退菜
                ordered_meanu[key] -= val
                if ordered_meanu[key] == 0:  # 菜全退完从点单中除去
                    del ordered_meanu[key]
        elif a == 2:  # 结束退菜
            break
        a = int(input('请选择退菜(按1)或者退出退菜界面(按2):'))
    return 0


# 查看已点菜单
def check():
    print('客官以下是您点的菜以及总计:')
    global price
    for key in ordered_meanu.keys():
        print(key + ':' + str(ordered_meanu[key]))
        price += ordered_meanu[key] * meanu[key]  # 计算总和
        print('共计' + ':', price)


# 后台厨师看到的餐桌以及菜单
def show(number):
    num = number
    print('桌号:', num)
    for key in ordered_meanu.keys():
        print(key + ':' + str(ordered_meanu[key]))
    return 0


stri = '''------------------------------
【欢迎光临本店点餐小程序】
请选择您需要的服务:
1、点餐
2、退菜
3、查看菜单
4、退出
---------------------------
'''
print(stri)
print('在此之前请选择您的座位号')
num = input('请输入座位号:')
a = int(input('请输入选项:'))
while True:

    if a == 1:
        order()

    elif a == 2:
        cancel_order()

    elif a == 3:
        check()
    elif a == 4:
        exit()

    print(stri)
    a = int(input('请输入选项:'))

show(num)