Цикли в програмуванні. цикл while
Цикли є такою ж важливою частиною структурного програмування, як умовні оператори. За допомогою циклів можна організувати повторення виконання ділянок коду. Потреба в цьому виникає досить часто. Наприклад, користувач послідовно вводить числа, і кожне з них потрібно додавати до загальної суми. Або потрібно вивести на екран квадрати ряду натуральних чисел і тому подібні завдання.
цикл while
"While" перекладається з англійської як "поки". Але не в сенсі "до побачення", а в сенсі "поки маємо це, робимо те".
Можна сказати, while є універсальним циклом. Він присутній у всіх мовах, які підтримують структурне програмування, в тому числі в Python. Його синтаксис узагальнено для всіх мов можна висловити так:
while логічний_вираз {вираз 1; ... вираз n; }
Це схоже на умовний оператор if. Однак в разі циклічних операторів їх тіла можуть виконуватися далеко не один раз. У разі if, якщо логічний вираз в заголовку повертає істину, то тіло виконується один раз. Після цього потік виконання програми повертається в основну гілку і виконує такі вирази, розташовані нижче всієї конструкції умовного оператора.
У разі while, після того як його тіло виконано, потік повертається до заголовка циклу і знову перевіряє умова. Якщо логічний вираз повертає істину, то тіло знову виконується. Потім знову повертаємося до заголовку і так далі.
Цикл завершує свою роботу тільки тоді, коли логічний вираз в заголовку повертає брехня, тобто умова виконання циклу більше не дотримується. Після цього потік виконання переміщається до виразів, розташованим нижче всього циклу. Кажуть, "відбувається вихід з циклу".
Розгляньте блок-схему циклу while.
На ній яскраво-блакитними прямокутниками позначена основна гілка програми, ромбом - заголовок циклу з логічним виразом, бірюзовим прямокутником - тіло циклу.
З циклом while можливі дві виняткові ситуації:
Якщо при першому заході в цикл логічне вираз повертає False, то тіло циклу не виконується жодного разу. Цю ситуацію можна вважати нормальною, так як при певних умовах логіка програми може припускати відсутність необхідності у виконанні виразів тіла циклу.
Якщо логічний вираз в заголовку while ніколи не повертає False, а завжди залишається рівним True, то цикл ніколи не завершиться, якщо тільки в його тілі немає оператора примусового виходу з циклу (break) або викликів функцій виходу з програми - quit (), exit ( ) в разі Python. Якщо цикл повторюється і повторюється нескінченну кількість разів, то в програмі відбувається зациклення. В цей час вона зависає і самостійно завершитися не може.
Згадаймо наш приклад з уроку про виключення. Користувач повинен ввести ціле число. Оскільки функція input () повертає рядок, то програмний код повинен перетворити введене до целочисленному типу за допомогою функції int (). Однак, якщо були введені символи, які не є цифрами, то виникає виняток ValueError, яке обробляється гілкою except. На цьому програма завершується.
Іншими словами, якби програма передбачала подальші дії з числом (наприклад, перевірку на парність), а вона його не отримала, то єдине, що програма могла зробити, це закінчити свою роботу достроково.
Але ж можна просити і просити користувача коректно вести число, поки він його не введе. Ось як може виглядати який реалізує це код:
n = input ( "Введіть ціле число:") while type (n)! = int: try: n = int (n) except ValueError: print ( "Неправильно ввели!") n = input ( "Введіть ціле число:") if n% 2 == 0: print ( "Парне") else: print ( "Непарне")
Примітка 1. Не забуваємо, в мові програмування Python в кінці заголовків складних інструкцій ставиться двокрапка.
Примітка 2. У вираженні type (n)! = Int за допомогою функції type () перевіряється тип змінної n. Якщо він не дорівнює int, т. Е. Значення n не є цілим числом, а є в даному випадку рядком, то вираз повертає істину. Якщо ж тип n дорівнює int, то дане логічне вираз повертає брехня.
Примітка 3. Оператор% в мові Python використовується для знаходження залишку від ділення. Так, якщо число парне, то воно без залишку ділиться на 2, т. Е. Залишок буде дорівнює нулю. Якщо число непарне, то залишок буде дорівнює одиниці.
Простежимо алгоритм виконання цього коду. Користувач вводить дані, вони мають строковий тип і присвоюються змінної n. У заголовку while перевіряється тип n. При першому вході в цикл тип n завжди строковий, т. Е. Він не дорівнює int. Отже, логічне вираз повертає істину, що дозволяє зайти в тіло циклу.
Тут в гілці try відбувається спроба перетворення рядка до целочисленному типу. Якщо вона була вдалою, то гілка except пропускається, і потік виконання знову повертається до заголовку while.
Тепер n пов'язана з цілим числом, отже, її тип int, який не може бути не дорівнює int. Він йому дорівнює. Таким чином логічний вираз type (n)! = Int повертає False, і весь цикл завершує свою роботу. Далі потік виконання переходить до оператора if-else, що знаходиться в основний гілці програми. Тут могло б перебувати що завгодно, не обов'язково умовний оператор.
Повернемося назад. Якщо в тілі try спроба перетворення до числа була невдалою, і було викинуто виключення ValueError, то потік виконання програми відправляється в гілку except і виконує знаходяться тут вираження, останнє з яких просить користувача знову ввести дані. Мінлива n тепер має нове значення.
Після завершення except знову перевіряється логічне вираз в заголовку циклу. Воно дасть True, т. К. Значення n і раніше рядок.
Вихід з циклу можливий тільки тоді, коли значення n буде успішно конвертовано в число.
Розглянемо наступний приклад:
total = 100 i = 0 while i <5: n = int (input ()) total = total - n i = i + 1 print ( "Залишилося", total)
Скільки разів "прокрутиться" цикл в цій програмі, т. Е. Скільки ітерацій він зробить? Відповідь: 5.
Спочатку змінна i дорівнює 0. У заголовку циклу перевіряється умова i <5, і воно істинне. Тіло циклу виконується. У ньому змінюється значення i, шляхом додавання до нього одиниці.
Тепер змінна i дорівнює 1. Це менше п'яти, і тіло циклу виконується вдруге. У ньому i змінюється, її нове значення 2.
Два менше п'яти. Тіло циклу виконується втретє. Значення i стає рівним трьом.
Три менше п'яти. На цій ітерації i присвоюється 4.
Чотири і раніше менше п'яти. До i додається одиниця, і тепер її значення дорівнює п'яти.
Далі починається шоста ітерація циклу. Відбувається перевірка умови i <5. Але оскільки тепер воно повертає брехня, то виконання циклу переривається, і його тіло не виконується.
"Смислове навантаження" даного циклу - це послідовне віднімання з змінної total чисел, що вводяться. Мінлива i в даному випадку грає тільки роль лічильника ітерацій циклу. В інших мовах програмування для таких випадків передбачений цикл for, який так і називається: "цикл з лічильником". Його перевага полягає в тому, що в тілі циклу не треба змінювати змінну-лічильник, її значення змінюється автоматично в заголовку for.
У мові Python теж є цикл for. Але це не цикл з лічильником. У Пітоні він призначений для перебору елементів послідовностей та інших складних об'єктів. Даний цикл і послідовності будуть вивчені в наступних уроках.
Для while наявність лічильника не обов'язково. Уявімо, що треба вводити числа, поки змінна total більше нуля. Тоді код буде виглядати так:
total = 100 while total> 0: n = int (input ()) total = total - n print ( "Ресурс вичерпаний")
Скільки разів тут виконається цикл? Невідомо, все залежить від вводятьсязначень. Тому у циклу з лічильником відомо кількість ітерацій, а у циклу без лічильника - немає.
Найголовніше для циклу while - щоб в його тілі відбувалися зміни значень змінних, які перевіряються в його заголовку, і щоб хоч коли-небудь наступив випадок, коли логічний вираз в заголовку повертає False. Інакше станеться зациклення.
Примітка 1. Не обов'язково в виразах total = total - n і i = i + 1 повторювати одну і ту ж змінну. В Python допустимо скорочений спосіб запису подібних виразів: total - = n і i + = 1.
Примітка 2. При використанні лічильника він не обов'язково повинен збільшуватися на одиницю, а може змінюватися в будь-яку сторону на будь-яке значення. Наприклад, якщо треба вивести числа кратні п'яти від 100 до 0, то зміна лічильника буде таким i = i - 5, або i - = 5.
Примітка 3. Для лічильника не обов'язково використовувати змінну з ідентифікатором i. Можна назвати змінну-лічильник як завгодно. Однак так прийнято в програмуванні, що лічильники позначають іменами i і j (іноді одночасно потрібні два лічильника).
Практична робота
Змініть останній код з уроку так, щоб змінна total не могла піти в мінус. Наприклад, після попередніх вирахувань її значення стало рівним 25. Користувач вводить число 30. Однак програма не виконує віднімання, а виводить повідомлення про неприпустимість операції, після чого здійснює вихід з циклу.
Використовуючи цикл while, виведіть на екран для числа 2 його ступеня від 0 до 20. Піднесення до степеня в Python позначається як **. Фрагмент виведення:
... 32 64 128 256 512 1024 ...
Приклади розв'язання в android-додатку і pdf-версії курсу.
Скільки ітерацій він зробить?