Словарь Python вместо switch / case

Я недавно узнал, что в python нет оператора switch / case. Я читал об использовании словарей вместо них, например, вот так:

values = { 
     value1: do_some_stuff1, 
     value2: do_some_stuff2, 
     valueN: do_some_stuffN,
}
values.get(var, do_default_stuff)()

То, что я не могу понять, - как применить это, чтобы сделать тест диапазона. Так что вместо того, чтобы делать что-то, еслиvalue1=4 скажем, делать что-то, еслиvalue1<4. Так что-то вроде этого (что я знаю, не работает):

values = { 
     if value1 <val: do_some_stuff1, 
     if value2 >val: do_some_stuff2, 
}
values.get(var, do_default_stuff)()

Я пытался сделать это с помощью операторов if / elif / else. Это работает нормально, но, похоже, идет намного медленнее по сравнению с ситуацией, когда мне вообще не нужны операторы if (что, возможно, является чем-то очевидным, неизбежным). Итак, вот мой код с оператором if / elif / else:

if sep_ang(val1,val2,X,Y)>=ROI :
    main.removeChild(source)
elif sep_ang(val1,val2,X,Y)<=5.0:
    integral=float(spectrum[0].getElementsByTagName("parameter")[0].getAttribute("free"))
    index=float(spectrum[0].getElementsByTagName("parameter")[0].getAttribute("free"))              
    print name,val1,val2,sep_ang(val1,val2,X,Y),integral,index
    print >> reg,'fk5;point(',val1,val2,')# point=cross text={',name,'}'
else:
    spectrum[0].getElementsByTagName("parameter")[0].setAttribute("free","0") #Integral
    spectrum[0].getElementsByTagName("parameter")[1].setAttribute("free","0") #Index
    integral=float(spectrum[0].getElementsByTagName("parameter")[0].getAttribute("free"))
    index=float(spectrum[0].getElementsByTagName("parameter")[0].getAttribute("free"))
    print name,val1,val2,sep_ang(val1,val2,X,Y),integral,index
    print >> reg,'fk5;point(',val1,val2,')# point=cross text={',name,'}'

Для проверки около 1500 значений переменной sep_ang требуется около 5 минут. Где, как если бы я не хотел использовать setAttribute () для изменения значений в моем XML-файле на основе значения sep_ang, я использую это просто, если еще:

if sep_ang(val1,val2,X,Y)>=ROI :
    main.removeChild(source)
else:
    print name,val1,val2,ang_sep(val1,val2,X,Y);print >> reg,'fk5;point(',val1,val2,')# point

Который занимает всего ~ 30 сек. Опять же, я знаю, что вполне вероятно, что добавление этого оператора elif и изменение значений этого атрибута неизбежно значительно увеличивает время выполнения моего кода, мне было просто любопытно, есть ли способ обойти это.

Изменить: Преимущество использования bisect по сравнению с оператором if / elif в моей ситуации, что он может проверять значения в некотором диапазоне быстрее, чем с помощью набора операторов elif?

Кажется, мне все еще нужно использовать elif-заявления. Вот так например:

range=[10,100]
options='abc' 
def func(val)
     return options[bisect(range, val)]
if func(val)=a:
     do stuff
elif func(val)=b:
     do other stuff
else:
     do other other stuff

Итак, мое утверждение elif проверяет только одно значение.

Большое спасибо за помощь, это очень ценится.

Ответы на вопрос(6)

Ваш ответ на вопрос