Лучшая альтернатива использованию оператора if? - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь избавиться от вредной привычки использовать if / else слишком часто.Я новичок в том, как работают функции и как правильно их вызывать, но я постоянно исследую, как правильно реализовать их с помощью своего кода.Код, который я делаю, предполагает проверку на 3 разных слова, и если слово отсутствует во входных данных, то пользователь получит утверждение, которое говорит «отклонено», если слово правильное, оно скажет «принято».Проблема, с которой я сталкиваюсь, - заставить мою программу работать правильно.До сих пор я настроил свою программу для проверки каждого индекса слова и, если он соответствует полному слову, он будет помечен как принятый.Я пытаюсь найти правильный способ добавить отклоненный флаг и избежать ошибки, которую я получаю после запуска этой программы.

def checker():
  q0 = input("enter word:")
  if (q0[0]) +(q0[1]) == "if":
    print ("accepted")
  if (q0[0]) + (q0[1]) + (q0[2]) + q0[3] == "else": 
    print("accepted")
  if(q0[0]) + (q0[1]) == "do":
    print("accepted")
  else:
    print("rejected")
checker()

Для этой программы я не собираюсь использовать словарь, поэтому я могу правильно ставить перед собой задачу и реализовывать это автоматически.Как я могу реализовать этот код без получения строкового индекса из-за ошибки диапазона.Я пытался поставить разрыв после моего заявления на печать, но это не работает.

Спасибо всем заранее.Это мой первый пост, поэтому, если я допустил какие-либо ошибки в своем посте, пожалуйста, дайте мне знать!

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

вы можете сделать это как один лайнер с функцией лямбда.

checker = lambda q: print("accepted" if q in ["elif", "if", "else"] else "rejected")
checker()

вот пример

>>> checker = lambda q: print("accepted" if q in ["elif", "if", "else"] else 
"rejected")
>>> checker("if")
accepted
>>> checker("fool")
rejected
0 голосов
/ 20 февраля 2019

Вот вам расширяемый однострочный:

def check():
    q = input().strip()
    acceptable = {'if', 'else', 'do'}
    print('accepted' if q in acceptable else 'rejected')

Переменная acceptable равна set;структура данных, которая очень быстро проверяет, есть ли что-то внутри нее.Вы можете изменить этот набор (или передать его check в качестве аргумента!), Чтобы изменить диапазон допустимых слов без изменения потока управления программой (как вы это делали в своей первоначальной реализации if / else, которую вы похвально пытаетесь)отойти от).

РЕДАКТИРОВАТЬ: Я думаю, что это не строго «один вкладыш» ...

0 голосов
/ 20 февраля 2019

Вы можете сделать это с помощью цикла for и одного оператора if, если это лучше для вас.Просто поместите все принятые значения в список и проверьте, находится ли каждое слово в q0.

def checker():
    q0 = input('enter word:')
    for i in ['if', 'else', 'do']:
        result = ('accepted' if i in q0 else 'rejected')
        if result == 'accepted':
            break
    print(result)
0 голосов
/ 20 февраля 2019

Во-первых, почему вы обращаетесь к каждому символу входной строки, затем снова соединяете их, а затем сравниваете с целевой строкой («if», «else», «do»)?

Во-вторых, почемуВы используете if операторы несколько раз, если совпадение с любым из них приведет к одному и тому же результату (print("accepted")?

Попробуйте это:

def checker():
  q0 = input("enter word:")
  if q0 in ["if", "else", "do"]:
    print("accepted")
  else:
    print("rejected")
checker()

Теперь вы просто сравниваете строкуq0 к другому (каждый элемент списка ["if", "else", "do"]). Кроме того, первое попадание в списке перестанет сравнивать и продолжит печатать "принято".

++ Просто чтобы вы знали, почему вы видите «ошибка индекса вне диапазона», вы обращаетесь к каждому символу q0, не зная, сколько их. Поэтому, если пользователь вводит строку типа a, нет q0[1] или q0[2], но вы запрашиваете у вашей программы доступ к нему. Таким образом, индекс выходит за пределы диапазона.

...