2015-04-26 8 views
1

Я пытаюсь изучить Python между мыслями о проектах, относящихся ко мне, и использовать teamtreehouse, хотя это медленный прогресс.Python 3.3 Внутреннее вложение в то время, когда Loop не выводится

Цель: иметь внутренний цикл, рассчитать стоимость отдельного семестра класса через год, а затем распечатать его. Этот внутренний цикл будет выполняться 5 раз.

Наружная петля должна работать только один раз, чтобы распечатать основные отпечатки.

Вместо этого я получаю эту ошибку, хотя я определил i (переменную счетчика) как первую строку каждого цикла while?

Ошибка:

This program will display the projected semester tuition amount for the next 5 years for full-time students.                  
This will be calculated with a $6,000 per semester tuition with a 2% yearly increase for 5 years.                    
Traceback (most recent call last):                                    
    File "main.py", line 26, in <module>                                   
    while i in range(1, years + 1):                                    
NameError: name 'i' is not defined 

КОД

#////////MAIN PROGRAM START////////////// 
print('This program will display the projected semester tuition amount for the next 5 years for full-time students.') 
print('This will be calculated with a $6,000 per semester tuition with a 2% yearly increase for 5 years.') 

#////////FORMULA START////////////// 
#def formula(): 

#//////VARIABLES 
#///increase of tuition % 
yearlyIncrease=0.02 
#///increase of tuition % 

#/////counter variables 
years=1 
semester=1 
semesters=2 
#/////counter variables 

tuitionTotalPre=0 
tuitionCost=12000 
tuitionTotalPost=0 
semesterCost=0 
#//////VARIABLES 

#print(‘Tuition for ‘ year ‘is ‘ tuitionTotal 
while i in range(1, years + 1): 
    i=0 
    print('The cost of tuition for a semester this year is.') 
    tuitionTotalPre=tuitionCost*yearlyIncrease 
    tuitionTotalPost=tuitionCost+tuitionTotalPre 
    tuitionCost=tuitionTotalPost 
    semester=1 
    while i in range(1, semesters + 1): 
     i=0 
     semesterCost=tuitionTotalPost/2 
     print(semesterCost) 
     semester=semester+1 
    years=years+1 

#////////FORMULA END////////////// 
#formula() 

#////////MAIN PROGRAM END////////////// 
+1

Пожалуйста, не редактируйте свой вопрос в новый вопрос; с вашими комментариями я понял, что пропустил деталь в вашем вопросе, но позволяю этому * повторно использовать для других * и не делать ответы недействительными, изменяя свой код каждый раз, когда вы попадаете в новую проблему. –

ответ

2

Вы хотели for петлю здесь:

for i in range(1, years + 1): 

и

for i in range(1, semesters + 1): 

for петли принимают итерацию (здесь вывод выражения range(1, years + 1)) и присваивает каждому значению, полученному этим итерабельным для целевой переменной (i).

A while петля принимает условие вместо; выражение, которое контролирует, или цикл не продолжается. Если это правда, тело цикла запускается, иначе это не так.

Так что в вашем случае выражение while является i in range(1, years + 1), который спрашивает, если значение в уже существующей переменной i является членом range(1, years + 1) результата. Поскольку у вас нет переменной i, заданной до ввода инструкции while, вы получаете исключение NameError.

Дальше вы не увеличивали бы years и semester в цикле. У вас range() произведите все номера вместо вас; если у вас есть 3-х лет и 5 семестров, установить эти значения первого, так что вы можете создать диапазон цикл по:

years = 3 
semesters = 5 

for year in range(1, years + 1): 
    # will loop through 1, 2, and 3 
    for semester in range(1, semesters + 1): 
     # will loop through 1, 2, 3, 4 and 5 for each year 

Обратите внимание, что я выбрал более информативные имена здесь, i не является действительно полезным именем ,

Если вы знакомы с термином, цикл Python for - это Foreach loop construct, и ничего подобного конструкции C for.

+0

Большое спасибо Martijn! Теперь я преобразовал это в цикл for, хотя теперь мое замешательство заключается в том, что можно просто запустить цикл калькулятора внутреннего семестра только один раз. По существу один запуск внутреннего вложенного цикла в каждый цикл внешнего цикла? – L2g2h

+0

@ L2g2h: вот что происходит. –

+0

@ L2g2h: но у вас есть диапазоны, созданные только для того, чтобы производить ** одно ** целое число. Вы не увеличиваете число в цикле, это то, что должен делать 'range()' фронт. –