Neden TypeError alıyorum: dizi int olmayan 'float' türü ile çarpılamıyor?


99

Tanımlanmış bir satış vergisi (0,08) ile çarpılacak bir satış tutarı (girdi ile) almak ve ardından toplam tutarı (satış vergisi çarpı satış tutarı) yazdırmak için yazıyorum.

Bu hatayla karşılaşıyorum. Neyin yanlış olabileceğini bilen veya herhangi bir önerisi olan var mı?

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'

Yanıtlar:


86

raw_inputbir dize (bir dizi karakter) döndürür. Python'da, bir dizeyi ve bir kayan noktayı çarpmak tanımlanmış bir anlam ifade etmez (bir dizeyi ve bir tamsayıyı çarpmanın bir anlamı vardır: "AB" * 3eşittir "ABABAB"; ne kadar "L" * 3.14? Lütfen yanıtlamayın "LLL|"). Dizeyi sayısal bir değere ayrıştırmanız gerekir.

Denemek isteyebilirsin:

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

Buraya göndermeden ve Google'ı kullanmadan önce sözdizimi hatasını okumayı öğrendim. SalesAmount için raw_input'u float yerine int'e dönüştürmeye çalışıyordum. İnt'in neden çalışmayacağını, bunun yerine float'ın neden çalışacağını biliyor musunuz? Benimle çıplak, lol.
SD.

3
Bir dizeyi bir tamsayı ile çarpmak (* operatörünü kullanarak) Python'da iyi tanımlanmıştır. Bir dizgeyi bir float ile çarpmak tanımlı değildir ve Python'un şikayet ettiği şey budur.
Greg Hewgill

Teşekkürler Greg! Sanırım biraz daha temel kurallara ihtiyacım var.
SD.

1
@Raj: İyi tanımlanmış dedim, ama beklediğiniz gibi değil. "abc" * 3 "abcabcabc" dir ve bu nedenle "5" * 3, "555" dir.
Greg Hewgill

54

Belki bu gelecekte başkalarına yardımcı olur - bir kayan nokta ve bir kayan nokta listesini çoğaltmaya çalışırken aynı hatayı yaptım. Mesele şu ki, buradaki herkes bir float'ı bir dizeyle çarpmaktan bahsetti (ama burada tüm elemanım baştan sona float idi), bu yüzden problem aslında bir listede * operatörünü kullanmaktı.

Örneğin:

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

Hata:

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

Çözüm - listeyi numpy dizisine dönüştürün:

coff = np.asarray(coff) * C

Bu yaklaşımı beğendim!
Léo Léopold Hertz 준영

1
coff = [i * c for i in coff]
numpy'i

3

Sorun, salesAmount'un bir dizeye ayarlanmasıdır. Değişkeni python yorumlayıcısına girip enter tuşuna basarsanız, girilen değeri tırnak içinde görürsünüz. Örneğin, 56.95 girdiyseniz şunu görürsünüz:

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

Satış vergisiyle çarpmadan önce dizeyi bir kayan noktaya dönüştürmek isteyeceksiniz. Bunu çözmen için bırakacağım. İyi şanslar!


1
Çok teşekkürler kardeşim. Yardımın için minnettarım! Tanımlarken bir kayan değer saklayabileceğimi bilmiyordum. Anında yapmaya çalışıyordum (ama değeri bir dizeden int'e değiştirmeye çalışıyordum - bu yüzden bir float değerine ihtiyacım olduğu için yanlış yapacaktım).
SD.

1

String ve float ile çarpamazsınız. Yerine aşağıdaki gibi deneyin. İyi çalışıyor

totalAmount = salesAmount * float(salesTax)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.