Сопоставьте условия оператора if с предложением пользовательского ввода (уменьшите количество условий)

#python #if-statement #input #while-loop #multiple-conditions

#python #if-statement #ввод #цикл while #несколько условий

Вопрос:

Я новичок в мире Python 3, и мне нужна помощь!

Я пытаюсь создать текстовую приключенческую игру. У пользователя будет четыре варианта:

 1) You open the letter, you are too curious! 
2) You do not want to miss class, so you put it in your backpack. 
3) You think this is not real and quite ridiculous, so you throw it in the bin. 
4) You definitely want to open this together with {Friend_name}!
  

Для каждого параметра я использовал if-statements в цикле while, потому что, если случайно неверный ввод, я хочу задать вопрос еще раз. Это пример кода первых двух вариантов:

 while True:
    first_choice = input(prompt ="What is your choice?  - ")

    if first_choice == "1" or first_choice == "open" or first_choice == "letter" or first_choice == "open letter" or first_choice == "are too curious" or first_choice == "curious"
        print(f"""
        You call {Friend_name over}, who was waiting for you in the hall. 
        You rip the letter open and....""")
        break

   elif first_choice == "2"or first_choice == "do" or or first_choice == "not" or or first_choice == "miss" or or first_choice == "class" or or first_choice == "miss class" 
        print("Class turned to be very boring" )
        break
  

Несколько примеров соответствия упоминаются для вариантов 1 и 2.
Есть ли лучший способ определить различные возможные строковые условия в if-statement?
Кроме:

     if first_choice == "1" or first_choice == "open" or first_choice == "letter" or 
    first_choice == "open letter" or first_choice == "are too curious" or first_choice 
    == "curious"
  

Если да, то что мне делать, и изменится ли структура кода?
P.S, пользователь должен иметь возможность вводить что-то еще, кроме просто чисел 1 или 2. К сожалению, это требование игры.

Заранее благодарю вас!

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

1. я думаю, вам нужен анализатор, который будет обрабатывать ваш ввод

2. Некоторые вопросы: 1) Изменятся ли ваши параметры, например 1) Я открываю окно, я слишком любопытен… нравится это? 2) Это «открытое письмо» вместо «открыть письмо»?

3. @jasonwong. Таким образом, пользователь должен иметь возможность вводить все. если опция «Вы открываете письмо, вы слишком любопытны!», пользователь может ввести: открыть письмо, открыть письмо, открыть, письмо, слишком любопытно. Я чувствую, что варианты, которые они могут использовать для ссылки на первые варианты, бесконечны. Мне нужно убедиться, что Python распознает все эти параметры и назначает их правильному выбору. Поэтому задайте им вопрос типа » вы имеете в виду «……….» вместо этого это тоже сработало бы, но я понятия не имею, как это сделать.

4. @whoami мои извинения, я понятия не имею, что такое синтаксический анализатор и как его использовать. Возможно, у вас есть пример? Спасибо!

5. @EstrellaSpaans здесь ссылка, связанная с тем, что анализируется en.wikipedia.org/wiki/Parsing также взгляните на этот учебник docs.python.org/3/howto/argparse.html

Ответ №1:

Вероятно, самым простым способом сделать это было бы для каждого из вопросов поместить ожидаемые ответы в список, а затем проверить, есть ли значение в этом списке, например:

 expected_replies_1 = ['1', 'open', 'letter', 'open letter',]
first_choice = input(prompt ="What is your choice?  - ")

if first_choice in expected_replies_1:
    do stuff...
  

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

1. Спасибо! Возможно, это глупый вопрос, но как будет выглядеть elif? выделите first_choice в expected_replies_2? (другой список) Или новый оператор if внутри оператора if (вложенный)?

2. Да, та же структура в elif, что и в if.

3. Это звучит не очень хорошо, поскольку для этого требуется длинный список ожидаемых ответов, закодированных вручную. Что делать, если вы измените исходный текст или исходный текст очень длинный?

Ответ №2:

Как насчет этого? Исправляет ли это ваши потребности?

 if first_choice in ("1", "open", "letter", "open letter", "are too curious", "curious"):
    #process code
  

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

1. возможно, вы знаете, как будет выглядеть структура при втором выборе? Та же структура? Это с elif? или другой оператор if?

2. Да, вы используете if-elif-else и помещаете все свои параметры в кортеж