2016-09-06 4 views
0

Я хотел бы создать функцию python, которая после предоставления двух значений int вернет строку сравнения. Существуют очевидные пути использования блоков if или for и while. Мне просто интересно узнать наилучшее решение.Как вернуть оператор сравнения на основе предоставленных двух значений?

def get_comparison_operator(a, b): 
    if a == b: 
     op = '==' 
    elif a > b: 
     op = '>' 
    # ... etc 
    return op 

Простой if-else блок будет работать в задаче различения между == и <= или >= так, вероятно, я бы с for петлю с break. Однако, как я уже говорил, я стараюсь изучить эффективный способ сделать это, если таковой имеется.

+1

Вы делаете довольно прав, как будто-else - единственный способ. Вы даже можете сделать это с помощью циклов, но это сделает ваш код компактным и неэффективным. If-else - это самый простой способ выполнения подобных сравнений. –

+0

Постарайтесь, логика '' '... различения == и <= or > = ...' '' должна быть легко реализована. – wwii

+0

Если вы уже указали == и <, почему у вас есть другой случай для <= вообще? – RemcoGerlich

ответ

4

Вы можете использовать модуль operator, чтобы уменьшить количество строк, но в конце дня вам необходимо сохранить список операций для проверки.

import operator 

operators = [operator.eq, operator.lt, operator.gt, operator.ne] 
labels = ["==", "<", ">", "!="] 

def get_comparison_operator(a, b): 
    for op, label in zip(operators, labels): 
     if op(a, b): 
      return label 
    return None 

Очевидно проверить порядок имеет решающее значение здесь, если больше равно проверяется перед большей, второй не будет иметь изменение, которое будет возвращено.

Альтернативная форма со списком кортежей, я должен сказать, что табличная форма выглядит очень красиво.

import operator 

operators = [ 
    (operator.eq, "=="), 
    (operator.lt, "<"), 
    (operator.gt, ">"), 
    (operator.ne, "!=") 
] 

def get_comparison_operator(a, b): 
    for op, label in operators: 
     if op(a, b): 
      return label 
    return None 

Очевидно, экв/л/GT довольно тривиально, так как 3 возможности охватывает 100% случаев, и они взаимно исключают друг друга. Возможно, для некоторых более странных операторов этот подход имеет больше смысла.

+1

Чтобы было понятнее, какая метка принадлежит оператору, я бы сохранил их в одной переменной вместо двух, которые затем застегиваются вместе, например. 'Операторы = [(operator.eq, "=="), (operator.lt, "<"), ...]', но это довольно спорный вопрос. – RemcoGerlich

+0

Dict - это первый вариант для хранения пар, но он будет гарантировать заказ. Конечно, список кортежей также является допустимым подходом. –

+1

«так как 3 возможности покрывают 100% случаев» - не совсем 100%. Если один или оба операнда являются 'float (" nan ")', то только '! =' Вернет true. – Dunes