Преобразование пользовательского ввода в float

Всех приветствую. Проблема следующего характера. На пользовательский ввод дается выражение типа 4.6 * 10 ** 14. Так как input возвращает str нужно его преобразовать в число, чтобы можно было сравнивать его с другим числом. При запуске кода, представленного ниже, питон ругается >ValueError: could not convert string to float: '4.6 * 10 ** 14'. Код:

frequency = (input('Введите частоту волны: '))
user_freq = float(frequency)
freq_list = [3 * 10 ** 9, 3 * 10 ** 12, 4.3 * 10 ** 14, 7.5 * 10 ** 14,
             3 * 10 ** 17, 3 * 10 ** 19]
freq_name = ['Радиоволны', 'Микроволны', 'Инфракрасное излучение', 'Видимое излучение',
             'Ультрафиолетовое излучение', 'Рентгеновское излучение',
             'Гамма-излучение']

if user_freq < freq_list[0]:
    print(freq_name[0])
elif freq_list[0] < user_freq < freq_list[1]:
    print(freq_name[1])
elif freq_list[1] < user_freq < freq_list[2]:
    print(freq_name[2])
elif freq_list[2] < user_freq < freq_list[3]:
    print(freq_name[3])  
elif freq_list[3] < user_freq < freq_list[4]:
    print(freq_name[4])
elif freq_list[4] < user_freq < freq_list[5]:
    print(freq_name[5])
elif freq_list[5] < user_freq < freq_list[6]:
    print(freq_name[6])
elif freq_list[6] < user_freq:
    print(freq_name[7])

При этом, если провернуть ту же операцию в консоли, данные преобразовываются нормальноРезультаты тестирования кода и проверки аналога непосредственно в консоли

Вопрос: где кроется ошибка в коде и почему она появляется? Заранее благодарен за помощь!


Ответы (1 шт):

Автор решения: ПИТОНИСТ версия-3-8

Ещё бы! Python не умеет переводить выражения в тип float. Попробуйте так (но это небезопасно со стороны ввода - пользователь может ввести что угодно):

user_freq = float(eval(frequency))

Функция eval исполняет код, указанный в строковом типе. В данном случае программа находит значение выражения и переводит его в тип float.

Вы спросите - "а почему тогда у меня в консоли всё-таки выводится число в типе float?"

Да потому, что Python сначала выполняет 4,6 * 10 ** 14, а потом уж переводит в str, затем во float и выводит наконец получившиеся 459999999999999.94. То есть вы "проворачиваете" совсем не ту же операцию в консоли.

Помогло?

→ Ссылка