НМЦ

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

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

ВФПО

ТЕМА 5. ОРГАНІЗАЦІЯ РОЗГАЛУЖЕНЬ В ПРОГРАМАХ

 

 

 

 

Уроки Python з нуля / #5 – Умовні конструкції (if-else)

 

Презентація. Організація розгалужень у програмах №5

 

 

Часто у житті ми стикаємося з твердженнями, які можуть бути правдивими чи хибними. Наприклад, коли вам кажуть, що сума чисел 2 і 3 більша за 4, ви підтверджуєте це, сказавши: «Так, це правильно». Але якщо стверджують, що сума 2 і 3 менше за 4, ви вважаєте це неправдивим.

Ці твердження приймають лише два можливих варіанти відповіді: «так», коли твердження вважається правдивим, або «ні», коли його вважають неправдивим.

 

Ці висловлення також називають логічними виразами або ствердженнями. У програмуванні логічний вираз це конструкція, результат обчислення якої «true» або «false».

 

У мові Python для вираження істинності або неправдивості використовується тип даних bool, який може мати лише два значення: True (істина) або False (неправда). Проте у Python істинним чи неправдивим може бути не лише логічний вираз, а й об’єкт.

v Ненульове число чи непорожній об’єкт розглядаються як істина.

v Нуль, порожні об’єкти та спеціальний об’єкт None вважаються неправдивими.

 

Оператори відношень (порівнянь)

 

У Python для порівняння об’єктів (змінних різних типів) є такі операції порівняння:

> – більше;

< – менше;

>= – більше або рівне (не менше);

<= – менше або рівне (не більше);

   == – дорівнює (рівне);

!= – не дорівнює (не рівне).

 

Результатом операції порівняння є змінна логічного типу bool.

>>> 6>5

True

>>> 7<1

False

>>> 7==7

True

>>> 7!=7

False

 

5.2. Умовний оператор IF-ELSE (IF-ELIF-ELSE)

 

Усі попередні програми використовували лінійну структуру, де кожна інструкція виконувалася почергово, без умов, і виконувалася обов’язково. Щоб змінити порядок виконання програмних операцій в залежності від певних умов, використовують умовний оператор.

Наприклад, якщо потрібно визначити, чи є задане число x додатним (якщо x≥0) чи від’ємним (якщо x<0), структура програми вже не може бути просто послідовною. Залежно від значення x потрібно вивести різне повідомлення.

Для цього можна скористатися умовним оператором if-else, який відомий як оператор розгалуження. Використовуючи цей оператор, можна організувати виконання різних операцій залежно від певного логічного виразу (умови).

 

Синтаксис оператора if-else:

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

[else:

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

 

Під час виконання оператора if-else обчислюється значення логічного виразу. Якщо значення логічного виразу істинне (True), то виконується блок_інструкцій_1 (вирази, що є вкладеними в if). Якщо значення логічного виразу хибне (False), виконується блок_інструкцій_2 (вирази, що є вкладеними в else).

 

У Python декілька команд можуть бути в одному рядку. У цьому випадку команди розділяються крапкою з комою. Також команди можна розташовувати в одному рядку з ключовими словами if і else. Але це не той стиль, якого слід дотримуватися.

 

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

Як можна бачити, запис службового слова if з логічним виразом та службового слова else і відповідних їм блоків інструкцій оформлюються в коді як основна інструкція та вкладений блок інструкцій. Тобто всі інструкції, які належать до одного вкладеного блоку, повинні мати рівну величину відступу, тобто однакове число пропусків на початку рядка. Рекомендовано використовувати відступ в 4 пропуски і не рекомендовано використовувати  як відступ символ табуляції.

 

Під час виконання складних перевірок рядок програмного коду може виявитися досить довгим. Щоб полегшити читання, інструкцію можна перенести на наступний рядок, додаючи символ зворотного слешу (\) в кінці рядка, як показано вище. У цьому разі звичайні правила відступів для наступного рядка не застосовуються, тому ви можете форматувати рядки, що продовжують інструкцію, як завгодно.

 

Приклад. Написати програму для визначення, чи є задане число додатним чи не є додатним:

 

x = int(input("Введіть число:"))

if x > 0:

  print("Число додатне.")

else:

  print("Число не є додатне.")

 

Зміни в умові завдання потребуватимуть визначення, чи число є додатнім, від’ємним, чи нулем (0, як відомо, не належить до додатних чи від’ємних чисел). Це означає розширення програми для перевірки числа на нуль і виведення відповідного повідомлення.

Є кілька можливих підходів до розв’язання цієї задачі. Перший спосіб — використання окремих перевірок.

x = int(input("Введіть число:"))

if x > 0:

   print("Число додатне.")

if x < 0:

   print("Число відємне.")

if x == 0:

   print("Число нуль.")

У цій програмі відбувається перевірка всіх можливих випадків (більше, менше, рівне) з виведенням відповідних повідомлень. Варто відмітити, що для перевірки 3-х взаємовиключних умов можна скористатися методом виключення третього (якщо не перше і не друге, то третє) і використати лише дві перевірки.

Перепишемо програму.

Спосіб 2. Використання вкладених перевірок.

x = int(input("Введіть число:"))

if x > 0:

   print("Число додатне.")

if x < 0:

   print("Число відємне.")

if x == 0:

   print("Число нуль.")

 

З наведеного коду програми можна бачити, що вона містить два оператори if-else, один з яких вкладений в інший. Тобто оператор if-else для умови x < 0 вкладений (внутрішній) в зовнішній оператор if-else для умови x > 0.

 

Програма працюватиме так:

v Спочатку виконується зовнішній оператор, в якому перевіряється умова x > 0.

v Якщо умова x > 0 істинна (значення змінної x більше нуля), то виводиться повідомлення, що число додатне.

v Якщо умова x > 0 хибна (значення змінної x не більше нуля, тобто нуль або від’ємне), переходимо до виконання вкладеного оператора if-else. Перевіряється умова x < 0.

v Якщо умова x < 0 істинна (значення змінної x менше нуля), то виводиться повідомлення, що число від’ємне.

v Якщо умова x < 0 хибна (значення змінної x рівне нулю, оскільки не виконалась умова x > 0, і не виконалася умова x < 0), то виводиться повідомлення, що число нуль.

 

Проте в мові Python передбачений спрощений запис для виконання таких вкладених перевірок.

 

Для їх реалізації використовується оператор if-elif-else, яка має вигляд:

if Логічний_вираз_1:

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

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

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

… [else:

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

 

Оператор працює так. Обчислюється значення логічного виразу 1. Якщо значення логічного_виразу_1 істинне, то виконується блок_інструкцій_1. Якщо ж значення логічного_виразу_1 хибне, то відбувається перехід до обчислення значення логічного виразу 2. Якщо значення логічного_виразу_2 істинне, то виконується блок_інструкцій_2 і так далі. Блок_інструкцій_N буде виконаний в тому випадку, якщо жодний з логічних виразів не був істинним.

Враховуючи оператор if-elif-else, перепишемо нашу програму.

Спосіб 3. Використання оператора if-elif-else.

x = int(input("Введіть число:"))

if x > 0:

  print("Число додатне.")

elif x < 0:

  print("Число відємне.")

else:

  print("Число нуль.")

 

Оператор if-elif-else може використовуватися для заміни оператора switch-case або case в інших мовах програмування.

 

 

Як і в деяких інших мовах програмування, в мові Python передбачений тримісний оператор if/else, який в окремих випадках більш доцільно використовувати замість оператора if-else, незважаючи на те, що сфера його застосування більш вузька.

 

Наприклад, нам необхідно залежно від деякої умови надати одне чи інше значення змінній (наприклад, змінній a присвоюється значення виразів Y або Z залежно від істинності умови X). З використанням оператора if-else це запишеться так:

•if X:

a = Y else:

a = Z

Використовуючи тримісний оператор if/else, це можна записати так:

a = Y if X else Z

 

5.4. Тернарний оператор

 

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

 

Водночас є «спрощена» форма умовного оператора, яку, за аналогією з мовами С++ і Java, можна було б назвати тернарним оператором (хоча, звичайно, конструкція, яка розглядається далі, різко контрастує зі звичними уявленнями про оператор).

Зазвичай, оператори є унарні і бінарні. В унарного оператора є один операнд, у бінарного оператора ‒ два. Тернарний оператор ‒ оператор, у якого три операнди. Один із операндів ‒ це умова, яка перевіряється. Ще два операнди ‒ значення, одне з яких повертається як результат, залежно від умови, яка перевіряється.

Тернарний оператор повертає значення. До того ж це значення залежить від істинності або хибності певної умови.

 

Шаблон тернарного оператора такий (жирним шрифтом виділено основні інструкції у виразі для тернарного оператора):

значення_1 if умова else значення_2

 

Тернарний оператор досить складна конструкція. Спочатку вказується вираз (значення_1), який визначає значення тернарного оператора за істинності умови. Між цим виразом й умовою розміщують ключове слово if. Після умови слідує ключове слово else, а потім вираз (значення_2), що визначає результат тернарного оператора, якщо умова хибна. Невеликий приклад використання тернарного оператора наведено в коді.

# Зчитується перше число

a=float(inputУведіть перше число:ʺ))

# Зчитується друге число

b=float(inputУведіть друге число:ʺ))

# Перше значення

value_1=ʺПерше число більше, ніж друге.ʺ

# Друге значення

value_2=ʺДруге число не менше, ніж перше.ʺ

# Викликається тернарний оператор

res=value_1 if a>b else value_2

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

print(res)

 

Результат виконання цього програмного коду може бути таким (жирним шрифтом виділено введені користувачем значення):

Результат виконання програми:

Уведіть перше число: 12

Уведіть друге число: 30

Друге число не менше, ніж перше.

Або таким:

Уведіть перше число: 30

Уведіть друге число: 12

Перше число більше, ніж друге.

 

У цьому разі ситуація досить проста. Спочатку користувач уводить два числа, які записуються у змінні a і b. Для зчитування введеного користувачем значення ми застосовуємо функцію input(). Проте, оскільки ця функція як результат повертає введене користувачем значення в текстовому форматі, для надійності перетворюємо зчитане значення у формат числа з рухомою крапкою, для чого передаємо результат виклику функції input() як аргумент функції float().

Значення змінної res обчислюється на основі тернарного оператора. У тернарному операторі перевіряється умова a<b. Якщо умова істинна, то змінній res присвоюється текстове значення змінної value_1. Якщо умова хибна, то змінній res присвоюється значення змінної value_2.

Значення змінної res відображується у вікні виводу за допомогою функції print().

 

 

Можливі ситуації, коли виникає потреба у складних логічних висловах, що містять кілька базових логічних тверджень та операцій І (and), АБО (or) та НЕ (not). Оператори І та АБО можуть мати як логічні вирази (з логічними значеннями), так і нелогічні значення (наприклад, числа, рядки, списки тощо). Це означає, що оператори І та АБО можуть працювати з будь-якими об’єктами.

 

Логічний оператор НЕ (not) називають також оператором заперечення. Він застосовується до виразу not X, де результатом його використання є логічне значення, яке є запереченням виразу X.

Логічний оператор І (and) називають кон’юнкцією або логічним множенням. Він використовується у виразі X1 and X2[and X3 ...], де результатом його використання є об’єкт. Під час обчислення оператора І операнди перевіряються зліва направо та якщо трапляється перший хибний об’єкт, він стає результатом операції. Це називається обчисленням за короткою схемою.

Логічний оператор АБО (or) називають диз’юнкцією або логічним додаванням. Він використовується у виразі X1 or X2[ or X3 ...], де результатом його використання є об’єкт. Під час обчислення оператора АБО операнди також перевіряються зліва направо, та якщо зустрічається перший істинний об’єкт, він стає результатом операції.

 

Звернімося до прикладу, де потрібно обчислити значення виразу 1/х без використання умовних операторів та обробки винятків. Ця задача стає складною, оскільки ділення на 0 призведе до помилки. Використовуючи властивості логічних операторів, вираз можна записати як x and 1/x, використовуючи те, що логічний оператор and повертає хибу, якщо х є 0.

>>> x=1

>>> x and 1/x

1.0

>>> x=0

>>> x and 1/x

0

Логічні вирази можна комбінувати:

>>> 1+3 > 7 # пріоритет операції «+» вище, чим в «>«

False

Для більшої зрозумілості можна використовувати дужки.

>>> (1+3) > 7

False

 

Поміркуйте, що буде виведене як результат виконання виразу, і чому буде отриманим саме такий результат:

>>> 1+(3>7)

1

 

У Python можна перевіряти приналежність інтервалу:

>>> x=0

>>> -5<x<10 # еквівалентне: x > -5 and x<10

True

 

 

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

import math

a=float(input(‘Введіть коефіцієнти рівняння a,b,c:’))

b=float(input(‘‘))

c=float(input(‘‘))

d=b**2-4*a*c

if d>=0:

x1=(-b-math.sqrt(d))/(2*a)

x2=(-b+math.sqrt(d))/(2*a)

print(‘x1={:.4}, x2={:.4}’.format(x1,x2))

else:

print(Дійсних коренів немає’)

 

Приклад. Написати програму, за якою визна­читиметься, чи є заданий рік високосним. Відповідно до Григоріанського календаря, рік є високосним, якщо його номер кратний 4, але не кратний 100, а також, якщо він кратний 400.

year=int(input(‘Введіть рік: ‘))

if (year % 4 == 0 and not year % 100 == 0) or (year % 400 == 0):

print(Рік високосний.’)

else:

print(Рік не високосний.’)

 

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

 

Завдання 1. Написати програму обчислення значення функції. Значення аргументу вводиться із клавіатури у діалоговому режимі. Значення інших змінних задати у вигляді констант. Передбачити виведення на друк вихідних даних та результатів у зручній для сприйняття формі з використанням форматного виведення.

 

 

 

 

 

Завдання 2. Розв’язати наведену нижче задачу. Вхідні дані вводять із клавіатури у діалоговому режимі. Інші дані, необхідні для розв’язку задачі, задають у вигляді констант. Передбачити виведення на друк результатів у зручній для сприйняття формі, використовуючи форматне виведення.

1. Написати програму, яка вводить вік користувача і, якщо йому більше 18 років, повідомляє, що він має право голосу. В іншому разі вона обчислює, через скільки років користувач буде мати право голосу.

2. Дано координати двох точок. Визначити, чи розміщені вони на одному колі із центром в початку координат.

3. Із клавіатури вводиться номер місяця в році. Виводиться повідомлення про назву місяця та пору року. Якщо місяця із таким номером немає – виводиться відповідне повідомлення.

4. Дано радіус кола та довжина сторони квадрата. Перевірити, чи пройде квадрат крізь коло.

 

Завдання 3. Скласти програму знаходження значень чисел.

1.   , , . Впорядкувати їх за спаданням.

2.   , , .

Обчислити і надрукувати число .

3.   , , .

Обчислити і надрукувати число .

4.   , , .

Обчислити і вивести на друк число .

 

 

Ø Умовний оператор дає змогу виконувати різні блоки коду залежно від істинності або хибності певної умови.

Ø В умовному операторі після ключового слова if вказується умова, яка перевіряється під час виконання оператора. Якщо умова істинна, виконується блок команд після умови. Якщо умова хибна, виконується блок команд після ключового слова else.

Ø В умовному операторі else-блок не є обов’язковим. Також в умовному операторі можуть використовуватися elif-блоки, що дає змогу перевіряти в умовному операторі послідовно декілька умов і виконувати для кожної з них окремий блок команд.

 

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

1. Які логічні типи даних є в Python? Наведіть приклади використання.

2. Які оператори порівняння ви знаєте в Python? Наведіть їх приклади.

3. Що таке булевий тип даних? Як він пов’язаний з логічними виразами в Python?

4. Які логічні оператори використовують для комбінування булевих виразів? Приведіть кілька прикладів.

5. Які можливі значення мають логічні типи даних в Python? Як вони використовуються в розгалуженнях?

6. Як можна використовувати логічні вирази для керування потоком програми через конструкцію if-else?

7. Які додаткові можливості пропонує Python для складних логічних виразів?

8. Які методи порівняння можна використовувати для об’єктів у Python?

9. Як можна перевірити кілька умов водночас у розгалуженні?

10. Які особливості мови Python варто враховувати, порівнюючи різні типи даних у логічних виразах?

11. Які можливі варіанти синтаксису умовного оператора if у Python? Наведіть приклади.

12. Що таке конструкція if-else? Як її використовують для управління потоком програми?

13. Який вигляд має умовна конструкція if-elif-else у Python? Для чого її використовують?

14. Як можна вкласти умовні конструкції одну в одну (вкладений умовний оператор)? Для чого це використовують?

15. Що таке блок коду? Як використовують відступи у конструкціях if-else?

16. Які інші варіанти умовних виразів можуть бути в Python, окрім if-else?

17. Як використовувати логічні операції з умовними операторами?

18. Які варіанти ви можете застосувати для унікальних умов у конструкції if-elif-else?

19. Як можна оптимізувати використання умовного оператора для оптимальної швидкості та зрозумілості коду?

20. Як умовний оператор впливає на виконання програми  залежно від умов, які задаються?

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

На початок

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