как мне напечатать строку с переменной, содержащей значение с плавающей точкой

#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)