ne peut pas multiplier la séquence par non-int de type 'float'

niveau: débutant

pourquoi j'obtiens l'erreur "ne peut pas multiplier la séquence par non-int de type 'float'"?

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])

merci Baba

23
demandé sur mskfisher 2010-08-31 23:15:48

6 réponses

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

devrait être:

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

vous multipliez 0,01 avec l'objet de la liste growthRates. La multiplication d'une liste par un entier est valide (c'est du sucre syntaxique surchargé qui vous permet de créer une liste étendue avec des copies de ses références d'éléments).

Exemple:

>>> 2 * [1,2]
[1, 2, 1, 2]
15
répondu Jeremy Brown 2010-08-31 19:23:51

Python permet de multiplier les séquences de répéter leurs valeurs. Voici un exemple visuel:

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

Mais il ne vous permet pas de le faire avec des nombres à virgule flottante:

>>> [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'
9
répondu jathanism 2010-08-31 19:19:24

vous multipliez votre" 1 + 0.01 " fois la liste growthRate, pas l'élément de la liste que vous itérez. J'ai renommé irate et en utilisant ça à la place. Consultez la mise à jour de code ci-dessous:

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
répondu Sam Dolan 2010-08-31 19:29:13

Dans cette ligne:

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

growthRates est une séquence ([3,4,5,0,3]). Vous ne pouvez pas multiplier cette séquence par un flotteur (0.1). Il semble que ce que vous vouliez mettre là était i.

d'ailleurs, i n'est pas un bon nom pour cette variable. Envisager quelque chose de plus descriptif, comme growthRate ou rate.

2
répondu nmichaels 2010-08-31 19:20:06

Dans cette ligne:

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

je pense que tu veux dire ceci:

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

quand vous essayez de multiplier un flottant par des growthRates (qui est une liste), vous obtenez cette erreur.

1
répondu Daniel Stutzbach 2010-08-31 19:19:21

parce que growthRates est une séquence (vous l'itérez même!) et vous le multipliez par (1 + 0.01), qui est évidemment un flottant (1.01). Je suppose que tu veux dire for growthRate in growthRates: ... * growthrate?

0
répondu 2010-08-31 19:19:14