2013-08-07 4 views
0

tl; dr: Мой код «работает», поскольку он дает мне ответ, который мне нужен. Я просто не могу заставить его перестать работать, когда он достигнет этого ответа. Я застрял в прокрутке назад.Новичок Python: Где «пока»?

Я полный новичок в программировании/Python. Чтобы отточить свои навыки, я решил посмотреть, смогу ли я запрограммировать свой собственный «решатель» для «Подразумеваемый риск риска для собственного капитала» от класса оценки профессора Дамодарана. По сути, код вводит некоторые входы и «догадки и тесты» серии процентных ставок, пока не получит «близкое» значение для ввода.

Прямо сейчас мой код выплевывает список выходных данных, и я могу прокрутить его назад, чтобы найти ответ. Это верно. Тем не менее, я не могу на всю жизнь получить код «стоп» с правильным значением с помощью , а.

У меня есть следующий код:

per = int(input("Enter the # of periods forecast ->")) 
divbb = float(input("Enter the initial dividend + buyback value ->")) 
divgr = float(input("Enter the div + buyback growth rate ->")) 
tbondr = float(input("Enter the T-Bond rate ->"))+0.000001 
sp = int(input("Enter the S&P value->")) 

total=0 
pv=0 


for i in range(1,10000): 
    erp = float(i/10000) 
    a = divbb 
    b = divgr 
    pv = 0 
    temppv = 0 
    print (sp-total, erp) 
    for i in range(0, per): 
     a=a * (1+b) 
     temppv = a/pow((1+erp),i) 
     pv=pv+temppv 
    lastterm=(a*1+tbondr)/((erp-tbondr)*pow(1+erp,per)) 
    total=(pv+lastterm) 

на его примере, с входами:

  • за = 5
  • divbb = 69,46
  • divgr = 0,0527
  • tbondr = 0,0176
  • sp = 1430

Прокрутка назад через выход, я вижу, что мой код дает правильный минимум при epr = 0.0755.

Мой вопрос: где я придерживаюсь , а, чтобы остановить этот код на таком минимуме? Я пробовал много вариаций, но не могу понять. Я ищу, в основном:

while (sp-total)> | 1 |, продолжайте работать с кодом.

+0

Вам не нужно 'while' - это тип цикла. Вам нужно «if», чтобы вырваться из вашего текущего цикла. Может быть, 'если sp - total <1: break' после' print' – voithos

ответ

1
per = 5 
divbb = 69.46 
divgr = 0.0527 
tbondr = 0.0176 
sp = 1430 

total=0 
pv=0 

i = 1 
while(abs(sp-total)) > 1: 
    erp = i/10000. 
    a = divbb 
    b = divgr 
    pv = 0 
    temppv = 0 
    print (sp-total, erp) 
    for j in range(0, per): 
     a=a * (1+b) 
     temppv = a/pow((1+erp),j) 
     pv=pv+temppv 
    lastterm=(a*1+tbondr)/((erp-tbondr)*pow(1+erp,per)) 
    total=(pv+lastterm) 
    i += 1 

должно работать. Очевидно, что существует миллион способов сделать это. Но общий смысл в том, что цикл while остановится, как только он удовлетворит условие. Вы также можете тестировать каждый раз в цикле for и включать оператор break, но поскольку вы не знаете, когда он остановится, я думаю, что цикл while лучше в этом случае.

Позвольте мне дать вам краткий список из двух различных способов вы могли бы решить проблему так:

Используя время цикла:

iterator = start value 
while condition(iterator): 
    do some stuff 
    increment iterator 

Использование для цикла:

for i in xrange(startvalue, maxvalue): 
    do some stuff 
    if condition: 
     break 

Еще две вещи: если вы делаете большие диапазоны, используйте генератор xrange. Кроме того, это, вероятно, плохая идея повторного использования i внутри вашего цикла for.

Я рекомендую CS101 от Udacity.com для изучения Python.Кроме того, если вас интересуют алгоритмы, работайте над проблемами на projecteuler.com

+0

Это работало 99,9% пути (останавливается на 0,754, а не 0,755. Думаю, я могу это решить)! Я не уверен, что мне не хватало, казалось, все пробовал. Я ценю быстрый ответ и советы! –

+0

@JarbyMcGroo О, кричит. Он не печатает последний, потому что цикл while не запускается снова! Поскольку тест преуспевает, он не печатает. Ниже цикла while вы можете распечатать переменную, она должна быть правильной. – vroomfondel

+0

@ragaos Еще раз спасибо! Я на самом деле только начинаю работать по курсу Udacity. Я решил сделать перерыв, чтобы узнать, могу ли я применить основы для решения «реальной» проблемы. Не совсем! –

Смежные вопросы