Python字典而不是switch / case [英] Python dictionary instead of switch/case

查看:115
本文介绍了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)()
pre>

我无法想像的是如何应用这个来做范围测试。因此,如果 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)<= 5.0:
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 if value1<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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆