Python字典而不是switch/case

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语句只检查单个值.

非常感谢您的帮助,非常感谢.

Ign*_*ams 10

字典是错误的结构.这些bisect例子展示了这种范围测试的一个例子.


Dav*_*ebb 5

虽然字典方法适用于单个值,但如果您想要范围,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

  • 我同意,虽然这是可能的,但它不是正确的解决方案。只需使用一系列 if/else 语句。代码将更容易理解和维护。 (2认同)