Python 如何减少elif语句
我的脚本运行C程序digitemp。输出以包含传感器ID和温度的行为单位。我需要将传感器ID与一个特定的名称匹配,从而匹配所有的ELIF。我在本例中使用了first、second和third作为计算ID的名称。有没有办法减少所有的elif语句,因为还有更多的语句需要添加Python 如何减少elif语句,python,Python,我的脚本运行C程序digitemp。输出以包含传感器ID和温度的行为单位。我需要将传感器ID与一个特定的名称匹配,从而匹配所有的ELIF。我在本例中使用了first、second和third作为计算ID的名称。有没有办法减少所有的elif语句,因为还有更多的语句需要添加 import os # get digitemps output cmd = "/bin/digitemp_ -c /bin/digitemp.conf -q -a" def digitemps(): for out
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()
使用字典将传感器ID映射到人类可读的名称:
id_to_name = {"28F4F525030000D1": "first",
"28622A260300006B": "second",
"28622A2603000080", "third"}
print id_to_name.get(outline[0], outline[0]) + outline[1]
这种方法的优点是,如果没有为ID分配人类可读的名称,那么
get
方法将返回ID而不做任何更改。不幸的是,Python无法这样做。如果你使用C++,你可以使用开关语句,但是Python没有这样的均衡。对不起 循环中的大多数逻辑可以使用生成器表达式编写,这是等效的代码,并考虑了@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
有点离题:为什么你更喜欢dict(元组)而不是literal?反斜杠绝对没用。除此之外(我想这就是贝雷尔的意思)
{“28f4f52530000d1”:“first”,…}
是更常见、更易读的语法。这是无效的语法dict
将接受一个元组的iterable,但在编写时它将引发一个TypeError:dict最多需要1个参数,得到3个
异常。@delnan:是的,这可能是一个选项,当然。我的错。1:你不需要.readlines()
在这里;没有它,代码也能正常工作。旁白#2:你不需要[:-1]
.split()
将自动去除尾随的空白,而且[:-1]
通常有点危险,因为有时文件在最后一行缺少CR。[例如,在Python中,人们有时会执行类似于“\n”的操作。join(一些字符串)
,它不会添加尾随\n
]@l4mpi:Ummm…链接显示提案被拒绝了。。。???如果真的有,我会很高兴的。一个切换语句!l4mpi并没有说您对缺少switch语句的看法是错误的,但您的结论是错误的——还有其他可能的改进(其中一些改进甚至比switch
更有效)。@delnan:哪些改进?我一直在寻找wlid替代方案,我很好奇你知道哪些替代方案。正如l4mpi所说,看看其他答案。