Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чаплыгин А.Н. Учимся програмировать вместе с Пи...doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

Глава 6. Циклы

§6.1. Оператор цикла while

В предыдущей главе мы столкнулись с необходимостью повторения некоторых блоков кода в процессе выполнения вычислений. В некотором смысле, мы справились с этой проблемой, использовав рекурсию, но ее использование далеко не всегда оправдано. Во-первых, разобраться, как работает рекурсивная функция не так-то просто, а это означает, что расширение функциональности программы будет затруднено, особенно если над ней будет работать не один программист, а целая команда. Во-вторых, рекурсивные функции очень «прожорливы» - для их выполнения требуется много оперативной памяти, да ограничение максимального размера стека вызовов тоже создает некоторые трудности.

Разумеется, не мы первые так подумали. В первой главе мы уже говорили о том, что еще во времена низкоуровневых языков программирования была замечена необходимость в повторах блоков кода. Поэтому все высокоуровневые языки программирования имеют специальные операторы, позволяющие организовывать циклы в программах. Такие операторы обычно так и называют: операторами цикла.

Каждый циклический оператор имеет тело цикла- некий блок кода, который интерпретатор будет повторять пока условие повторения цикла будет оставаться истинным.

В языке Питон оператор цикла выглядит так:

while УСЛОВИЕ_ПОВТОРЕНИЯ_ЦИКЛА: ТЕЛО_ЦИКЛА

Очень похоже на оператор условия - только здесь используется другое ключевое слово: while (англ. «пока»). Где его можно использовать? Первое, что приходит в голову: повтор ввода данных пользователем, пока не будет получено корректное значение:

correct_choice = False

while not correct_choice:

choice = raw_input("Enter your choice, please (1 or 2):")

if choice == "1" or choice == "2":

correct_choice = True

else:

print "Invalid choice! Try again, please."

print "Thank you."

Перед началом цикла мы определили логическую переменную correct_choice, присвоив ей значение False. Затем оператор цикла проверяет условие not correct_choice: отрицание False - истина. Поэтому начинается выполнение тела цикла: выводится приглашение "Enter your choice, please (1 or 2) :" и ожидается ввод пользователя. После нажатия клавиши [Enter] введенное значение сравнивается со строками "1" и "2", и если оно равно одной из них, то переменной correct_choice присваивается значение True. В противном случае программа выводит сообщение "invalid choice ! Try again, please . ". Затем оператор цикла снова проверяет условие и если оно по-прежнему истинно, то тело цикла повторяется снова, иначе поток выполнения переходит к следующему оператору, и интерпретатор выводит строку "Thank you.". Как видите, все довольно просто.

64

Ревизия: 170

Циклы

Упражнение. Наберите программу в файле и поэкспериментируйте с ней: попробуйте вводить различные строки и цифры. Правильно ли работает программа?

§6.2. Счетчики

Еще один вариант использования оператора цикла - вычисление формул с изменяющимся параметром. В одном из упражнений предыдущей главы было задание с

п

помощью рекурсивной функции вычислить формулу 2^,i —I +... + п при заданном п. В

г = 1

данном случае изменяющимся параметром является /', причем /' последовательно принимает значения в диапазоне от 1 до п.

С помощью оператора цикла while решение будет выглядеть так:

n = input("Input n, please:")

sum = 0

i = 1

while i <= n:

sum = sum + i**3 #Тоже самое

можно

записать

короче:

sum +=

i**3

i = i + 1 #Аналогично

i +=

1

print "sum = ", sum

Разберемся, как работает эта программа. Сначала пользователь вводит п - граничное значение i. Затем производится инициализация переменных sum (в ней будет храниться результат, начальное значение - 0) и счетчика i (по условию, начальное значение - 1). Далее начинается цикл, который выполняется, пока i <= п. В теле цикла в переменную sum записывается сумма значения из этой переменной, полученная на предыдущем шаге, и значение i, возведенное в куб; счетчику i присваивается следующее значение. После завершения цикла выводится значение s um после выполнения последнего шага.

Следующее значение счетчика получают прибавлением к его текущему значению шага цикла (в данном случае шаг цикла равен 1). Шаг цикла при необходимости может быть отрицательным, и даже дробным. Кроме того, шаг цикла может изменяться на каждой итерации (т.е. при каждом повторении тела цикла).

Теперь давайте попробуем оптимизировать нашу программу. Итак на каждой итерации в теле цикла мы вычисляем следующее значение счетчика. Но на последнем шаге мы вычислем его лишний раз - его новое значение уже использоваться не будет. Конечно, эта операция не требует каких-то особых ресурсов, но привычку обращать внимание на подобные вещи следует вырабатывать, т.к. впоследствии вы, наверняка, будете иметь дело с более сложными операциями. Как избежать выполнения лишнего вычисления? Что если вычислять значение i до вычисления формулы? Давайте попробуем.

n = input("Input n,

please

")

sum = i = 0

while i <= n:

65

Ревизия: 170

Циклы

i += 1

sum +=

i**3

print "sum

II

f

sum

Обратите внимание, на запись вида sum = i = 0. Она работает аналогично простому присваиванию значения переменной, но в данном случае обе переменные получают одинаковое начальное значение.

Итак, теперь начальное значение i равно 0, но на первом шаге мы сразу же прибавляем к нему единицу. В результате программа выдает те же результаты, что и предыдущая ее модификация. Изменилось ли количество операций?

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

Упражнение. Напишите программу, которая с помощью оператора цикла while выводит все четные числа от 0 до заданного пользователем п.