2010-08-31 35 views
21

cấp: mới bắt đầukhông thể nhân chuỗi bởi non-int thuộc loại 'float'

tại sao tôi gặp lỗi "không thể nhân chuỗi bởi non-int của loại '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]) 

nhờ Baba

+0

Tôi muốn 'SavingsRecord.append (fund)' thay vì 'SavingsRecord + = [quỹ,] ', nó * có thể * nhanh hơn. –

+0

Có thể trùng lặp với [Tại sao tôi nhận được TypeError: không thể nhân chuỗi bởi non-int của loại 'float'?] (https://stackoverflow.com/questions/485789/why-do-i-get-typeerror-cant-multiply-sequence-by-non-int-of-type-float) –

+1

@StephanWeinhold, bài đăng đó là ngày 2012. Câu hỏi này đã được đăng trong năm 2010. – raoulbia

Trả lời

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

nên là:

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

Bạn đang nhân 0.01 với đối tượng danh sách growthRates. Nhân một danh sách bằng một số nguyên là hợp lệ (nó là đường cú pháp quá tải cho phép bạn tạo một danh sách mở rộng với các bản sao của các tham chiếu phần tử của nó).

Ví dụ:

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

Bạn đang multipling "1 + 0.01" lần so với danh sách growthRate của bạn, không phải là mặt hàng trong danh sách mà bạn đang iterating qua. Tôi đã đổi tên thành i thành rate và sử dụng thay vào đó. Xem mã cập nhật dưới đây:

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 thực sự tuyệt vời ... Chỉ với 11 lượt xem, có 5 câu trả lời chính xác trong vòng một phút. – sdolan

0

Vì growthRates là một chuỗi (bạn thậm chí lặp lại nó!) Và bạn nhân nó bằng (1 + 0,01), mà rõ ràng là một phao (1,01). Tôi đoán bạn có nghĩa là for growthRate in growthRates: ... * growthrate?

1

Trong dòng này:

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

Tôi nghĩ rằng bạn có ý nghĩa này:

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

Khi bạn cố gắng để nhân một phao bởi growthRates (mà là một danh sách), bạn nhận được lỗi đó.

7

Python cho phép bạn nhân các chuỗi để lặp lại các giá trị của chúng. Dưới đây là một ví dụ trực quan:

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

Nhưng nó không cho phép bạn làm điều đó với số dấu chấm động:

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

Trong dòng này:

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

growthRates là một trình tự ([3,4,5,0,3]). Bạn không thể nhân chuỗi đó bằng một phao (0.1). Có vẻ như những gì bạn muốn đặt ở đó là i.

Ngẫu nhiên, i không phải là tên tuyệt vời cho biến đó. Xem xét điều gì đó mang tính mô tả hơn, như growthRate hoặc rate.

+0

@All: Cảm ơn bạn đã trả lời nhanh chóng. @Nathon: Tôi rất vui vì bạn đã đưa ra nhận xét về tên biến. Điều quan trọng là phải có được kỷ luật cú pháp ngay từ đầu khi học lập trình. – raoulbia

0

Tôi đã gặp sự cố tương tự và đã giải quyết ngay bây giờ. Rất có thể là giá trị bao gồm thứ gì đó như '1,234,56', nếu có, hãy xóa ',' bằng cách sử dụng str.replace (',', '')

Các vấn đề liên quan