#python #python-3.x
#python #python-3.x
Вопрос:
Я очень новичок в Python, и я хочу напечатать переменную average как значение с плавающей запятой после строки, но я продолжаю получать ошибку. Как я могу это исправить. Редактировать: я добавил начало своего кода на случай, если это поможет
numbers = input ("Enter a list of numbers with a comma "," in between ")
total_num = 0
for num in numbers:
total_num = 1
average = float(sum(numbers)/total_num)
print ("The average is " , average)
Это ошибка, которую я получаю
TypeError: unsupported operand type(s) for : 'int' and 'str'
Когда я попробовал это с python 2.6, это сработало отлично, но я использую python 3.7.1, и он перестал работать
Комментарии:
1. В вашем коде нет
, вы не могли получить эту ошибку.
2. Что произойдет, если вы сделаете
sum(numbers)
это само по себе? Наиболее вероятно, чтоnumbers
это список, содержащий строку, и поэтому онsum()
жалуется, что не может добавить строку в int.3. Эта ошибка произошла бы, если бы вы написали
print ("The average is " average)
4. @Barmar, нет, это исключение вызывается, например,
sum([1, "2"])
.5. Оператору необходимо опубликовать значение
numbers
и полную обратную трассировку.
Ответ №1:
Ошибка исходит из sum(numbers)
. input()
функция возвращает строку, а функция sum() пытается выполнить итерацию и суммировать символы строки… (Это работало в python 2, поскольку функция input() в Python 2 вычисляет строку и в этом случае возвращает список чисел …)
Вам нужно разделить числа (используя split(',')
) и преобразовать список строк в float.
Это будет работать:
numbers = input ("Enter a list of numbers with a comma "," in between ")
numbers = [float(x) for x in numbers.split(',')]
total_num = 0
for num in numbers:
total_num = 1
average = float(sum(numbers)/total_num)
print ("The average is " , average)
(Код можно улучшить многими способами, я сосредоточился на описанной проблеме …)
Комментарии:
1. Будет 1, если вы объясните, почему это работает в python2, но не в python3 (разница между
input
методами)
Ответ №2:
В Python 2 input()
волшебным образом применили встроенную eval()
функцию к строке, которую вводит пользователь.
Но это считалось «угрозой безопасности», поэтому в Python 3 input()
возвращает строку, введенную пользователем, без оценки.
Так, например, если пользователь ввел
1, 2, 3
в Python 2 input()
вернул кортеж (1, 2, 3)
. но в Python 3 она возвращает строку "1, 2, 3"
. В Python 3 вам придется применить eval()
к этой строке самостоятельно (понимая, что это «угроза безопасности», поскольку eval()
в конечном итоге может привести к чему угодно, в зависимости от того, что пользователь ввел).
Ответ №3:
Редактировать 2:
Метод Python2 input
был небезопасным, поскольку он применялся eval
к вашему входному значению. Python3 input
использует то, что было известно в Python2 как raw_input
.
Поэтому, чтобы проанализировать ваши числа так, как вы их получаете сейчас:
numbers = input ("Enter a list of numbers with a comma "," in between ")
numbers = [int(n) for n in numbers.split(',')]
или еще лучше, работать с вводом, содержащим пробелы и запятые, и просто игнорировать их:
import re
numbers = input ("Enter a list of numbers with a comma "," in between ")
numbers = [int(n) for n in re.findall("d ", numbers)]
Редактировать:
Похоже, что источник вашей проблемы должен что-то делать с вашим списком `numbers`. Если это список чисел, представленных в строках, вам придется сначала преобразовать их в целые числа (или числа с плавающей запятой):
sum(int(n) for n in numbers)
sum(float(n) for n in numbers)
таким образом, это будет:
average = sum(float(n) for n in numbers)/len(numbers) # Python3 division result by default are float
—
Другие способы печати: Вы можете просто использовать f-string на Python3.6 :
average = float(sum(numbers)/total_num)
print(f"The average is {average}")
В более старых версиях Python вы можете либо:
print("The average is {}".format(average))
print("The average is %f" % average) # Float formatted
print("The average is %d" % average) # Int formatted
print("The average is " str(average))
И, наконец, ваша печать также должна была сработать:
print("The average is", str(average))
Комментарии:
1. Похоже, что ошибка не возникает при печати результата.
Ответ №4:
Ваша ошибка заключается в том, что numbers
это одна строка.
Вам нужно разделить строку, а затем преобразовать записи в int. Это даст вам это для первых двух строк:
numbers = input("Enter a list of numbers with a comma "," in between ").split(',')
numbers = [int(i) for i in numbers]
Затем вы можете просто удалить весь цикл for и вместо этого просто использовать len(numbers)
Окончательный код
numbers = input("Enter a list of numbers with a comma "," in between ").split(',')
numbers = [int(i) for i in numbers]
total_num = 0
average = float(sum(numbers) / len(numbers))
print("n The average is ", average)