Преобразование пользовательского ввода в 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 шт):
Ещё бы! Python не умеет переводить выражения в тип float. Попробуйте так (но это небезопасно со стороны ввода - пользователь может ввести что угодно):
user_freq = float(eval(frequency))
Функция eval исполняет код, указанный в строковом типе. В данном случае программа находит значение выражения и переводит его в тип float.
Вы спросите - "а почему тогда у меня в консоли всё-таки выводится число в типе float?"
Да потому, что Python сначала выполняет 4,6 * 10 ** 14, а потом уж переводит в str, затем во float и выводит наконец получившиеся 459999999999999.94. То есть вы "проворачиваете" совсем не ту же операцию в консоли.
Помогло?