article banner

Умови на Python

Це фрагмент книги Python з нуля, яка допоможе вам навчитися програмуванню з нуля. Ви можете знайти його на Allegro, Empik та в інтернет-книгарнях.

Умовна інструкція if

Часто буває так, що ми хочемо щось робити лише в певних випадках. Ось кілька прикладів:

  • ми хочемо показувати рекламу лише власникам безкоштовних облікових записів;
  • ми хочемо приховати повідомлення, якщо воно надійшло від заблокованої особи;
  • якщо публікація рекламується, вона повинна мати відповідний значок "реклама".

Щоб виконувати якусь частину коду за певної умови, ми використовуємо оператор if. Починаємо його з ключового слова if 1, після чого ставимо умову (англ. condition). Умова — це вираз 2, який повертає логічне значення True або False. Її можна створити, наприклад, за допомогою символу порівняння ==< або !=. Після умови ставимо двокрапку : і з наступного рядка вказуємо інструкції, які повинні бути виконані, якщо умова виконується (повертає значення True). Ці інструкції називаються тілом умови. Перед інструкціями в тілі слід відступити чотири пробіли. Завдяки цьому відступу Python відрізнятиме інструкції від решти коду. Якщо умова не виконується (повертає False), інструкції не виконуватимуться.

if True:
    print("Це виведеться")  # Це виведеться

if False:
    print("А це ні")

tweet_type = "promotional"
tweet_owner = "marcinmoskala"
your_key = "yourname"

if tweet_type == "promotional":
    print("Реклама")  # Реклама

if tweet_owner == your_key:  # False,
    # оскільки "marcinmoskala" не дорівнює "yourname"
    print("Твій твіт")

# Виведеться:
# Це виведеться
# Реклама

Відступи

Відступи, тобто додаткові пробіли перед певними інструкціями, мають у Python велике значення. Подивись на код нижче:

if False:
    print("A")
print("B")

Що має бути виведено? Відповідь: тільки "B", тому що print("A") стоїть в операторі if, умова якого не виконується. Але звідки ми знаємо, що print("A") входить у тіло цієї умови, а print("B") ні? Саме завдяки відступу.

if weekday == ‘friday’:
    print("Вечірка!")

Ми можемо розмістити ще одну інструкцію в тілі оператора if. Для цього ми додаємо додатковий відступ до її тіла.

is_logged = True
is_admin = False

if is_logged:
    print("Користувач увійшов")
    if is_admin:
        print("Адміністратор")

# Виведеться:
# Користувач увійшов

Зауваж, що відступи корисні не лише для компілятора, а й для нас. Вони дозволяють легко розрізнити, що належить до тіла функції, а що ні.

Довгий період велися дискусії про те, як робити відступи: за допомогою пробілів чи знаку табуляції. Сьогодні в кодуванні пробіли є стандартом, але в деяких проєктах досі можна зустріти знаки табуляції. В будь-якому випадку ніколи не можна змішувати ці два варіанти в одному проєкті.

Набір правил, який визначає, як повинен виглядати код, називається форматуванням. У ньому вказується: які мають бути відступи, де ставити абзаци та пробіли, за якими правилами слід називати змінні тощо. Форматування може відрізнятися залежно від проєкту. У Python найчастіше використовується відступ у чотири пробіли, тому в цій книзі я дотримуюся цього ж правила. Іноді можна побачити відступи, які складаються з двох пробілів.

Порожнє тіло

Перед тілом оператора if має стояти відповідний відступ. Але що робити, якщо тіло з якихось причин порожнє? Python не бачитиме жодних інструкцій і вважатиме, що ми зробили помилку. У таких випадках в тілі умови необхідно поставити слово pass. Це ключове слово не виконує жодної операції, але має бути введене, щоби наш код працював. Це також корисна інформація для читача цього коду: вона повідомляє, що тіло умови навмисно залишене порожнім.

if is_logged:
    pass

На практиці я рідко бачу pass в кінцевому коді. Однак це корисно знати під час роботи, наприклад, коли ми хочемо спершу зосередитися на написанні умови, а потім — на її тілі. Ключове слово pass також використовується, коли ми хочемо залишити порожнім тіло функції else, elif, циклу for і в багатьох інших структурах, які ми обговоримо в цій книзі пізніше.

Вправа: if

Напиши код, який:

  • виведе "З повагою", якщо змінна is_important має значення True;
  • виведе "Вітаю";
  • виведе "Пані", якщо змінна gender має значення "female";
  • виведе "Пане", якщо змінна gender має значення "male".

Спочатку перерахуй усі значення, зробивши окремі виклики print, а потім подумай, як зібрати їх усі разом і записати в один рядок.

Перевір, як поводитиметься твій код при різних значеннях is_important (логічне значення True/False) і gender (значення стрінга "male", "female" або інше).

Відповіді в кінці книги.

Умовний виклик із частиною else

Тіло оператора if викликається лише тоді, коли умова виконується. Що робити, якщо ми хочемо виконати якусь іншу дію у випадку, коли умова не виконується? Припустімо, якщо твіт рекламується, то він має бути підписаний "Реклама", в іншому ж випадку — "Звичайний". Отже, ми могли б використати два умовних оператори if: один — для перевірки виконання умови, а інший — для перевірки виконання протилежної умови. Однак, оскільки це досить поширене явище, умова if дозволяє вам додати частину else 3, яка визначає, що має статися, якщо умова не виконується.

tweet_type = "standard"

if tweet_type == "promotional":
    print("Реклама")
else:
    print("Звичайний")

# Результат той самий, якби ми написали:
if tweet_type == "promotional":
    print("Реклама")

if tweet_type != "promotional":
    print("Звичайний")

Зауваж, що завжди викликатиметься або тіло з if, або тіло з else. Цей факт часто використовується, наприклад, при застосуванні if-else для встановлення значення змінної.

tweet_type = "standard"

if tweet_type == "promotional":
    label = "Реклама"
else:
    label = "Звичайний"

print(label)  # Звичайний

label завжди матиме певне значення: "Реклама" або "Звичайний".

Умовний виклик із частиною elif

А якщо ми маємо більше альтернативних варіантів? Наприклад, кілька умов, які ми хочемо перевірити по черзі. Щоб обробити кожне з цих значень, ми можемо використати частину elif (скорочення від "else if" або "otherwise if"). Ми ставимо цю частину після умови if, але перед else. Ця команда дозволяє вказати іншу умову, яка перевірятиметься, якщо умова з if не виконується. Якщо умова з elif виконується, то буде виконуватися її тіло. Можна додавати багато таких "elif".

Наприклад, якщо ми хочемо обробити кілька можливих значень tweet_type:

  • "promotional" означає твіт, який рекламується;
  • "followed" означає твіт із профілю, за яким користувач стежить;
  • "own" означає власний твіт користувача, який увійшов у систему.
if tweet_type == "promotional":
    print("Реклама")
elif tweet_type == "followed":
    print("Звичайний")
elif tweet_type == "own":
    print("Власний")
else:
    print("Інший")

# Те ж саме, що
if tweet_type == "promotional":
    print("Реклама")
else:
    if tweet_type == "followed":
        print("Звичайний")
    else:
        if tweet_type == "own":
            print("Власний")
        else:
            print("Інший")

Альтернативою є використання match-case, представленого у версії 3.10, яку я вирішив не розглядати в цій книзі. Зацікавленим рекомендую дізнатися про цей спосіб більше з інших джерел.

В інструкції if Python перевіряє послідовні частини. Для першої частини, для якої умова виконується, Python викличе блок коду. Після цього перевірка закінчується. Отже, якщо у нас є блок else, завжди буде викликатися рівно одне тіло. Таким чином, умовні інструкції if та elif представляють різні взаємовиключні альтернативи.

У наведеному вище прикладі, якщо tweet_type буде "promotional", буде виведено текст "Реклама". Якщо значення дорівнюватиме "followed", буде виведено "Звичайний". Якщо воно дорівнюватиме "own", буде виведено "Власний". Якщо жодне з вищезазначених не відповідатиме дійсності —"Інший".

Слід звернути увагу, що в інструкції if може бути виконаний лише один блок. Ми використаємо цей факт у прикладі нижче. Перший блок буде викликано, коли значення percent буде 95 або більше. Другий — коли значення буде 80 або більше, але менше ніж 95. Третій — коли воно буде 50 або більше та менше ніж 80. Натомість останній — для значень до 50. У зв’язку з цим ми ніколи не побачимо більше однієї відповіді одночасно.

print("Чи це точно?")
if percent >= 95:
    print("На 100 %")
elif percent >= 80:
    print("Радше так")
elif percent >= 50:
    print("Якось так")
else:
    print("Ееее")

Вправа: else та elif

Напиши код, який:

  • якщо змінна coffee_finished буде False, виведе "П’ю каву";
  • якщо змінна days_until_deadline менше 2, виведе "Працюю";
  • в іншому випадку виведе "Вчуся програмувати!".

Перевір, як Твій код поводитиметься для різних значень coffee_finished (логічне значення True/False) і days_until_deadline (числове значення).

Відповіді в кінці книги.

Вправа: Умови

Нижче я наводжу чотири варіанти значень змінних user_name і user_age та три фрагменти коду. Для кожної пари дай відповідь на запитання: як буде поводитися код для конкретних значень змінної? Всього дай 12 відповідей: для кожної комбінації варіантів і коду.

Перший варіант

user_name = "Міхал"
user_age = 31

Другий варіант

user_name = "Голова Марек"
user_age = 61

Третій варіант

user_name = "Павел"
user_age = 10

Четвертий варіант

user_name = ""
user_age = 14

Перший фрагмент коду — умова if

if user_name == "Голова Марек":
    print("Вітаємо, Пане Голово")

if user_name != "":
    print("Привіт, " + user_name)

if user_age < 18:
    print("Може, цукерку?")

if user_age >= 18:
    print("Може, щось вип’єте?")

Другий фрагмент коду — умова if з else

if user_name == "Голова Марек":
    print("Вітаємо, Пане Голово")
else:
    print("Привіт, " + user_name)

if user_age < 18:
    print("Може, цукерку?")
else:
    print("Може, щось вип’єте?")

Третій фрагмент коду — умова if з elif

if user_name == "Голова Марек":
    print("Вітаємо, Пане Голово")
elif user_name != "":
    print("Привіт, " + user_name)

if user_age <= 10:
    print("Категорія: Діти")
elif user_age <= 20:
    print("Категорія: Молодь")
elif user_age <= 60:
    print("Категорія: Дорослі")
else:
    print("Категорія: Старші")

Відповіді в кінці книги.

1:

Слово "if" можна перекласти українською як "якщо".

2:

Див. Словник в самому кінці книги.

3:

Слово "else" можна перекласти українською як "в іншому випадку".