Вместо нескольких операторов if я хочу использовать булеву алгебру, - PullRequest
0 голосов
/ 18 декабря 2011

Я хочу использовать булеву алгебру вместо нескольких условных, например

def boo(x,y):
    if x==3 and y==1: return 4
    if x==3 and y==4: return 1
    if x==4 and y==1: return 2
    if x==4 and y==2: return 1
    if x==5 and y==1: return 3

что я хочу сделать, это

def simple(x,y):
    return x#y

и есть всего 12 уравнений, я просто хочу напрямую вернуть (x # y), где # - логический оператор. Я сделал это с меньшей проблемой, где я, к счастью, выяснил отношения. Я хочу сделать то же самое в этом случае, как мне поступить с этим?

Имеет ли это какой-либо прирост производительности, потому что он не проходит через несколько условных выражений? Это нормальная практика?

образец:

 x    y   output
 1    2     3
 1    3     2
 1    4     5
 1    5     4

здесь простые побитовые ворота xor будут делать

def(x,y): return x^y

Ответы [ 3 ]

2 голосов
/ 18 декабря 2011

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

Лучшее решение - использовать вложенный список или словарь, который можно проиндексировать с помощью входных значений. Таким образом, вы превращаете код в данные, которые являются четким и быстрым представлением вашего отображения и которые могут быть легко поняты и легко изменены в будущем.

1 голос
/ 18 декабря 2011

Я не знаю, приведет ли попытка найти более короткое выражение вышеупомянутой логики к более читаемому коду; возможно нет. Но вы можете переработать логику «как есть» в более математическую формулировку:

def boo(x, y):
    p = (x, y)
    return (1 if p in ((3, 4), (4, 2)) else
            2 if p == (4, 1) else
            3 if p == (5, 1) else
            4 if p == (3, 1) else
            None)

Другой вариант - использовать словарь:

def boo(x, y):
    return {(3,4):1, (4,2):1, (4,1):2, (5,1):3, (3,1):4}.get((x, y), None)

Если вы знаете, что все значения будут соответствовать указанным случаям, вы можете написать [(x, y)] вместо .get((x, y), None).

0 голосов
/ 18 декабря 2011

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

def boo(x,y):
    if x==3 and y==1: return 4
    if x==3 and y==4: return 1
    if x==4 and y==1: return 2
    if x==4 and y==2: return 1
    if x==5 and y==1: return 3

def boodict(x,y):
    d1 = {3: {1:4, 4:1} ,4: {1:2, 2:1},5: {1:3}}
    try:
        value = d1[x][y]
    except KeyError:
        value = None
    return value
...