views:

158

answers:

7

Hello! I am attempting to script a short code to figure out the number of days it takes to reach a given principal in the bank due to daily interest. Using my code below does not yield any errors when run in IDLE, but the counter returns 0. Any ideas what I missed?

def main():
    # irrelevant code elided by msw, Bal, Int and Tar are numeric
    counter = 0
    for i in range(0):
        if (Bal * Int) == Tar:
            print '1'
        else:
            counter + 1
    print counter
A: 

That's because you put range(0) which is an empty loop. Perhaps you could consider a while loop?

John Smith
A: 

Your loop for i in range(0) doesn't actually execute. range(0) returns an empty list [] which will skip the body of your for loop.

g.d.d.c
A: 

Please explain what you think this does? Please update your question with an English-language explanation of how many times you think this look will work.

counter = 0
for i in range(0):
    if (Bal * Int) == Tar:
        print '1'
    else:
        counter + 1

Hint. The answer is zero. The question is "why?" and "what were you trying to do?"

S.Lott
+5  A: 

I'm not sure what you're getting at with this loop:

for i in range(0):
    if (Bal * Int) == Tar:
        print '1'
    else:
        counter + 1
  1. range(0) is an empty list, so the loop won't execute at all.
  2. counter + 1 simply calculates one more than counter, it won't increment counter, you probably mean counter += 1
  3. There's nothing in the loop that changes at each iteration, so if you ever get into it, it will be an infinite loop.
Ned Batchelder
Essentially, I am using the counter to try and generate the number of days needed to reach the target (Tar) balance in the account.
Greg Schmidt
@Greg Schmidt: "I am using the counter to try and generate the number of days needed". No, you're not. Read the answer. That loop does nothing.
S.Lott
+3  A: 

I believe the formula to calculate final balance with interest is:

Final = Principal * ( 1 + interest ) ** interest_period

Assuming I got this correct, then you can find out how many interest periods it will take by:

def how_long(start_money, interest_rate, final_money):
    day = 0
    money = start_money
    while True:
        if money >= final_money:
            break
        day += 1
        money = start_money * (1 + interest_rate)**day

    return day, money
awkwardturtle
Instead of the "while True:/if not condition:/break" caper, consider `while money < final_money:`
John Machin
A: 

You have been told the three or more problems with your code. If there's no particular reason to use a loop, it's better calculated with a formula:

future_value = present_value * (1 + interest_rate_per_period) ** number_of periods

or, for short,

f = p * (1 + i) ** n
f / p = (1 + i) ** n
log(f / p) = n * log(1 + i)
n = log(f / p) / log(i + i)

Example: I have $5000; how many years will it take to grow to $10000 at 10% per annum?

>>> from math import log
>>> f = 10000.0
>>> p = 5000.0
>>> i = 0.1
>>> n = log(f / p) / log(1 + i)
>>> n
7.272540897341713
>>>
John Machin
+2  A: 
In [5]: def test():
   ...:     for i in range(0):
   ...:         return '1'
   ...:     
   ...:     

In [6]: x = test()

In [7]: print x
------> print(x)
None

See the return value is 'None'. I don't know what are you trying to do. But The basic mistake is the Argument of range(x) function. The range(0) always return empty list.

Tauquir