Perché ottengo TypeError: impossibile moltiplicare la sequenza per non-int di tipo "float"?


96

Sto digitando per ottenere un importo di vendita (per input) da moltiplicare per un'imposta sulle vendite definita (0,08) e quindi fare in modo che stampi l'importo totale (imposta sulle vendite moltiplicato per l'importo della vendita).

Mi imbatto in questo errore. Qualcuno sa cosa potrebbe essere sbagliato o ha qualche suggerimento?

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'

Risposte:


84

raw_inputrestituisce una stringa (una sequenza di caratteri). In Python, moltiplicare una stringa e un float non ha un significato definito (mentre moltiplicare una stringa e un numero intero ha un significato: "AB" * 3è "ABABAB"; quanto costa "L" * 3.14? Per favore non rispondere "LLL|"). È necessario analizzare la stringa in un valore numerico.

Potresti provare:

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

Ho imparato a leggere l'errore di sintassi prima di postare qui e utilizzare Google. Stavo cercando di convertire raw_input per salesAmount in un int piuttosto che in un float. Sai perché int non funzionerà, ma piuttosto float? Nudo con me, lol.
SD.

2
Moltiplicare (usando l'operatore *) una stringa per un intero è ben definito in Python. Moltiplicare una stringa per un float non è definito, ed è ciò di cui si lamentava Python.
Greg Hewgill,

Grazie Greg! Credo di aver bisogno di stabilire alcune regole più basilari.
SD.

1
@ Raj: ho detto che era ben definito, ma non è necessariamente quello che ti aspetti. "abc" * 3 è "abcabcabc" e quindi "5" * 3 è "555".
Greg Hewgill,

52

Forse questo aiuterà gli altri in futuro: ho avuto lo stesso errore mentre provavo a moltiplicare un float e un elenco di float. Il fatto è che tutti qui parlavano di moltiplicare un float con una stringa (ma qui tutti i miei elementi erano sempre float) quindi il problema era in realtà usare l'operatore * su un elenco.

Per esempio:

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

L'errore:

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

La soluzione: converti l'elenco in array numpy:

coff = np.asarray(coff) * C

Mi piace questo approccio!
Léo Léopold Hertz 준영

1
se non vuoi importare numpy, puoi fare:coff = [i * c for i in coff]
nicolas.fg

3

Il problema è che salesAmount viene impostato su una stringa. Se inserisci la variabile nell'interprete Python e premi invio, vedrai il valore inserito racchiuso tra virgolette. Ad esempio, se hai inserito 56,95 vedresti:

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

Ti consigliamo di convertire la stringa in un float prima di moltiplicarla per l'imposta sulle vendite. Lascio che tu lo capisca. In bocca al lupo!


1
Grazie mille fratello. Apprezzo l'aiuto! Non sapevo se fosse possibile memorizzare un valore float durante la definizione. Stavo cercando di farlo al volo (ma stavo cercando di cambiare il valore da una stringa a un int, quindi ho sbagliato perché avevo bisogno di un valore float).
SD.

1

Non puoi moltiplicare string e float. Invece di provare come di seguito. Funziona bene

totalAmount = salesAmount * float(salesTax)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.