Потік керування#
У програмах, які ми бачили дотепер, завжди була послідовність рядків коду, сумлінно виконаних Python у точному порядку зверху вниз. Що, якби ви хотіли змінити потік виконування рядків коду? Наприклад, ви хочете, щоб програма приймала деякі рішення та виконувала різні дії залежно від різних ситуацій, наприклад, друкувала “Доброго ранку” або “Доброго вечора” залежно від часу доби?
Як ви могли здогадатися, це досягається за допомогою операторів потоку керування (англ.“control flow statements”). У Python є три операторa потоку керування: if
, for
і while
.
Оператор if
#
Оператор if
використовується для перевірки умови: якщо (англ.“if”) умова вірна (відповідає булевому значенню True), ми виконуємо блок рядків коду (званий if-block), інакше (англ.“else”) ми обробляємо інший блок рядків коду (званий else-block) . Блок else необов’язковий.
код python ‘if_elif_else_ukr.py’
число = 23
здогадка = int(input('Введіть ціле число : '))
if здогадка == число:
# Новий блок починається тут
print('Вітаємо, ви вгадали,')
print('(хоч і не виграли жодного призу!)')
# Новий блок закінчується тут
elif здогадка < число:
# Ще один блок
print('Ні, задане число трохи вище, ніж здогадка')
# Ви можете робити все, що завгодно в блоці ...
else:
print('Ні, задане число трохи нижче, ніж здогадка')
# щоб потрапити сюди здогадка повина бути більша, ніж число
print('Виконано')
# Цей останій рядок коду завжди виконується, після виконання оператора if.
Висновок (три рази):
$ python if_elif_else_ukr.py
Введіть ціле число: 50
Ні, задане число трохи нижче, ніж здогадка
Виконано
$ python if_elif_else.py
Введіть ціле число: 22
Ні, задане число трохи вище, ніж здогадка
Виконано
$ python if_elif_else.py
Введіть ціле число: 23
Вітаємо, ви вгадали.
(хоч і не виграли жодного призу!)
Виконано
Як це працює
У цій програмі ми приймаємо варіанти від користувача та перевіряємо, чи збігаються вони із заздалегідь заданим числом. Ми встановлюємо змінній число
значення будь-якого цілого числа, якого хочемо, скажімо, 23. Потім ми приймаємо варіанти числа від користувача за допомогою функції input()
. Функції — це лише багаторазово використовувані частини програм. Ми прочитаємо про них більше в наступному розділі.
Ми надаємо рядок вбудованій функції input
, яка друкує його на екрані та чекає введення від користувача. Коли ми вводимо щось і натискаємо клавішу Enter, функція input()
повертає те, що ми ввели, у вигляді рядка. Потім ми перетворюємо цей рядок на ціле число за допомогою int
, та зберігаємо це значення в змінній здогадка
. Насправді int
— це клас, але на даному етапі вам достатньо знати лише, що ви можете використовувати його для перетворення рядка в ціле число (припускаючи, що рядок містить ціле число в тексті).
Далі ми порівнюємо здогадку користувача із заданим нами числом. Якщо вони рівні, ми друкуємо повідомлення про успіх. Зверніть увагу, що ми використовуємо відповідні рівні відступу, щоб повідомити Python, які рядки коду належать до якого блоку. Ось чому відступи настільки важливі в Python. Сподіваюсь, ви дотримуєтесь правила “постійних відступів”. Чи не так?
Зверніть увагу, що рядок коду, який починається з if
мусить закінчуватися двокрапкою - ми вказуємо Python, що зараз буде слідувати рядок коду з відступом.
Потім ми перевіряємо, чи здогадка користувача є менша заданого числа, і якщо так, ми повідомляємо користувачу, що йому слід вибрати число трохи більші за це. Тут ми використали блок elif, який фактично об’єднує декілька блоків if else-if else
в один об’єднаний блок if-elif-else
. Це полегшує роботу з програмою та зменшує кількість необхідних відступів.
Блоки elif
і else
також повинні мати двокрапку в кінці логічного рядка, за якою слідує відповідні рядки коду (з відповідним числом відступів, звичайно).
Усередині if-блоку може бути інший блок if
і так далі - це називається вкладеним блоком if
.
Пам’ятайте, що блок elif
і блок else
необов’язкові. Мінімальний коректний запис блока if
такий :
if True:
print('Так, це вірно.')
Після того, як Python завершить виконання всього блока if
разом із відповідними блоками elif
і else
, він переходить до наступного блока в блоці, що містить блок if
(рядки коду з однаковим відступом). У нашому випадку це головний блок (в якому починається виконання програми), а наступним є вираз print('Виконано')
. Після цього Python доходить до кінця програми та просто виходить із неї.
Незважаючи на те, що це дуже проста програма, я вказав на багато речей, на які ви повинні звернути увагу. Усе це досить просто (і напрочуд просто для тих із вас, хто має досвід C/C++). Спочатку вам потрібно буде запам’ятати всі ці речі, але після деякої практики з ними - ви звикнете, і все це буде для вас «природним».
Примітка для програмістів C/C++
Починаючи з версії 3.10, Python має оператор "match - case"
, подібний до оператора switch
в інших мовах програмування, таких як C, Java тощо.
Для отримання додаткової інформації перегляньте офіційну документацію Python: https://docs.python.org/3/tutorial/controlflow.html#match-statements.
Ви можете використовувати блок if..elif..else
щоб зробити те саме,що і за допомогою оператора switch
(і в деяких випадках використовуйте словник,щоб зробити це швидко)
Оператор while
#
англійська: The while Statement
Оператор while
дозволяє вам багаторазово виконувати блок рядків коду,поки умова істинна (англ.“True”), або поки виконується деяка умова. Оператор while
є прикладом так званого оператора циклу. Оператор while
може мати необов’язковий блок else
.
код python ‘while_loop_ukr.py’
число = 23
гра_запуститься = True
while гра_запуститься == True:
здогадка = int(input('Введіть ціле число : '))
if здогадка == число:
print('Вітаємо, ви вгадали.')
# це призводить до зупинки циклу while
elif здогадка < число:
print('Ні, задане число трохи вище, ніж здогадка.')
else:
print('Ні, задане число трохи нижче, ніж здогадка.')
else:
print('Цикл while закінчено.')
# Робіть тут усе, що хочете
print('Виконано')
Висновок:
$ python while_loop_ukr.py
Введіть ціле число: 50
Ні, задане число трохи нижче, ніж здогадка
Введіть ціле число: 22
Ні, задане число трохи вище, ніж здогадка
Введіть ціле число: 23
Вітаємо, ви вгадали.
Цикл while закінчено.
Виконано
Як це працює
У цій програмі ми все ще граємо у вгадування, але перевага полягає в тому, що користувачеві дозволено продовжувати вгадувати, доки він не вгадає правильно – немає потреби повторно запускати програму для кожного вгадування, як ми робили у попередньому прикладі. Це наочно демонструє використання оператора while
.
Ми переміщуємо оператори input
і if
всередину циклу while
і встановлюємо змінну гра_запуститься
у значенні True
перед циклом while. Спочатку ми перевіряємо, чи змінна гра_запуститься
(гра_запуститься==True) має значення True
, а потім продовжуємо виконувати відповідний while-block.
Після виконання цього блоку (while-block) знову перевіряється умова, яка в даному випадку є змінною гра_запуститься
. Якщо вона істинна, ми знову виконуємо блок while, інакше ми продовжуємо виконувати необов’язковий блок else, а потім переходимо до наступного рядка коду.
Блок else
виконується, коли умова циклу while
стає хибною (англ.» False
») - це може статися навіть при першій перевірці умови. Якщо у циклу while
є додатковий блок else, він завжди виконується, якщо цикл не буде перерваний оператором break.
True
і False
називають булевим типом даних, і їх можна вважати еквівалентними значенням 1
і 0
відповідно.
Примітка для програмістів C/C++
Пам’ятайте, що цикл while
може мати блок else
.
– Від перекладача –
Після оператора while
завжди йде вираз. Вираз — це щось, що може обчислити комп’ютер і завжди має результат True
або False
. (Наприклад, 3 > 5 є False
, але 3 == 3 є True
).
У наведеному вище прикладі коду для змінної гра_запуститься
було встановлено значення True
.
гра_запуститься = True
Тепер Рython має перевірити, чи значення гра_запуститься
має значення True
, щоб зрозуміти, чи потрібно виконувати блок while:
while гра_запуститься == True:
Частина між словами while
і двокрапкою - є виразом, і Python може обчислити результат цього виразу. Результатом виразу є (на даний момент) True
. Таким чином, буде виконано блок while.
Усередині блоку while
є блок if elif else
. Лише блок if здогадка == число:
містить команду для зміни значення гра_запуститься
:
гра_запуститься = False
Інші блоки (elif та else) не змінюють значення змінної гра_запуститься
.
Після виконання всього блоку while програма Python повертається до початку блоку while
і знову перевіряє вираз, щоб зрозуміти, чи потрібно блок while
виконувати інший раз:
while гра_запуститься == True:
Якщо вираз має значення False
(коли число було вгадано правильно та рядок гра_запуститься` = False
було виконано), тоді блок while
НЕ буде виконано знову, і програма Python продовжує роботу в рядку коду після блоку while
(у наведеному вище прикладі це рядок else:
), за яким слідує print("Цикл while закінчено")
Блок while
з блоком else
#
Блок while
може мати додатковий блок else
під собою, як у грі вгадування чисел вище.
Якщо вираз праворуч від команди while
стає False
, блок while не виконується, а замість нього виконується блок else. Якщо такого блоку else не існує, виконується наступний рядок коду після блоку while.
Однак існує особливий випадок: якщо виконується блок while і всередині блоку while виконується команда break
, тоді блок else НЕ буде виконано. Команда break
буде пояснена пізніше в цьому розділі.
– завершення доповнень від перекладача –
Цикл for
#
Оператор for..in
— це ще один оператор циклу, який ітерує послідовність об’єктів, тобто проходить через кожен елемент у послідовності. Ми детально розглянемо про послідовності у наступних розділах. Зараз вам потрібно знати, що послідовність — це впорядкований набір елементів.
Приклад (зберегти як for.py
):
код python ‘for_loop_ukr.py’
for i in range(1, 5):
print(i)
else:
print('Цикл for завершено')
Висновок:
$ python for_loop_ukr.py
1
2
3
4
Цикл for завершено
Як це працює
У цій програмі ми друкуємо послідовність чисел. Ми генеруємо цю послідовність чисел за допомогою вбудованої функції range
.
Ми задаємо два числа, і range
повертає послідовність чисел від першого числа до другого. Наприклад, range(1,5)
дає послідовність [1, 2, 3, 4]
. За замовчуванням range
приймає кількість кроків, рівну 1. Якщо ми задамо також і третє число range
, воно служитиме кроком. Наприклад, range (1,5,2) дає значення [1,3]. Пам’ятайте, інтервал простягається тільки до другого числа, тобто не включає його у себе.
Зауважте, що range()
генерує послідовність чисел, але одне число за раз. Щоб побачити всю послідовність чисел відразу, напешіть list(range())
, наприклад, list(range(5))
призведе до “[0, 1, 2, 3, 4]”. Списки (англ. “list”) пояснюються в главі про структури даних.
Потім цикл for
здійснює ітерацію з цього діапазону - for i in range(1,5) еквівалентно for i in [1, 2, 3, 4], що схоже на привласнення змінної i
за одним числом (або об’єктом) за раз, виконуючи блок команд для кожного значення i
. У цьому випадку в блоці рядків коду ми просто друкуємо значення.
Пам’ятайте, що блок “else” необов’язковий. Якщо він присутній, він завжди виконується один раз після закінчення циклу for, якщо тільки не вказан оператор break.
Пам’ятайте також, що цикл for..in
працює для будь-якої послідовності. У нашому випадку - це список чисел, згенерованих вбудованою функцією range
, але загалом ми можемо використовувати будь-яку послідовність будь-яких типів об’єктів! Ми детально розглянемо цю ідею в наступних розділах.
Примітка для програмістів C/C++/Java/C#
Цикл for
у Python радикально відрізняється від циклу for
C/C++. Програмісти C# звернуть увагу на те, що цикл for
у Python схожий на цикл foreach
у C#. Java-програмістам це може нагадати конструкцію for (int i : IntArray)
у Java 1.5.
У C/C++, якщо ви хочете написати for (int i = 0; i < 5; i++)
, тоді у Python цьому відповідає вираз for i in range(0,5)
. Як бачите, цикл for є простішим, виразнішим і менш схильним до помилок у Python.
Оператор break#
англійська: The break Statement
Команда break
може бути використана лише всередині циклу (всередині блоку for чи блоку while). Що робить оператор break
?
Якщо Python читає команду break, Python миттєво припиняє виконання рядків коду у блоці команд цикла і переходить до першого командного рядка після циклу.
Важливе зауваження полягає в тому, що якщо цикли for
або while
перервани оператором break, відповідні їм блоки else виконуватися не будуть.
код python ‘break_while_ukr.py’
while True:
s = input('Введіть щось : ')
if s == 'Вийти':
break
print('Довжина рядка становить :', len(s))
print('Виконано')
Висновок:
$ python break_while_ukr.py
Введіть щось : Програмування – це весело
Довжина рядка становить : 25
Введіть щось : Коли робота виконана
Довжина рядка становить : 20
Введіть щось : І якщо ви хочете повесилитися на роботі:
Довжина рядка становить : 40
Введіть щось : Використовуйте Python!
Довжина рядка становить : 22
Введіть щось : Вийти
Вийти
Як це працює
У цій програмі ми багаторазово зчитуємо введення користувача та друкуємо довжину кожного введення кожного разу. Ми надаємо спеціальну умову для зупинки програми, перевіряючи, чи є введені користувачем рядки коду 'Вийти'
. Для зупинення програми ми вводимо спеціальну умову, яка перевіряє, чи збігається введення користувача з рядком коду “вихід”. Ми зупиняємо програму, перериванням циклу оператором break, і досягаємо кінця програми.
Довжина введеного рядка може бути знайдена за допомогою вбудованої функції len
.
Пам’ятайте також, що оператор break
може застосовуватись і в циклі for
.
Поетичний Python Swaroop’а
Вхідні дані, які я використав тут, це міні-вірш, який я написав. Він називається Поетичний Python Swaroop’а:
Програмування – це весело.
Коли робота виконана,
і якщо ви хочете повесилитися на роботі:
використовуйте Python!
Англійський варіант:
Programming is fun.
When the work is done,
if you wanna make your work also fun:
use Python!
Оператор continue
#
англійська: The
continue
Statement
Оператор continue
використовується, щоб наказати Python пропустити решту операторів у поточному блоці циклу та продовжити (англ.“continue”) з наступної ітерації циклу.
код python ‘continue_while_ukr.py’
while True:
s = input('Введіть щось :')
if s == 'вийти':
break
if len(s) < 3:
print('Занадто мало')
continue
print('Введений рядок достатньої довжини')
# Різні інші дії тут...
Висновок:
$ python continue_while_ukr.py
Введіть щось : a
Занадто мало
Введіть щось : 12
Занадто мало
Введіть щось : abc
Введений рядок достатньої довжини
Введіть щось : вийти
Як це працює
У цій програмі ми приймаємо введення від користувача, але обробляємо введений рядок, лише якщо він містить принаймні 3 символи. Отже, ми використовуємо вбудовану функцію len
, щоб отримати довжину рядка, і якщо довжина менша за 3, ми пропускаємо решту операторів у блоці за допомогою оператора continue
. В іншому випадку решта операторів у циклі виконується, роблячи будь-які маніпуляції, які нам потрібні.
Зауважте, що оператор continue також працює і з циклом for.
Резюме#
Ми побачили, як використовувати три оператори потоку керування - if
, while
і for
разом із відповідними операторами break
і continue
.Це одні з найбільш часто використовуваних конструкцій Python, тому оволодіти ними дуже важливо.
Далі ми побачимо, як створювати та використовувати функції.