2010-10-03 3 views
1

У меня очень длинный условный оператор для определения того, какое действие нужно предпринять для пары переменных a и b.Рефакторинг длинного оператора в Python

action = 0 if (a==0) else 1 if (a>1 and b==1) else 2 if (a==1 and b>1) else 3 if (a>1 and b>1) else -1 

В то время как это хорошо с компактностью (в строках;)) этого утверждения, оно должно существовать более элегантный способ сделать это?

ответ

9
if a==0: 
    action = 0 
elif a>1 and b==1: 
    action = 1 
elif a==1 and b>1: 
    action = 2 
elif a>1 and b>1: 
    action = 3 
else: 
    action = -1 

Из Zen of Python (выдержки):

Simple is better than complex. 
Flat is better than nested. 
Readability counts. 
+0

Скобки также не нужны. – AndiDog

+0

@ AndiDog: Спасибо, я даже не посмотрел на них :) –

+0

Эта форма также значительно упрощает просмотр случая '(a == 1 и b == 1)'. – PaulMcG

2

Если б оба имеют известные, маленькие, целые диапазоны, вы могли бы сделать Dict. Скажем, они оба всегда 0,1 или 2:

actionTable = { (0,0): 0, (0,1): 0, (0,2): 0, 
       (1,0):-1, (1,1):-1, (1,2): 2, 
       (2,0):-1, (2,1): 1, (2,2): 3 } 

return actionTable[ (a,b) ] 

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

+0

Мне нравится идея таблицы поиска, однако, a и b могут (теоретически) брать произвольные большие значения. Однако я сохраню его в памяти. – Theodor

Смежные вопросы