2010-08-31 8 views
21

Ebene multiplizieren: Anfängerkann nicht Folge von nicht-int vom Typ ‚float‘

warum ich Fehler „kann nicht Folge von nicht-int vom Typ‚schweben‘multiplizieren“?

def nestEgVariable(salary, save, growthRates): 
    SavingsRecord = [] 
    fund = 0 
    depositPerYear = salary * save * 0.01 
    for i in growthRates: 
     fund = fund * (1 + 0.01 * growthRates) + depositPerYear 
     SavingsRecord += [fund,] 
    return SavingsRecord 


print nestEgVariable(10000,10,[3,4,5,0,3]) 

dank Baba

+0

Ich würde "SavingsRecord.append (fund)" anstelle Ihrer 'SavingsRecord bevorzugen + = [fund,] ', * kann * schneller sein. –

+0

Mögliches Duplikat von [Warum erhalte ich TypeError: Kann die Sequenz nicht mit Nicht-Int des Typs 'float' multiplizieren?] (https://stackoverflow.com/questions/485789/why-do-i-get-typeerror-cant-multiply-sequence-by-non-int-of-type-float) –

+1

@StephanWeinhold, dieser Beitrag ist datiert 2012. Diese Frage wurde 2010 veröffentlicht. – raoulbia

Antwort

14
for i in growthRates: 
    fund = fund * (1 + 0.01 * growthRates) + depositPerYear 

sein sollte:

for i in growthRates: 
    fund = fund * (1 + 0.01 * i) + depositPerYear 

Sie vermehren sich mit dem growthRates Liste Objekt 0,01. Das Multiplizieren einer Liste mit einer Ganzzahl ist gültig (es ist überladener syntaktischer Zucker, mit dem Sie eine erweiterte Liste mit Kopien ihrer Elementreferenzen erstellen können).

Beispiel:

>>> 2 * [1,2] 
[1, 2, 1, 2] 
3

Sie multipling Ihre "1 + 0,01" mal die growthRate Liste, nicht das Element in der Liste ihr durchlaufen. Ich habe i in rate umbenannt und stattdessen verwendet. Siehe den aktualisierten Code unten:

def nestEgVariable(salary, save, growthRates): 
    SavingsRecord = [] 
    fund = 0 
    depositPerYear = salary * save * 0.01 
    # V-- rate is a clearer name than i here, since you're iterating through the rates contained in the growthRates list 
    for rate in growthRates: 
     #       V-- Use the `rate` item in the growthRate list you're iterating through rather than multiplying by the `growthRate` list itself. 
     fund = fund * (1 + 0.01 * rate) + depositPerYear 
     SavingsRecord += [fund,] 
    return SavingsRecord 


print nestEgVariable(10000,10,[3,4,5,0,3]) 
+3

SO ist wirklich erstaunlich ... Mit nur 11 Ansichten gibt es 5 richtige Antworten innerhalb einer Minute. – sdolan

0

Da growthRates eine Sequenz ist (Sie selbst sind Iterieren es!) Und multiplizieren Sie sie mit (1 + 0,01), was offensichtlich ein Schwimmer (1,01). Ich denke du meinst for growthRate in growthRates: ... * growthrate?

1

In dieser Zeile:

fund = fund * (1 + 0.01 * growthRates) + depositPerYear 

Ich glaube, Sie dies bedeuten:

fund = fund * (1 + 0.01 * i) + depositPerYear 

Wenn Sie versuchen, einen Schwimmer durch growthRates zu multiplizieren (die eine Liste ist), können Sie diesen Fehler erhalten.

7

Python ermöglicht es Ihnen, Sequenzen zu multiplizieren, um ihre Werte zu wiederholen. Hier ist ein visuelles Beispiel:

>>> [1] * 5 
[1, 1, 1, 1, 1] 

Aber es erlaubt Ihnen nicht, es mit Gleitkommazahlen zu tun:

>>> [1] * 5.1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can't multiply sequence by non-int of type 'float' 
2

In dieser Zeile:

fund = fund * (1 + 0.01 * growthRates) + depositPerYear

growthRates ist ein Sequenz ([3,4,5,0,3]). Sie können diese Sequenz nicht mit einem Gleitkomma (0,1) multiplizieren. Es sieht so aus, als ob Sie dort setzen wollten, war i.

Übrigens, i ist kein großer Name für diese Variable. Betrachten Sie etwas beschreibender, wie growthRate oder rate.

+0

@All: Vielen Dank für Ihre schnellen Antworten. @Nathon: Ich bin froh, dass Sie den Kommentar über den Variablennamen gemacht haben. Es ist wichtig, die Syntaxdisziplin von Anfang an zu lernen, wenn man Programmierung lernt. – raoulbia

0

Ich traf das gleiche Problem und löste es jetzt. Höchstwahrscheinlich, dass der Wert etwas wie '1,234,56' enthält, wenn ja, entfernen Sie ',' mit str.replace (',', '')

Verwandte Themen