问题描述
最近我知道python没有switch / case语句。我一直在阅读关于如何使用字典,例如:values = {
pre>
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,
如果value2> val:do_some_stuff2,
}
values.get(var,do_default_stuff)()
我试过这样做if / elif / else语句。它工作得很好,但是似乎比不需要if语句(这可能是明显的事情是不可避免的)的情况要慢得多。所以这里是我的代码与if / elif / else语句:
如果sep_ang(val1,val2,X,Y)> = ROI:
main.removeChild(source)
elif sep_ang(val1,val2,X,Y) integral = float(spectrum [0] .getElementsByTagName(parameter )[0] .getAttribute(free))
index = float(spectrum [0] .getElementsByTagName(parameter)[0] .getAttribute(free))
打印名称, val1,val2,sep_ang(val1,val2,X,Y),积分,索引
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
积分= float(spectrum [0] .getElementsByTagName(parameter)[0] .getAttribute(free))
index = float(spectrum [0] .getElementsByTagName(parameter)[0] getAttribute(free))
打印名称,val1,val2,sep_ang(val1,val2,X,Y),整数,索引
print>> reg,'fk5; point(',val1,val2,')#point = cross text = {',name,'}'
需要接近5分钟才能检查var sep_ang的大约1500个值。在那里,如果我不想使用setAttribute()根据sep_ang的值更改我的xml文件中的值,我使用这个简单的if else:
如果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:
做其他的东西
else:
做其他的东西
那么我的elif声明只是检查一个单一的值。
非常感谢您的帮助,非常感谢。
解决方案最后弄清楚该怎么做!
所以,而不是使用一堆elif语句,我做到了:
range = [10,100]
options ='abc'
def func(val)
choose = str [bisect(range,val)])
exec choose +()
def a():
do_stuff
def b():
do_other_stuff
def c():
do_other_other东西
它不仅工作,而且几乎跟我原来的4升一样快ine代码,我不会改变任何价值的东西!
I've recently learned that python doesn't have the switch/case statement. I've been reading about using dictionaries in its stead, like this for example:
values = { value1: do_some_stuff1, value2: do_some_stuff2, valueN: do_some_stuffN, } values.get(var, do_default_stuff)()
What I can't figure out is how to apply this to do a range test. So instead of doing some stuff if
value1=4
say, doing some stuff ifvalue1<4.
So something like this (which I know doesn't work):values = { if value1 <val: do_some_stuff1, if value2 >val: do_some_stuff2, } values.get(var, do_default_stuff)()
I've tried doing this with if/elif/else statements. It works fine but it seems to go considerably slower compared to the situation where I don't need the if statements at all (which is maybe something obvious an inevitable). So here's my code with the if/elif/else statement:
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,'}'
Which takes close to 5 min for checking about 1500 values of the var sep_ang. Where as if I don't want to use setAttribute() to change values in my xml file based on the value of sep_ang, I use this simple if else:
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
Which only takes ~30sec. Again I know it's likely that adding that elif statement and changing values of that attribute inevitably increases the execution time of my code by a great deal, I was just curious if there's a way around it.
Edit:Is the benefit of using bisect as opposed to an if/elif statement in my situation that it can check values over some range quicker than using a bunch of elif statements?
It seems like I'll still need to use elif statements. Like this for example:
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
So then my elif statement are only checking against a single value.
Thanks much for the help, it's greatly appreciated.
解决方案Finally figured out what to do!
So instead of using a bunch of elif statements I did this:
range=[10,100] options='abc' def func(val) choose=str(options[bisect(range,val)]) exec choose+"()" def a(): do_stuff def b(): do_other_stuff def c(): do_other_other stuff
Not only does it work but it goes almost as fast as my original 4 line code where I'm not changing any values of things!
这篇关于Python字典而不是switch / case的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!