web-dev-qa-db-ja.com

'float'タイプの非整数でシーケンスを乗算することはできません

レベル:初心者

「シーケンスを「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])

ありがとうババ

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

する必要があります:

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

0.01にgrowthRatesリストオブジェクトを乗算しています。リストに整数を掛けることは有効です(要素参照のコピーで拡張リストを作成できるようにするオーバーロードされた構文シュガーです)。

例:

>>> 2 * [1,2]
[1, 2, 1, 2]
19
Jeremy Brown

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'
13
jathanism

繰り返し処理しているリスト内のアイテムではなく、「1 + 0.01」倍のgrowthRateリストを乗算しています。 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])
3
Sam Dolan

この行では:

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

growthRatesはシーケンス([3,4,5,0,3])。そのシーケンスにfloat(0.1)を掛けることはできません。そこに置きたいものはiのように見えます。

ちなみに、iはその変数の素晴らしい名前ではありません。 growthRaterateなど、より説明的なものを検討してください。

2
nmichaels

この行では:

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

私はあなたがこれを意味すると思う:

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

FloatにgrowthRates(リスト)を掛けようとすると、そのエラーが発生します。

1

GrowthRatesはシーケンスであり(繰り返し処理を行っているのです!)、それに(1 + 0.01)を掛けます。これは明らかにフロート(1.01)です。 for growthRate in growthRates: ... * growthrate

0
user395760