Python中,根据输入字符串的格式和内容运行函数

Python中,根据输入字符串的格式和内容运行函数,python,string-comparison,Python,String Comparison,我想我应该试着写一种测量单位转换的东西,只是为了练习。 我希望它的工作方式是给用户一个单一的输入提示,并根据字符串运行相应的函数 我只是想知道什么是最好的方式来判断字符串的格式是这样的: 数字单位 示例:30 cm-inch(这将运行名为cmtoinch的函数,将数字30作为参数传递) 我还需要能够分辨出哪个单元在另一个单元前面,因为“30厘米-英寸”会给出与“30英寸-厘米”不同的结果 我想我应该把每个单元的名称放入一个列表中,但我不知道如何将字符串与列表进行比较,以确定它是否至少包含两个值。

我想我应该试着写一种测量单位转换的东西,只是为了练习。 我希望它的工作方式是给用户一个单一的输入提示,并根据字符串运行相应的函数

我只是想知道什么是最好的方式来判断字符串的格式是这样的:

数字单位

示例:30 cm-inch(这将运行名为cmtoinch的函数,将数字30作为参数传递)

我还需要能够分辨出哪个单元在另一个单元前面,因为“30厘米-英寸”会给出与“30英寸-厘米”不同的结果


我想我应该把每个单元的名称放入一个列表中,但我不知道如何将字符串与列表进行比较,以确定它是否至少包含两个值。

根据此代码的组织,您可能希望在此处使用
globals()。我的示例使用
globals()

对字符串使用
.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]
您可以使用字典(映射),并利用元组作为键这一事实

#!/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))
#/usr/bin/python2
导入系统
def英寸2厘米(英寸):
返回英寸*2.54
def CM2英寸(厘米):
返回cm/2.54
调度表={
(“英寸”,“厘米”):英寸2厘米,
(“厘米”,“英寸”):厘米2英寸,
}
def转换器(argv):
“转换器
"""
尝试:
值=浮动(argv[1])
单位从=argv[2]
单位至=argv[3]
除了(ValueError,Indexer),例如:
印刷品
打印转换器文件__
返回2
func=DISPATCH_TABLE[(unit_from.lower()[:2],unit_to.lower()[:2])]
打印函数(值)
返回0
系统出口(转换器(系统argv))
并不是说这是进行机组转换的最佳方式,而是演示调度功能

比起从globals()中选择,我更喜欢它,因为它更明确、更安全。

这是怎么回事

class Translator():
    UNITS = [
        # length
        {
            "cm": 1.0,
            "inch": 2.54,
            "foot": 30.48,
            "rod": 502.92
        },
        # weight
        {
            "kg": 1.0,
            "pound": 0.454,
            "stone": 6.356
        },
        # liquid volume
        {
            "litre": 1.0,
            "pint": 0.473,
            "gallon": 3.785
        }
    ]

    def translate(self, val, unit1, unit2):
        for u in Translator.UNITS:
            if u.has_key(unit1) and u.has_key(unit2):
                return float(val) * u[unit1] / u[unit2]

        return "Can't convert from %s to %s" % (unit1, unit2)

    def translateString(self, str):
        args = str.split()
        if len(args)==3:
            return self.translate( float(args[0]), args[1], args[2] )
        else:
            return "Exactly three arguments required!"

def main():
    t = Translator()

    while True:
        inp = raw_input("Translate what? (hit Enter to quit) ")
        if len(inp) > 0:
            t.translateString(inp)
        else:
            break

要判断列表是否包含元素,可以使用
中的
。因此,(第1行)
L=[1,3,5]
(第2行)
如果L中有1:#做任何事
。每次添加新单元时,所需的函数数量都会增加一倍。最好有一个内部表示法(选择一个单元)并在不同的步骤中从输入单元转换到输入单元,从输入单元转换到输出单元。这意味着每个新单元只添加两个功能。你可能需要一个单位的“类型”,以防止从加仑到千克的转换:)@sje397理解,但不知道原始海报的确切要求,我准确地回答了他的问题。非常好。我还是一个新手,我想做一些像这样的东西,但是我知道怎么做,所以我决定使用函数。非常感谢。明天我得测试一下。
#!/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))
class Translator():
    UNITS = [
        # length
        {
            "cm": 1.0,
            "inch": 2.54,
            "foot": 30.48,
            "rod": 502.92
        },
        # weight
        {
            "kg": 1.0,
            "pound": 0.454,
            "stone": 6.356
        },
        # liquid volume
        {
            "litre": 1.0,
            "pint": 0.473,
            "gallon": 3.785
        }
    ]

    def translate(self, val, unit1, unit2):
        for u in Translator.UNITS:
            if u.has_key(unit1) and u.has_key(unit2):
                return float(val) * u[unit1] / u[unit2]

        return "Can't convert from %s to %s" % (unit1, unit2)

    def translateString(self, str):
        args = str.split()
        if len(args)==3:
            return self.translate( float(args[0]), args[1], args[2] )
        else:
            return "Exactly three arguments required!"

def main():
    t = Translator()

    while True:
        inp = raw_input("Translate what? (hit Enter to quit) ")
        if len(inp) > 0:
            t.translateString(inp)
        else:
            break