Python,基于输入字符串的格式和内容运行函数
我想尝试写一个单位转换的小程序,主要是为了练习一下。这个程序的工作方式是,用户只需要输入一行内容,然后程序会根据这个输入来运行相应的功能。
我在想,怎么才能判断这个输入的格式是不是这样:
数字 单位 单位
比如说:30 cm inch(这会运行一个叫cmtoinch的函数,并把数字30作为参数传进去)。
我还需要能够判断哪个单位在前面,因为“30 cm inch”和“30 inch cm”会得到不同的结果。
我在考虑把每个单位的名称放到一个列表里,但我不知道怎么把输入的字符串和这个列表进行比较,以查看它是否至少包含两个单位。
5 个回答
2
你可以使用字典(映射),并利用元组作为键的特点。
#!/usr/bin/python2
import sys
def inch2cm(inches):
return inches * 2.54
def cm2inch(cm):
return cm / 2.54
DISPATCH_TABLE = {
("in", "cm"): inch2cm,
("cm", "in"): cm2inch,
}
def converter(argv):
"""converter <value> <from unit> <to unit>
"""
try:
value = float(argv[1])
unit_from = argv[2]
unit_to = argv[3]
except (ValueError, IndexError), ex:
print ex
print converter__doc__
return 2
func = DISPATCH_TABLE[(unit_from.lower()[:2], unit_to.lower()[:2])]
print func(value)
return 0
sys.exit(converter(sys.argv))
并不是说这是做单位转换的最佳方法,只是用来演示如何调用不同的函数。
我觉得这种方法比从全局变量中选择要好,因为它更明确也更安全。
3
根据这段代码的结构,你可能想用 globals()
、<modulename>.__dict__
或者 getattr(obj)
。我的例子中用了 globals()
。
def cmtoinch(x):
return x / 2.54
def inchtocm(x):
return x * 2.54
def convert(input):
num, unit1, unit2 = input.split()
func = unit1 + "to" + unit2
if func in globals():
return globals()[func](float(num))
else:
raise NotImplementedException()
4
使用 .split()
方法可以把字符串分割成单词(然后你可以把第一个单词转成 int
或 float
,根据需要来)。分割后得到的列表顺序和输入的字符串是一样的,所以你可以一个一个查看每个元素,并和你的单位参考列表进行对比。
为每种转换单独写一个函数可能不是最好的选择。相反,可以把输入转换成一个通用单位,然后再从这个通用单位转换成你想要的输出单位。为此,我们给每个单位关联一个转换因子;第一次是乘法,第二次是除法。
为了把单位名称和转换值关联起来,我们使用 dict
。这样我们就可以直接通过输入名称来查找转换值。
conversion_rates = {
'in': 2.54, # 2.54 inches in a centimetre
'cm': 1.00, # this is our reference unit
'sun': 3.03 # a traditional Japanese unit of measurement
}
# raises ValueError if the number of words in the input is wrong
amount, original_unit, final_unit = line.split()
# raises ValueError if the amount is not formatted as a floating-point number
amount = float(amount)
# Now we do the conversion.
# raises KeyError if either unit is not found in the dict.
result = amount * conversion_rates[original_unit] / conversion_rates[final_unit]