Python 3.3 Внутренний вложенный, пока цикл не выводится

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

Цель: заставить внутренний цикл вычислить стоимость семестра отдельного занятия в течение одного года, а затем распечатать результат. Этот внутренний цикл будет выполняться всего 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//////////////

person L2g2h    schedule 26.04.2015    source источник
comment
Пожалуйста, не редактируйте свой вопрос в новый вопрос; с вашими комментариями я понял, что упустил деталь в вашем вопросе, но давайте оставим это повторно используемым для других и не будем делать ответы недействительными, изменяя ваш код каждый раз, когда вы сталкиваетесь с новой проблемой.   -  person Martijn Pieters    schedule 26.04.2015


Ответы (1)


Вам нужен цикл for здесь:

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

а также

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

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

Вместо этого цикл 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 и ничего подобного конструкция C for.

person Martijn Pieters    schedule 26.04.2015
comment
Спасибо большое Мартейн! Теперь я преобразовал это в цикл for, хотя теперь я запутался в том, можно ли просто запустить внутренний цикл калькулятора семестра только один раз. По сути, один запуск внутреннего вложенного цикла for для каждого запуска внешнего цикла for? - person L2g2h; 26.04.2015
comment
@ L2g2h: но у вас настроены диапазоны для получения только одного целого числа. Вы не увеличиваете число в цикле, это то, что range() должен делать заранее. - person Martijn Pieters; 26.04.2015