НМЦ

Програмування мовою Python: основи та практика

Електронний посібник

ВФПО

ТЕМА 6. ЛОГІЧНІ ВИРАЗИ І ЛОГІЧНИЙ ТИП ДАНИХ

 

 

 

 

Уроки Python з нуля / #6 – Цикли та оператори в них (for, while)

 

Презентація. Циклічні оператори №6

 

 

Часто виникає потреба у програмуванні та у повсякденному житті виконати дії кілька разів. Це може бути здійснено за допомогою циклів, які дають змогу повторювати операції.

 

Цикл складається з двох частин:

v заголовка та тіла

 

Цикл складається з двох частин: заголовка та тіла. У заголовку вказується умова, за якої цикл виконуватиметься, а тіло визначає дії, які повторюються. Наприклад, подивімося на ситуацію з першокласником, який має гроші на морозиво. Щоб перевірити, чи вистачить грошей, він купує морозиво і перевіряє залишок.

 

 

Один із видів циклів ‒ це цикл з передумовою, відомий також як цикл while.

Його умова перевіряється перед виконанням тіла циклу. У циклі while логічний вираз визначає умову виконання, а тіло ‒ операції, що виконуються, поки умова є істинною.

 

Синтаксис оператора циклу while:

while Логічний_вираз: Блок_інструкцій

 

Процес роботи циклу while полягає в обчисленні логічного виразу: якщо він істинний, виконується тіло циклу і умова знову перевіряється. Це триває доти, поки умова не стане хибною. Якщо умова спочатку хибна, тіло циклу не виконується.

У циклі while важливо, щоб умова перевірялася коректно, тобто значення логічного виразу було встановлене до першої перевірки. Також для завершення циклу умова має змінюватися. Цей цикл часто використовують, коли не можна точно визначити кількість повторень.

 

В оператора циклу є й «розширена» версія з ключовим словом else. Шаблон для оператора циклу в цьому випадку такий (жирним шрифтом виділено ключові елементи):

while умова:

команди_1

else:

команди_2

 

 

Крім while-блоку в цьому разі є ще й else-блок: після ключового слова elseдвокрапки :) розміщується блок команд, які виконуються тільки тоді, коли умова після інструкції while є хибною. Зокрема, на самому початку виконання оператора циклу перевіряється умова після інструкції while. Якщо умова хибна, виконуються команди в else-блоці, й на цьому робота оператора циклу закінчується. Якщо умова істинна, виконуються команди while-блоку. Після цього перевіряється умова. Якщо умова хибна, виконуються команди else-блоку, і закінчується робота оператора циклу. Якщо умова істинна, виконуються команди while-блоку, й знову перевіряється умова й так далі.

Якщо уважно проаналізувати цю схему, то нескладно зрозуміти, що команди else-блоку виконуються один і тільки один раз, до того ж на завершальній стадії виконання оператора циклу. Такого самого ефекту можна досягти, якщо ці команди розташувати поза оператором циклу одразу після нього. Тому з else-блоку було б мало користі, якби не два ключових слова (дві інструкції): break і continue. Інструкція break закінчує роботу оператора циклу без виконання else-блоку. Інструкція continue закінчує виконання поточного циклу й дає змогу перейти одразу до перевірки умови в while-блоці.

Специфіка оператора циклу така, що в командах циклу має бути закладена принципова можливість для зміни (як результат виконання цих команд) умови, яка перевіряється за кожний цикл. Інакше можемо отримати нескінченний цикл. Хоча, з іншого боку, навіть формально нескінченний цикл ще не означає, що код створено неправильно.

 

Приклади розв’язування задач

 

Приклад. Визначити кількість цифр натурального числа n:

n = int(input()) length = 0

while n > 0:

n = n // 10

length = length + 1 print(length)

 

Приклад. Обчислити суму непарних додатних чисел, менших за n.

n=int(input()) s=0

i=1

while i<n:

s=s+i

i=i+2

print(‘Сума непарних чисел =‘,s)

 

Замість команди s=s+i можна було використати еквівалентну їй команду s+=i, а замість команди i=i+1 – відповідно, команду i+=1.

 

 

Тип діапазон (range) є незмінюваною послідовністю цілих чисел.

Для задання діапазону призначені функції:

range(stop) задання послідовності  цілих чисел від 0 до stop-1 з кроком 1;

range(start, stop[, step]) ‒ задання послідовності, яка є арифметичною прогресію від start до stop-1 з кроком step. Якщо параметр step опущений, він як усталено дорівнює 1.

 

За функцією range(5) отримаємо діапазон в із елементів 0, 1, 2, 3, 4

За функцією range(1, 5) отримаємо діапазон в із елементів 1, 2, 3, 4

За функцією range(0, 10, 3) отримаємо діапазон в із елементів 0, 3, 6, 9 Для отримання діапазону, в якому значення зменшуватимуться, необхідно використовувати функцію range з трьома параметрами. Третій параметр має бути від’ємним, а перший більшим ніж другий.

За функцією range(0, -5, -2) отримаємо діапазон в із елементів 0, -2, -4. Проте вивести на екран елементи утвореного діапазону звичайними методами неможливо, зокрема:

>>> r = range(1, 5)

>>> r

range(1, 5)

Можна лише перевірити приналежність деякого числа до діапазону, використовуючи оператор in.

>>> 4 in r True

>>> 6 in r False

 

Якщо третій аргумент не вказано, то початково це значення дорівнює одиниці, а якщо не вказано перший аргумент, то його початкове значення нульове.

 

Ще одне зауваження стосується терміна віртуальний. Чому ми говоримо про числову послідовність, сформовану функцією range(), як про віртуальну? Насправді функція повертає деякий об’єкт, який допускає з собою таке поводження, як наче б це була послідовність чисел. Проте, якщо ми присвоїмо результат функції range() деякій змінній і потім захочемо перевірити значення цієї змінної, послідовності ми не побачимо буде формальне позначення результату з посиланням на назву функції range(). Щоб наочно побачити, що ж «заховано» всередині, можна скористатися функцією формування списків list(). Як аргумент цій функції передається результат виклику функції range(). Наприклад, результатом виразу list(range(1,6)) є список [1,2,3,4,5]. Однак звертаємо увагу, що для використання функції range() в операторі циклу for ніяких додаткових дій щодо «візуалізації» віртуальної послідовності робити не потрібно.

 

 

Крім циклу while, у Python також є цикл for, який дає змогу перебирати всі елементи у певній послідовності або наборі, наприклад, рядку, списку, словнику чи файлі. Він дає змогу виконати певну операцію для кожного елементу послідовності без необхідності працювати з індексами чи дбати про кількість елементів.

Порівняно з оператором циклу while, оператор циклу for можна було б назвати більш «спеціалізованим». З одного боку, оператор дуже гнучкий і ефективний. З іншого, його успішне використання може викликати певні труднощі, так би мовити, ідеологічного характеру.

 

Цикл for це формальний спосіб сказати «виконати певну дію для кожного елементу у множині M». Це підтримується різними типами даних, які можна перебирати. Отже, цикл for іноді називають циклом перегляду.

 

Синтаксис оператора циклу for записується так:

for Індексна_змінна in Послідовність:

Блок_інструкцій

 

На початку, індексній змінній надається значення першого елементу послідовності і тоді виконується блок інструкцій. Після цього індексній змінній надається значення наступного елементу в послідовності. Це триває до того моменту, коли індексна змінна отримає всі значення з послідовності.

Цикл for часто використовується для виконання операцій над усіма елементами послідовності або для виконання певної операції стільки разів, скільки елементів у послідовності. Хоча менш універсальний, застосовується швидше за цикл while.

 

У блоці команд оператора циклу можна використовувати інструкції break і continue. Ефект такий самий, як і під час використання цих інструкцій в операторі циклу while: виконання інструкції break призводить до завершення оператора циклу, а виконання інструкції continue призводить до завершення поточного циклу й переходу до наступного.

 

В операторі циклу for можна використовувати else-блок. Шаблон оператора циклу for із else-блоком має вигляд (жирним шрифтом виділено ключові елементи):

for елемент in список:

команди_1

else:

команди_2

 

Команди в else-блоці виконуються фактично після завершення оператора циклу, як би ми його розуміли без else-блоку. Весь «виграш» від else-блоку в тому, що якщо робота оператора циклу закінчується внаслідок виконання інструкції break, то команди в блоці else не виконуються.

 

 

Приклад. Вивести на екран квадрати додатних цілих чисел, менших за n.

n=int(input())

for i in range(1,n):

print(i**2)

Якщо значення змінної n буде дорівнювати нулю або від’ємне, то тіло циклу не виконається жодного разу.

 

Приклад. Наведімо програмний код, у якому сума натуральних чисел обчислюється за допомогою оператора циклу for.

print("Сума натуральних чисел")

n=100 # Кількість доданків

# Формуємо текст для відображення результату

text="1+2+...+"+str(n)+"="

# Змінна для запису суми

s=0

# Оператор циклу для обчислення суми

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

# Додаємо доданок до суми

s=s+i

# Відображаємо результат

print(text,s)

 

Приклад. Надрукувати числа від 10 до 1.

for i in range(10,0,-1):

print(i)

 

Приклад. Обчислити суму непарних додатних чисел з проміжку [n; m].

n=int(input())

if n%2==0:n=n+1

m=int(input())

s=0

for i in range(n,m+1,2):

s=s+i

print(Сума непарних чисел =‘,s)

У цій програмі спочатку уточнюється початок проміжку так, щоб початком було перше непарне число із заданого проміжку. Потім за функцією range(n,m+1,2) формується діапазон всіх непарних чисел із заданого проміжку і відбувається їх підсумовування.

 

Приклад. Обчислити суму непарних додатних чисел із проміжку [n; m]. Під час додавання до суми числа, яке ділиться націло на 5, припинити підсумовування. Вивести додаткове повідомлення, якщо результуюча сума містить доданок, який ділиться націло на 5.

n=int(input())

if n%2==0:n=n+1

m=int(input())

s=0

for i in range(n,m+1,2):

s=s+i

if i%5==0:

break

else:

print(‘Сума не містить доданку, що ділиться на 5’)

print(‘Сума непарних чисел =‘,s)

 

Суму можна обчислити за допомогою вбудованої функції sum(). Як аргумент функції передається список елементів, сума яких обчислюється. Зокрема, суму натуральних чисел від 1 до n (якщо значення цієї змінної задано) можемо обчислити командою sum(range(1,n+1)). Тут як аргумент функції sum() передається віртуальна послідовність range(1,n+1) – так теж можна робити.

 

 

Оператор continue призначений для переривання поточної ітерації циклу і переходу до наступної. Тобто оператори, що ітимуть в тілі циклу після виклику continue, на цьому кроці виконуватися не будуть.

 

Приклад. Обчислити суму непарних додатних чисел із проміжку [n; m], не включати до суми чисел, які діляться націло на 5.

n=int(input())

if n%2==0:n=n+1

m=int(input())

s=0

for i in range(n,m+1,2):

if i%5==0:

continue

s=s+i

print(‘Сума непарних чисел =‘,s)

Під час виконання тіла циклу, коли значення змінної i ділитиметься націло на 5 (залишок від цілочисельного ділення i на 5 дорівнює 0), відбувається перехід на наступний елемент послідовності.

 

 

Оператор break призначений для дострокового припинення роботи циклу (for або while), тобто зупинки виконання тіла циклу, навіть якщо умова виконання циклу ще не набула значення False або послідовність елементів не закінчилася.

Зрозуміло, інструкцію break варто викликати тільки всередині інструкції if, тобто вона має виконуватися тільки за виконання якоїсь особливої умови.

 

Приклад. Обчислити суму непарних додатних чисел із проміжку [n; m]. Під час додавання до суми числа, яке діляться націло на 5, припинити підсумовування.

n=int(input())

if n%2==0:n=n+1

 m=int(input())

s=0

for i in range(n,m+1,2):

s=s+i

if i%5==0:

break

print(‘Сума непарних чисел =‘,s)

 

 

В усіх операторах циклу мови Python оператор, який є тілом циклу, може сам бути оператором циклу або містити оператор циклу. Утворена конструкція називається вкладеним циклом.

 

Приклад. За даним натуральним n ≤ 9 вивести сходи з n сходинок, де i-а сходинка складається з чисел від 1 до i без пропусків.

n=int(input(‘Вкажіть n’))

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

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

print(j,end=‘‘)

print()

 

Завдання для самоперевірки

 

Завдання 1. Скласти програму обчислення значення функції на інтервалі, на якому вона визначена, із заданим кроком зміни аргументу.

 

1.             

 

2.                 

 

3.                

 

4.              

 

Завдання 2. Скласти програму обчислення суми та добутку.

Вимоги до програми:

v вхідні дані (початкове і кінцеве значення індексної змінної) вводяться оператором введення;

v на друк вивести обчислені значення суми та добутку.

 

1.

2.

3.

4.

 

Завдання 3. Скласти програму розв’язування задач із використанням оператора циклу з параметром.

1. Знайти суму всіх парних чисел натурального ряду від 10 до 92.

2. Знайти суму всіх непарних чисел натурального ряду від 1 до 100.

3. Обчислити добуток натуральних чисел від 12 до 20.

4. Обчислити добуток всіх парних натуральних чисел від 1 до 20.

 

 

Ø Оператор циклу while дає змогу багаторазово виконувати визначений наперед набір команд.

Ø Після ключового слова while в операторі циклу вказується умова. Оператор виконується, поки умова істинна. Умова перевіряється на початку виконання оператора і потім кожен раз після виконання групи команд оператора циклу.

Ø Оператор циклу for зручний у тому разі, коли необхідно перебрати елементи певної послідовності. Після ключового слова for указується змінна для виконання перебору елементів послідовності, яка так само розміщується після ключового слова in. Змінна послідовно набуває значення елементів послідовності, і для кожного такого значення виконується блок команд оператора циклу.

Ø Як послідовність, яка вказується в операторі циклу for, можна, крім іншого, використовувати текст, списки або віртуальну числову послідовність, створену за допомогою функції range().

Ø Інструкції break і continue використовуються в операторах циклу while і for відповідно для припинення виконання оператора циклу або для припинення виконання поточного циклу.

Ø В операторах циклу (while і for) може використовуватися else-блок, який виконується після закінчення роботи оператора і за умови, що закінчення роботи оператора циклу не пов’язане з виконанням інструкції break.

 

Питання для перевірки засвоєних знань

1. Що таке цикл з передумовою (цикл while) у Python?

2. Які основні компоненти циклу while?

3. Як відбувається перевірка умови у циклі while?

4. Як завершити виконання циклу while, коли умова стає хибною?

5. Як використовувати оператори break та continue у циклі while?

6. Як уникнути безкінечного циклу під час використання циклу while?

7. Які різниці між циклами while та for у Python?

8. Як використовувати умову else після циклу while?

9. Як можна застосувати цикл while для обробки списків чи рядків у Python?

10. Що таке функція range() у Python?

11. Які параметри можна передати функції range()?

12. Як створити діапазон чисел, що починається з 0 і закінчується певним числом?

13. Чи можливо використовувати від’ємні значення у функції range()?

14. Як вивести числа у зворотному порядку з використанням range()?

15. Чи можна використовувати дробові числа у функції range()?

16. Як можна використовувати функцію range() у циклі for?

17. Чи можна змінювати діапазон чисел після його створення функцією range()?

18. Як вивести парні/непарні числа за допомогою функції range()?

19. Чи можна використовувати функцію range() для створення списку чисел?

Попередня тема

На початок

Наступна тема