2010-08-31 13 views
21

Nivel: Principianteno se puede multiplicar por secuencia no int del tipo 'float'

¿Por qué aparece el error "no se puede multiplicar por secuencia no int del tipo '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]) 

gracias Baba

+0

Preferiría 'SavingsRecord.append (fund)' en lugar de su 'SavingsRecord + = [fondo,] ', it * may * puede ser más rápido. –

+0

Posible duplicado de [¿Por qué obtengo TypeError: no puedo multiplicar secuencia por non-int del tipo 'float'?] (https://stackoverflow.com/questions/485789/why-do-i-get-typeerror-cant-multiply-sequence-by-non-int-of-type-float) –

+1

@StephanWeinhold, esa publicación está fechada 2012. Esta pregunta fue publicada en 2010. – raoulbia

Respuesta

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

debería ser:

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

está multiplicando 0,01 con el objeto de lista growthRates. Multiplicar una lista por un número entero es válida (es azúcar sintáctico sobrecargado que te permite crear una lista extendida con copias de sus referencias de elementos).

Ejemplo:

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

Estás multipling su "1 + 0.01" tiempos growthrate la lista, no el elemento de la lista que estés iteración a través. Cambié el nombre de i a rate y lo usé en su lugar. Ver el código actualizado a continuación:

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 es realmente increíble ... Con solo 11 visitas, hay 5 respuestas correctas en un minuto. – sdolan

0

Debido growthRates es una secuencia (que aún está iterando!) Y se multiplica por (1 + 0,01), lo que obviamente es un flotador (1,01). Supongo que te refieres a for growthRate in growthRates: ... * growthrate?

1

En esta línea:

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

Creo que significa esto:

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

Cuando intenta multiplicar por un flotador growthRates (que es una lista), se obtiene que el error.

7

Python le permite multiplicar secuencias para repetir sus valores. Aquí está un ejemplo visual:

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

Pero no le permite hacerlo con números de punto flotante:

>>> [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

En esta línea:

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

growthRates es una secuencia ([3,4,5,0,3]). No puedes multiplicar esa secuencia por un flotador (0.1). Parece que lo que quería poner allí era i.

Por cierto, i no es un nombre genial para esa variable. Considere algo más descriptivo, como growthRate o rate.

+0

@Todo: Gracias por su pronta respuesta. @Nathon: me alegro de que haya hecho el comentario sobre el nombre de la variable. Es importante obtener la disciplina de sintaxis desde el principio al aprender a programar. – raoulbia

0

Me encontré con el mismo problema y lo resolvió ahora. Es muy posible que el valor incluya algo así como '1,234.56', de ser así, elimine ',' usando str.replace (',', '')

Cuestiones relacionadas