如何创建包含函数名称的列表?

时间:2016-08-20 13:12:03

标签: python list function

我对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

有人可以向我解释代码有什么问题并提出解决问题的建议。

2 个答案:

答案 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)