Я недавно узнал, что в 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,'}'
Это занимает около 5 минут для проверки около 1500 значений переменной sep_ang. Где, как будто я не хочу использовать 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 и изменение значений этого атрибута неизбежно значительно увеличивает время выполнения моего кода, мне просто было любопытно, есть ли способ обойти это.
Edit:
Преимущество использования 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 проверяет только одно значение.
Большое спасибо за помощь, она очень ценится.