Jam*_*mie 2 python dictionary switch-statement
我最近了解到python没有switch/case语句.我一直在阅读有关使用字典的信息,例如:
values = {
value1: do_some_stuff1,
value2: do_some_stuff2,
valueN: do_some_stuffN,
}
values.get(var, do_default_stuff)()
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚的是如何应用它来进行范围测试.所以不要做一些事情,如果value1=4
说,做一些东西,如果value1<4.
像这样的东西(我知道不起作用):
values = {
if value1 <val: do_some_stuff1,
if value2 >val: do_some_stuff2,
}
values.get(var, do_default_stuff)()
Run Code Online (Sandbox Code Playgroud)
我试过用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,'}'
Run Code Online (Sandbox Code Playgroud)
这需要接近5分钟来检查var sep_ang的1500个值.好像我不想使用setAttribute()根据sep_ang的值更改我的xml文件中的值,我使用这个简单的if if:
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
Run Code Online (Sandbox Code Playgroud)
这只需要约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
Run Code Online (Sandbox Code Playgroud)
那么我的elif语句只检查单个值.
非常感谢您的帮助,非常感谢.
虽然字典方法适用于单个值,但如果您想要范围,if ... else if ... else if
可能是最简单的方法。
如果您正在寻找单个值,这与字典非常匹配 - 因为这是字典的用途 - 但如果您正在寻找一个范围,它就不起作用。你可以dict
使用类似的东西来做到这一点:
values = {
lambda x: x < 4: foo,
lambda x: x > 4: bar
}
Run Code Online (Sandbox Code Playgroud)
然后遍历字典中的所有键值对,传递您的值键并在键函数返回 true 时将该值作为函数运行。
但是,这不会给您带来许多if
语句的任何好处,并且更难维护和调试。所以不要这样做,而只是使用if
。
归档时间: |
|
查看次数: |
7905 次 |
最近记录: |