我对python和编程完全陌生,但我正在尝试使用更实用的方法来学习它。
我要做的是转换不同单位的练习,例如:磅 - >公斤,脚 - >米等。
我已经为不同的单位对定义了所有函数:
def kg_to_g(value):
return round(value*1000.0,2)
def g_to_kg(value):
return round(value/1000.0,2)
def inch_to_cm(value):
return round(value*2.54,2)
def cm_to_inch(value):
return round(value/2.54,2)
def ft_to_cm(value):
return round(value*30.48,2)
等
并创建了一个包含这些函数名称的列表:
unit_list = ['kg_to_g','g_to_kg','inch_to_cm','cm_to_inch',
'ft_to_cm','cm_to_ft','yard_to_m','m_to_yard',
'mile_to_km','km_to_mile','oz_to_g','g_to_oz',
'pound_to_kg','kg_to_pound','stone_to_kg','kg_to_stone',
'pint_to_l','l_to_pint','quart_to_l','l_to_quart',
'gal_to_l','l_to_gal','bar_to_l','l_to_bar']
程序应随机选择单位对(例如kg->磅)和值(例如134.23),并要求用户转换这些值。
random_unit = random.choice(unit_list)
lower = 0.1001
upper = 2000.1001
range_width = upper - lower
ranval = round(random.random() * range_width + lower, 2)
当用户输入答案时,程序应将答案与功能定义的计算进行比较,并告诉用户答案是正确答案还是错误答案:
def input_handler(answer):
if answer == random_unit(ranval):
label2.set_text("Correct!")
else:
label2.set_text("Wrong!")
不幸的是,程序不起作用,codesculptor(codesculptor.org)返回错误
TypeError: 'str' object is not callable
有人可以向我解释代码有什么问题并提出解决问题的建议。
答案 0 :(得分:0)
因为您已将函数名称(在列表中)括在引号中,所以它们已成为字符串。
将您的列表更改为:
unit_list = [kg_to_g, g_to_kg, inch_to_cm, cm_to_inch,
ft_to_cm, cm_to_ft, yard_to_m, m_to_yard,
mile_to_km, km_to_mile, oz_to_g, g_to_oz,
pound_to_kg, kg_to_pound, stone_to_kg, kg_to_stone,
pint_to_l, l_to_pint, quart_to_l, l_to_quart,
gal_to_l, l_to_gal, bar_to_l, l_to_bar]
现在它是一个函数列表,可以这样调用:unit_list[0](34)
,例如。
所以现在random_unit(ranval)
不应该抛出异常。
另请注意,比较浮点数(if answer == random_unit(ranval)
)很可能会导致问题。有关原因的详细解释,请参阅Is floating point math broken?。
当你四舍五入时,你可能会侥幸逃脱它,但是要注意这一点并明白你需要在你的代码中处理它是很好的。
答案 1 :(得分:-1)
我认为这就是你要问的问题。您应该能够将函数存储在像这样的列表中
unit_list = [kg_to_g, g_to_kg, inch_to_cm, cm_to_inch, ft_to_cm]
然后,您可以调用列表中的每个项目并为其指定一个参数,它应该执行该函数,例如:
unit_list[0](value)