Использование for-loop для выбора из указанного списка (без циклов while)

#python #for-loop #while-loop

#python #for-цикл #цикл while

Вопрос:

Я хочу выполнить то же самое с for циклами

 menu=['salad','becon','pizza','burger','fries']

choosen_menu=''
while choosen_menu not in menu:
    print('choose something')
    choosen_menu= input()
    if choosen_menu == 'None':
        print('not hungry')
        break
else:
    print('the {} is arriving'.format(choosen_menu))
  

Комментарии:

1. Зачем здесь использовать цикл for? циклы for ожидают начала и окончания, тогда как вы можете продолжать запрашивать, пока входные данные не будут правильными, используя цикл while

2. for циклы действительно предназначены для того, когда вы хотите выполнить итерацию по набору объектов. Есть способы превратить for цикл по существу в while True: петлю, но от этого изменения ничего не выиграешь.

Ответ №1:

Цикл while кажется концептуально правильным для вашего варианта использования, но если вы действительно хотите, вы можете преобразовать его в этот эквивалентный цикл for:

 from functools import partial
menu = {'salad', 'bacon', 'pizza', 'burger', 'fries'}
for chosen in iter(partial(input, 'choose somethingn'), 'None'):
    if chosen in menu:
        print('the {} is arriving'.format(chosen))
        break
else:
    print('not hungry')
  

При этом используются некоторые продвинутые концепции, такие как форма с двумя аргументами iter() , которая используется редко, и partial функтор для частичного применения функции, поэтому единственное, чего это достигает, — это усложняет чтение кода. В остальном он работает более или менее точно так же, как ваша исходная версия, с теми же проблемами удобства использования.

Ответ №2:

Я не предлагаю использовать for loop для вашего случая, но это даст вам то, что вы хотите:

 from itertools import count
menu=['salad','becon','pizza','burger','fries']

choosen_menu=''


for i in count(0):
    print('choose something')
    choosen_menu= input()
    if choosen_menu == 'None':
        print('not hungry')
        break
    elif choosen_menu not in menu:
        pass
    else:
        print('the {} is arriving'.format(choosen_menu))
        break
  

Комментарии:

1. @Kowalski Ты видишь правку? Я думаю, что теперь это хорошо.

2. Это будет повторяться максимум 100 раз. В коде OP это может зацикливаться вечно. Также это пример того, почему мы не должны использовать здесь цикл for и должны использовать while вместо этого.

3. Уменьшение при вводе чего-либо, чего нет в меню, приведет к бесконечному циклу?

4. Внимательно посмотрите на эту часть: while choosen_menu not in menu: .

5. Я знаю, что лучше всего использовать while, но вместо этого OP хочет использовать цикл for.