Dlaczego otrzymuję błąd TypeError: nie można pomnożyć sekwencji przez wartość inną niż int typu „float”?

99

Piszę, aby uzyskać kwotę sprzedaży (przez wejście) do pomnożenia przez zdefiniowany podatek od sprzedaży (0,08), a następnie wydrukować całkowitą kwotę (podatek od sprzedaży razy kwota sprzedaży).

Mam ten błąd. Czy ktoś wie, co może być nie tak lub ma jakieś sugestie?

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'
SD.
źródło

Odpowiedzi:

86

raw_inputzwraca ciąg (sekwencję znaków). W Pythonie mnożenie ciągu i liczby zmiennoprzecinkowej nie ma zdefiniowanego znaczenia (mnożenie ciągu i liczby całkowitej ma znaczenie: "AB" * 3jest "ABABAB"; ile to "L" * 3.14? Proszę nie odpowiadać "LLL|"). Musisz przeanalizować ciąg do wartości liczbowej.

Możesz spróbować:

salesAmount = float(raw_input("Insert sale amount here\n"))
Marc Gravell
źródło
Nauczyłem się czytać błąd składni przed wysłaniem tutaj wiadomości i użyciem Google. Próbowałem przekonwertować raw_input dla salesAmount na int, a nie na float. Czy wiesz, dlaczego int nie zadziała, a raczej float? Bare with me, lol.
SD.
3
Mnożenie (przy użyciu operatora *) ciągu znaków przez liczbę całkowitą jest dobrze zdefiniowane w Pythonie. Mnożenie ciągu przez liczbę zmiennoprzecinkową nie jest zdefiniowane i właśnie na to narzekał Python.
Greg Hewgill
Dzięki Greg! Chyba muszę zejść z bardziej podstawowych zasad.
SD.
1
@Raj: Powiedziałem, że to było dobrze zdefiniowane, ale niekoniecznie tego oczekujesz. „abc” * 3 to „abcabcabc”, a zatem „5” * 3 to „555”.
Greg Hewgill
55

Może to pomoże innym w przyszłości - miałem ten sam błąd podczas próby zwielokrotnienia pływaka i listy pływaków. Chodzi o to, że wszyscy tutaj mówili o mnożeniu liczby zmiennoprzecinkowej przez ciąg (ale tutaj cały mój element był zmiennoprzecinkowy), więc problem polegał na używaniu operatora * na liście.

Na przykład:

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

Błąd:

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

Rozwiązanie - przekonwertuj listę na tablicę numpy:

coff = np.asarray(coff) * C
Serendipity
źródło
Podoba mi się to podejście!
Léo Léopold Hertz 준영
1
jeśli nie chcesz importować numpy, możesz zrobić:coff = [i * c for i in coff]
nicolas.fg
3

Problem polega na tym, że salesAmount ustawiono na ciąg. Jeśli wprowadzisz zmienną do interpretera Pythona i naciśniesz Enter, zobaczysz wprowadzoną wartość w cudzysłowie. Na przykład, jeśli wpiszesz 56,95, zobaczysz:

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

Będziesz chciał przekonwertować ciąg na liczbę zmiennoprzecinkową przed pomnożeniem go przez podatek od sprzedaży. Zostawię ci to, żebyś się domyślił. Powodzenia!

Eric Palakovich Carr
źródło
1
Wielkie dzięki, stary. Doceniam pomoc! Nie wiedziałem o możliwości przechowywania wartości typu float podczas definiowania. Próbowałem to zrobić w locie (ale próbowałem zmienić wartość ze stringa na int - więc pomyliłem się, ponieważ potrzebowałem wartości float).
SD.
1

Nie możesz mnożyć stringów i float. Zamiast tego spróbuj jak poniżej. Działa dobrze

totalAmount = salesAmount * float(salesTax)
Maheshnagakumar
źródło