如何在Python中将磅转换为千克
我正在尝试根据输入的数值打印出磅或千克的结果,这是我的代码:
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弗隆转换成英尺”这样的问题。
建议进一步添加的内容:
添加纳米作为距离单位(并进行测试)。
添加短吨和石头作为重量单位(并进行测试)。
添加升、品脱和桶作为体积单位(并进行测试)。
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命令行界面,或者普通的终端命令行界面中更容易重用你的函数。