не может умножить последовательность на не-int типа 'float' - PullRequest
31 голосов
/ 31 августа 2010

уровень: новичок

почему я получаю ошибку "не могу умножить последовательность на не-int типа '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])

спасибо, Баба

Ответы [ 6 ]

19 голосов
/ 31 августа 2010
for i in growthRates:  
    fund = fund * (1 + 0.01 * growthRates) + depositPerYear

должно быть:

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

Вы умножаете 0,01 на объект списка GrowRates. Умножение списка на целое число допустимо (это перегруженный синтаксический сахар, который позволяет создавать расширенный список с копиями ссылок на его элементы).

Пример:

>>> 2 * [1,2]
[1, 2, 1, 2]
13 голосов
/ 31 августа 2010

Python позволяет вам умножать последовательности, повторяя их значения. Вот наглядный пример:

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

Но это не позволяет вам делать это с числами с плавающей запятой:

>>> [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'
3 голосов
/ 31 августа 2010

Вы умножаете ваш «1 + 0,01» на умножение списка GrowRate, а не на элемент в списке, через который вы перебираете. Я переименовал i в rate и использую это вместо этого. Смотрите обновленный код ниже:

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])
2 голосов
/ 31 августа 2010

В этой строке:

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

growthRates - это последовательность ([3,4,5,0,3]). Вы не можете умножить эту последовательность на число с плавающей запятой (0,1). Похоже, что вы хотели поставить там было i.

Между прочим, i не подходит для этой переменной. Рассмотрим что-нибудь более описательное, например growthRate или rate.

1 голос
/ 31 августа 2010

В этой строке:

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

Я думаю, что вы имеете в виду это:

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

Когда вы пытаетесь умножить число с плавающей точкой на growthRates (который является списком), вы получите, чтоошибка.

0 голосов
/ 31 августа 2010

Поскольку growthRates - это последовательность (вы даже итерируете ее!), И вы умножаете ее на (1 + 0,01), что, очевидно, является числом с плавающей точкой (1,01).Я думаю, вы имеете в виду for growthRate in growthRates: ... * growthrate?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...