#python #while-loop
#python #цикл while
Вопрос:
моя проблема заключается в строках # . Я не понимаю, почему значение invalidDish всегда равно True, даже после того, как оно установлено в False в одном из операторов if .
class dishes:
def __init__(self, serial_no, dish_name, price):
self.serial_no = serial_no
self.dish_name = dish_name
self.price = price
def show_menu(self):
print(str(self.serial_no) '. ' self.dish_name 't$' self.price)
def errorMessage(code, range):
if code == 'outOfRange':
print('***Please enter number 1 - {} only***n'.format(str(range)))
machineRunning()
plain_prata = dishes(1, 'Plain prata', '0.50')
egg_prata = dishes(2, 'Egg prata', '1.00')
cheese_prata = dishes(3, 'Cheese prata', '2.50')
garlic_prata = dishes(4, 'Garlic prata', '1.50')
ham_prata = dishes(5, 'Ham prata', '2.50')
menu = [plain_prata, egg_prata, cheese_prata, garlic_prata, ham_prata]
current_order = []
def machineRunning():
while True:
print('1. Menu')
print('2. Add order')
print('3. Checkout')
value = input('Please input:')
try:
value = int(value)
if value < 1 or value > 3:
errorMessage('outOfRange', 3)
except ValueError:
print('***Please enter number 1 - 3 only***n')
continue
if value == 1:
print()
for x in range(len(menu)):
menu[x].show_menu()
elif value == 2:
dish = input('Dish name/number:')
try:
dish = int(dish) - 1
if dish < 0 or dish >= len(menu):
errorMessage('outOfRange', len(menu))
except ValueError:
loop = True
while(loop):
for x in range(len(menu)):
dish = dish.capitalize()
split_dish = dish.split()
if dish == menu[x].dish_name:
dish = int(x)
loop = False
break
else:
invalidDish = True
x = 0
############################################
while invalidDish and x < len(menu):
print (invalidDish)
print (x)
if split_dish[0] in menu[x].dish_name:
isDish = input('Are you ordering ' menu[x].dish_name '?')
print('isDish',isDish.lower())
if 'y' in isDish.lower(): #TurningPoint
print('Entered here')
invalidDish = False
print(invalidDish)
break
else: x = 1
else: x = 1
##########################################
if invalidDish:
print('***Invalid dish name***n')
dish = input('Dish name/number:')
amount = input('Amount:')
current_order.append([menu[dish].dish_name, menu[dish].price, amount])
else:
print('***Please enter number 1 - 3 only***n')
for x in current_order:
print (x)
machineRunning()
Я пытался следовать коду в терминале и все еще не могу понять проблему. Это результат терминала.
1. Menu
2. Add order
3. Checkout
Please input:2
Dish name/number:c
True
0
True
1
True
2
Are you ordering Cheese prata?y
isDish y
Entered here
False #It is set to False at this point
True #Why it becomes True again at the beginning of the loop?
0
True
1
PS. Я изучаю python, пытаясь создать кассовый аппарат для ресторана с еженедельной, ежемесячной сводкой, расчетом прибыли и т. Д. Любые предложения о том, что я могу сделать дальше, чтобы сделать это более удобным для пользователя? Как python взаимодействует с другим программным обеспечением или кодом, делая интерфейс простым в использовании?
Комментарии:
1. Это та проблема, когда вам действительно было бы полезно пошагово выполнить ее в отладчике. Отладка — одна из самых основных, фундаментальных и важных вещей, которые любой программист должен знать, как делать, и это всегда должно быть первым, что вы делаете.
2. Вы смотрите на неправильный цикл while. Если я не ошибаюсь, ваш код работает нормально, но поскольку у вас есть вложенные циклы while, внешний цикл
invalidDish
возвращается кTrue
Ответ №1:
Вы выходите из цикла while, затем снова выполняете цикл, используя внешний цикл for , который затем устанавливает значение invalidDish в True .