Чому я отримую TypeError: не можу помножити послідовність на non-int типу 'float'?


96

Я набираю текст, щоб отримати суму продажу (на вхід), помножену на визначений податок з продажу (0,08), а потім надрукувати загальну суму (податок із продажу, зменшений на суму продажу).

Я стикаюся з цією помилкою. Хто-небудь знає, що може бути неправильним, або має якісь пропозиції?

salesAmount = raw_input (["Insert sale amount here \n"])
['Insert sale amount here \n']20.99
>>> salesTax = 0.08
>>> totalAmount = salesAmount * salesTax

Traceback (most recent call last):
  File "<pyshell#57>", line 1, in <module>
    totalAmount = salesAmount * salesTax
TypeError: can't multiply sequence by non-int of type 'float'

Відповіді:


84

raw_inputповертає рядок (послідовність символів). У Python множення рядка та плаваючого значення не має визначеного значення (при множенні рядка і ціле число має значення: "AB" * 3є "ABABAB"; скільки "L" * 3.14? Будь ласка, не відповідайте "LLL|"). Вам потрібно проаналізувати рядок до числового значення.

Ви можете спробувати:

salesAmount = float(raw_input("Insert sale amount here\n"))

Я навчився читати синтаксичну помилку перед тим, як публікувати тут і користуватися Google. Я намагався перетворити raw_input для salesAmount на int, а не на float. Ви знаєте, чому int не буде працювати, а швидше плаватиме? Голий зі мною, ха-ха.
SD.

2
Множення (за допомогою оператора *) рядка на ціле число добре визначено в Python. Помноження рядка на float не визначено, і саме на це скаржився Python.
Greg Hewgill

Дякую Грегу! Думаю, мені потрібно взяти деякі основні правила.
SD.

1
@Raj: Я сказав, що це чітко визначено, але це не обов'язково те, що ви очікуєте. "abc" * 3 - "abcabcabc", а отже "5" * 3 - "555".
Greg Hewgill

52

Можливо, це допоможе іншим у майбутньому - у мене трапилася та сама помилка під час спроби множити float і список floats. Річ у тім, що всі тут говорили про множення float на рядок (але тут весь мій елемент весь час був floats), тому проблема насправді полягала в використанні оператора * у списку.

Наприклад:

import math
import numpy as np
alpha = 0.2 
beta=1-alpha
C = (-math.log(1-beta))/alpha

coff = [0.0,0.01,0.0,0.35,0.98,0.001,0.0]
coff *= C

Помилка:

    coff *= C 
TypeError: can't multiply sequence by non-int of type 'float'

Рішення - перетворити список на масив numpy:

coff = np.asarray(coff) * C

Мені подобається такий підхід!
Лео Леопольд Герц, 준영

1
якщо ви не хочете імпортувати numpy, ви можете зробити:coff = [i * c for i in coff]
nicolas.fg

3

Проблема полягає в тому, що для salesAmount встановлюється рядок. Якщо ви введете змінну в інтерпретатор python і натиснете Enter, ви побачите введене значення в оточенні лапок. Наприклад, якщо ви ввели 56,95, ви побачите:

>>> sales_amount = raw_input("[Insert sale amount]: ")
[Insert sale amount]: 56.95
>>> sales_amount
'56.95'

Вам потрібно буде перетворити рядок у плаваючу, перш ніж помножити його на податок з продажу. Я залишу це для вас, щоб розібратися. Удачі!


1
Велике спасибі брате. Я ціную допомогу! Я не знав про можливість зберігати плаваюче значення при визначенні. Я намагався зробити це на льоту (але я намагався змінити значення з рядка на int - тому я помилився, оскільки мені знадобилося плаваюче значення).
SD.

1

Ви не можете множити рядок і float. Замість вас спробуйте, як показано нижче. Це чудово працює

totalAmount = salesAmount * float(salesTax)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.