Цикл for выполняется только 1 раз, хотя в диапазоне 5 - PullRequest
0 голосов
/ 02 апреля 2012

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

def input_scores():
scores = []
y = 1
for num in range(5):
    score = int(input(print('Please enter your score for test %d: ' %y)))

    while score < 0 or score > 100:
        print ('Error --- all test scores must be between 0 and 100 points')
        score = int(input('Please try again: '))
    scores.append(score)
    y += 1
    return scores   

Когда я его запускаю, вывод будет следующим:

Please enter your score for test 1: 
None

Затем я введу результаты теста рядом с None,как, скажем, 95 Затем он проходит через остальную часть программы, не запрашивая у меня следующую оценку теста для добавления в список результатов.Мне действительно любопытно, почему это

Заранее спасибо, что нашли время помочь

С уважением, ~ Дастин

Ответы [ 5 ]

6 голосов
/ 02 апреля 2012

Вы возвращаетесь из цикла. Переместить return scores на один отступ влево.

3 голосов
/ 02 апреля 2012

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

def input_scores():
    scores = []
    y = 1
    for num in range(5):
        score = int(input('Please enter your score for test %d: ' %y))
        while score < 0 or score > 100:
            print ('Error --- all test scores must be between 0 and 100 points')
            score = int(input('Please try again: '))
        scores.append(score)
        y += 1
    return scores
0 голосов
/ 02 апреля 2012

Другие правильно отметили, что проблема с отступом в вашем операторе возврата. Кроме того, вы можете попробовать это так, используя len (баллы) для управления циклом, как предложено @max:

def input_scores(num_tests=5, max=100, min=0):
    scores = []
    while len(scores) < num_tests:
        score = int(input('Please enter your score for test {0}: '.format(len(scores)+1)))
        if score < min or score > max: 
            print ('Error --- all test scores must be between 0 and 100 points.')
        else:
            scores.append(score)
    return scores
0 голосов
/ 02 апреля 2012

Вы return ing scores в конце каждой итерации цикла (другими словами, после завершения первой итерации цикла вы возвращаете все оценки, выходя из функции и цикла).*

Измените свой код на:

for num in range(5):
    # ...
return scores    # Note the indentation is one tab less than the loop's contents
0 голосов
/ 02 апреля 2012

Вы отступали от кода кажется странным. Похоже, что оператор return находится внутри области действия цикла for. Таким образом, после первой итерации оператор return полностью выводит вас из функции.

...