Как создать список, содержащий имена функций?

python list function

57 просмотра

2 ответа

Я совершенно новичок в 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']

Программа должна случайным образом выбрать пару единиц (например, кг-> фунты) и значение (например, 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

Может кто-нибудь объяснить мне, что не так с кодом и предложить что-то, чтобы решить проблему.

Автор: Aleksandr Zakirov Источник Размещён: 08.11.2019 11:21

Ответы (2)


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)не следует бросать исключение.

Также обратите внимание, что сравнение floats ( if answer == random_unit(ranval)), скорее всего, вызовет у вас проблемы. См. Математика с плавающей точкой сломана? для некоторых подробных объяснений, почему это так.

Когда вы округляете, вам это может сойти с рук, но хорошо знать об этом и понимать, что вам нужно разобраться с этим в своем коде.

Автор: SiHa Размещён: 20.08.2016 01:42

-1 плюса

Я думаю, это то, о чем вы спрашиваете. Вы должны иметь возможность хранить функции в списке, как это

unit_list = [kg_to_g, g_to_kg, inch_to_cm, cm_to_inch, ft_to_cm]

Затем вы можете вызвать каждый элемент в списке и дать ему параметр, и он должен выполнить функцию, например, так:

unit_list[0](value)
Автор: moonboon Размещён: 20.08.2016 01:48
Вопросы из категории :
32x32