Python,基于输入字符串的格式和内容运行函数

2 投票
5 回答
896 浏览
提问于 2025-04-16 08:33

我想尝试写一个单位转换的小程序,主要是为了练习一下。这个程序的工作方式是,用户只需要输入一行内容,然后程序会根据这个输入来运行相应的功能。

我在想,怎么才能判断这个输入的格式是不是这样:

数字 单位 单位

比如说: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() 方法可以把字符串分割成单词(然后你可以把第一个单词转成 intfloat,根据需要来)。分割后得到的列表顺序和输入的字符串是一样的,所以你可以一个一个查看每个元素,并和你的单位参考列表进行对比。

为每种转换单独写一个函数可能不是最好的选择。相反,可以把输入转换成一个通用单位,然后再从这个通用单位转换成你想要的输出单位。为此,我们给每个单位关联一个转换因子;第一次是乘法,第二次是除法。

为了把单位名称和转换值关联起来,我们使用 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]

撰写回答