Вы получили логику c в обратном направлении. В настоящее время ваш код будет (пытаться) продолжать выполнять содержимое блока while до тех пор, пока ввод действителен, но не будет, поскольку в блоке while есть возврат. Между тем, блок else будет запускаться только один раз . Так что вы, вероятно, захотите
while (index < 0 or index > word_length): #the 'invalid' input
index = int(input(prompt)) #keep attempting to get new input
else: #when we reach this block, the input is valid
index_word = word[index] #so this is run once
return index_word
Перечитайте ваш Python do c. Первый блок while l oop выполняется до тех пор, пока указанное условие истинно, а блок else (если есть) выполняется только один раз, когда условие больше не истинно, за исключением случаев, когда первый блок завершается с возвратом, перерыв или выбрасывание исключения. Вполне возможно, что условие уже ложно перед вводом while-else, поэтому в этом случае первый блок never run, тогда как блок else все еще выполняется один раз.