如何在Python中将磅转换为千克

1 投票
2 回答
16481 浏览
提问于 2025-04-16 16:04

我正在尝试根据输入的数值打印出磅或千克的结果,这是我的代码:

def conversion():
    amount = input("Please specify the amount: ")
    if type(amount) is int:
        print "derp"
    answer = raw_input("Please choose between converting FROM kilograms/pounds: ")
    if answer == "kilograms":
        return amount * 2.2 
    elif answer == "pounds":
        return amount / 1.45
    else:
        print "Please choose between kilograms and pounds."
        restart = raw_input("Try again? ")
        if restart == "yes":
            conversion()
            return 0
        elif restart == "y":
            conversion()
            return 0 
        else:
            print "Okay, bye."
            return
finalresult = conversion()
print "the final result is", finalresult

2 个回答

1

这是一个稍微复杂一点但灵活性更强的版本:

units = {
    'kg':          ('weight', 1.),
    'kilo':        ('weight', 1.),
    'kilogram':    ('weight', 1.),
    'lb':          ('weight', 2.204),
    'pound':       ('weight', 2.204),
    'tonne':       ('weight', 0.001),
    'carat':       ('weight', 5000.),
    'gram':        ('weight', 1000.),
    'dram':        ('weight', 564.4),
    'ounce':       ('weight', 35.27),
    'grain':       ('weight', 15430.),
    'm':           ('distance', 1.),
    'meter':       ('distance', 1.),
    'kilometer':   ('distance', 0.001),
    'km':          ('distance', 0.001),
    'centimeter':  ('distance', 100.),
    'cm':          ('distance', 100.),
    'meter':       ('distance', 1.),
    'mile':        ('distance', 0.0006214),
    'chain':       ('distance', 0.04971),
    'furlong':     ('distance', 0.004971),
    'league':      ('distance', 0.0002071),
    'foot':        ('distance', 3.281),
    'feet':        ('distance', 3.281),        # irregular plural - must be explicitly specified!
    'inch':        ('distance', 39.37)
}

def getUnit(unit_name):
    if unit_name in units:
        return units[unit_name]
    # recognize regular plural forms
    elif unit_name.endswith('es') and unit_name[:-2] in units:
        return units[unit_name[:-2]]
    elif unit_name.endswith('s') and unit_name[:-1] in units:
        return units[unit_name[:-1]]
    # not found?
    else:
        raise ValueError("Unrecognized unit '{0}'".format(unit_name))

def convert(amt, from_unit, to_unit):
    typeA, numA = getUnit(from_unit)
    typeB, numB = getUnit(to_unit)

    if typeA==typeB:
        return amt * numB / numA
    else:
        raise ValueError("Units are of different types ('{0}' and '{1}')".format(typeA, typeB))

def conversion(s):
    """
    Do unit conversion

    Accepts a string of the form
        "(number) (unitA) [to] (unitB)"

    If unitA and unitB are of the same unit-type, returns the converted value.
    """
    s = s.strip().lower().split()
    if len(s) not in (3, 4):
        raise ValueError("Argument string has wrong number of words (should be three or four)")
    try:
        amt = float(s[0])
    except ValueError:
        raise ValueError("Argument string must start with a number")
    from_unit = s[1]
    to_unit   = s[-1]
    return convert(amt, from_unit, to_unit)

def tryAgain():
    s = raw_input('Try again (Y/n)? ').strip().lower()
    return 'yes'.startswith(s)

def main():
    while True:
        s = raw_input("Convert what? (ex: 10 meters to feet) ")
        try:
            print(": {0}".format(conversion(s)))
        except ValueError, v:
            print v
        if not tryAgain():
            break

if __name__=="__main__":
    main()

这个可以解决像“10吨转换成盎司”或者“30弗隆转换成英尺”这样的问题。

建议进一步添加的内容:

  1. 添加纳米作为距离单位(并进行测试)。

  2. 添加短吨和石头作为重量单位(并进行测试)。

  3. 添加升、品脱和桶作为体积单位(并进行测试)。

2

当你想从一个Python函数中返回多个数据时,可以用一个元组来同时返回这些数据:

return (amount * 2.2, "pounds")

或者

return (amount / 2.2, "kilograms")

稍微修改一下你的函数:

def conversion():
    amount = input("Please specify the amount: ")
    if type(amount) is int:
        print "derp"
    answer = raw_input("Please choose between converting FROM kilograms/pounds: ")
    if answer == "kilograms":
        return (amount * 2.2, "pounds")
    elif answer == "pounds":
        return (amount / 2.2, "kilograms")
    else:
        print "Please choose between kilograms and pounds."
        restart = raw_input("Try again? ")
        if restart == "yes":
            conversion()
            return 0
        elif restart == "y":
            conversion()
            return 0 
        else:
            print "Okay, bye."
            return
finalresult = conversion()
print "the final result is: ", finalresult[0], finalresult[1]

注意,我还修正了你的英镑转千克的计算方法:

$ python /tmp/convert.py 
Please specify the amount: 10
derp
Please choose between converting FROM kilograms/pounds: kilograms
the final result is:  22.0 pounds
$ python /tmp/convert.py 
Please specify the amount: 22
derp
Please choose between converting FROM kilograms/pounds: pounds
the final result is:  10.0 kilograms

那些return 0的调用会搞乱事情 :) 我建议你把它们去掉。进一步的改进可以是把接口代码和转换逻辑分开;你的函数应该可能看起来更像这样:

def from_kilograms(kilos):
    return kilos * 2.2
def from_pounds(pounds):
    return pounds / 2.2
def conversation():
    while true:
        ans = raw_input("kg or lb: ")
        num = raw_input("mass: ")
        if ans == "kg"
           print from_kilograms(int(num)), " pounds"
        elsif ans == "lb"
           print from_pounds(int(num)), " kilograms"
        else
           print "bye!"
           return

这种分离方式让你在网页服务器软件、图形用户界面、ncurses命令行界面,或者普通的终端命令行界面中更容易重用你的函数。

撰写回答