如何减少elif语句

时间:2013-04-14 19:44:14

标签: python

我的脚本运行C程序digitemp。输出包含传感器ID和温度的行。我需要将传感器ID与特定名称匹配,从而将所有elifs匹配。我在这个例子中使用了第一个,第二个第三个作为ID的数学名称。有没有办法减少所有elif语句,因为还有更多要添加的内容?

import os

# get digitemps output
cmd = "/bin/digitemp_ -c /bin/digitemp.conf -q -a"

def digitemps():
    for outline in os.popen(cmd).readlines():
        outline = outline[:-1].split()
        if outline[0] == '28F4F525030000D1':
            temp_ = outline[1]
            print 'first ' + temp_
        elif outline[0] == '28622A260300006B':
            temp_ = outline[1]
            print 'second ' + temp_
        elif outline[0] == '28622A2603000080':
            temp_ = outline[1]
            print 'third ' + temp_

digitemps()

3 个答案:

答案 0 :(得分:4)

使用字典从传感器ID映射到人类可读的名称:

id_to_name = {"28F4F525030000D1": "first",
              "28622A260300006B": "second",
              "28622A2603000080", "third"}
print id_to_name.get(outline[0], outline[0]) + outline[1]

这种方法的优点是,如果没有为其分配人类可读的名称,get方法将返回ID而不做任何更改。

答案 1 :(得分:0)

循环中的大多数逻辑都可以使用生成器表达式编写,这是代码是等效的,并在评论中考虑了@ DSM的建议:

d = {'28F4F525030000D1':'first ',
     '28622A260300006B':'second ',
     '28622A2603000080':'third '}

def digitemps():
  for s in (d.get(x[0],x[0]) + x[1] for x in (e.split() for e in os.popen(cmd))):
    print s

答案 2 :(得分:-2)

不幸的是,Python无法这样做。如果您使用的是C ++,那么您可以使用switch语句,但Python没有这样的平等。遗憾!