Змінна типу 'bool' може містити тільки два значення: True або False, при чому це не рядки, не числа, а саме поняття істинності та хибності.
Назва "Булеві величини" походять від винахідника математичної логіки ("Буллевої алгебри") - британського математика ХІХ століття - Джорджа Булля.
Існують наступні логічні оператори:
- and - та (кон’юнкція)
- or - або (диз’юнкція)
- xor - або, що виключається (підключається окремо)
- not - заперечення. НЕ not означає НЕ, і, якщо поставлене перед типом bool, змінює його значення на зворотне, тобто 'not True' стає 'False', 'not False' стає 'True' Далі приведена таблиця, що демонструє роботу операторів :
| Оператори | 0 to 0 | 0 to 1 | 1 to 0 | 1 to 1 |
|---|---|---|---|---|
| and | 0 | 0 | 0 | 1 |
| or | 0 | 1 | 1 | 1 |
| xor | 0 | 1 | 1 | 0 |
В python до версії 3.10 існував тільки один умовний операторʼ if -> elif -> else. Починаючи з версії мови 3.10 був доданий порівняння шаблонів match/case, який також можн використовувати на схожий манер, але він не є предметом розгляду даного уроку. Якщо вам цікаво, як це працює, в кінці уроку є посилання на відповідну статтю.
Приклад оператору розгалудження if:
print ("Give it to me!")
number = int(input())
if (number >= 100):
print ("Thanks, man!")
elif ((number > 10) and (number < 100)):
print ("OK :(")
else:
print ("WHAAAAT????")
if (number > 1000):
print ("!!!!WOOOOWWWW!!!")Зверніть увагу, ми вперше стикаємося з блоком операторів. Так само працюють і цикли, і функції, і класи зі своїми методами.
Блок операторів починається зі свого оператора (наприклад, зараз це блок оператора if), після оператора йде двокрапка, потім усі дії, які програміст хоче виконати в рамках цього блоку.
Всі дії потрібно писати з додатковим відступом у чотири пробіли (так, саме чотири пробіли, а не одну табуляцію - це важливо). Якщо відступа не буде, python буде сприймати це як код поза блоком.
Є можливість використовувати оператор if в декількох варіантах. Нижче наведено список усіх варіантів:
- if (умова) дія
- if (умова) (блок дій у кілька рядків)
- if (умова) (блок дій у декілька рядків) else дія
- if (умова) (блок дій у кілька рядків) else (блок дій у кілька рядків)
- if (умова) (блок дій у кілька рядків) elif (умова) (блок дій у декілька рядків) else дію
- if (умова) (блок дій у кілька рядків) elif (умова) (блок дій у декілька рядків) else (блок дій у декілька рядків)
Між if та else може бути скільки завгодно elif.
| Оператори | Опис |
|---|---|
| () | дужки |
| ** | зведення в степінь |
| +x, -x, ~x | унарні плюс, мінус й бітове заперечення |
| *, /, //, % | множення, поділ, цілочисельний поділ, залишок від поділу |
| +, - | додавання та віднімання |
| <<, >> | бітові зрушення |
| & | бітове та |
| ^ | бітове виключаюче або (XOR) |
| | | бітове або |
| ==, !=, >, >=, <, <=, is, is not, in, not in | всі порівняння |
| not | логічне не |
| and | логічне та |
| or | логічне або |
До операторів порівняння відносяться наступні:
| Оператори порівняння | Опис |
|---|---|
| "<" | менше |
| ">" | більше |
| "==" | дорівнює |
| ">=" | більше або дорівнює |
| "<=" | менше або дорівнює |
| "!=" | не дорівнює |
| "not" | не є чимось |
| "is" | є тим самим |
| "is not" | не є тим самим |
| "in" | є частиною чогось |
| "not in" | не є частиною чогось |
Останні чотири оператори потребують додаткового пояснення.
Оператор is перевіряє, чи є обидва операнди одним і тим самим об'єктом у пам'яті, тоді як просте порівняння на рівність == перевіряє тільки на відповідність вмісту двох операндів, але не перевіряє, чи є вони тим самим об'єктом.
>>> l1 = [1, 2, 3]
>>> l2 = [1, 2, 3]
>>> l1 == l2
True
>>> l1 is l2
False
>>> l1 is not l2
TrueОператор in перевіряє, чи операнд зліва є частиною операнду справа:
>>> l1 = [1, 2, 3]
>>> 3 in l1
True
>>> 4 in l1
False
>>> 5 not in l1
TrueНа відміну від мови С, в Python оператори порівняння мають однаковий пріоритет.
Результатом порівняння є відповідь типу bool - True або False.
Python пропонує використовувати ланцюги операторів порівняння, тобто класичне для програмування подвійне порівняння може бути замінено ланцюгом:
>>> x = 5
>>> y = 10
>>> z = 15
>>> (x < y) and (y <= z)
True
>>> x < y <= z
TrueФункція all() повертає True, якщо істинні всі перелічені в списку умови.
data = [True, True, True, True]
result = all(data)
print(result) # Output: TrueФункція any() повертає True, якщо хоча б один елемент списку дорівнює True.
data = [False, False, True, False]
result = any(data)
print(result) # Output: TrueУ багатьох мовах програмування (С++, Java, PHP...) існує тернарний оператор, тобто спеціальний оператор умов, який повертає один із двох результатів, залежно від того, виконується його умова чи ні. Виглядає він так:
print ($input == 1) ? "One!" : "Not One!";Тернарні оператори часто застосовуються, коли варіантів дій всього два і кожен вимагає виконання лише однієї команди, бо такий запис коротше аналогічного з if. Однак, на жаль, можна зустріти зв'язок if-ів й тернарних операторів, який є важким для розуміння. Інакше кажучи, надмірне застосування цієї конструкції може стати причиною погіршення розуміння коду.
У python немає окремого тернарного оператора, але, починаючи з версії мови 3.6 є можливість його імітувати за допомогою if:
test = True
result = 'Test is True' if test else 'Test is False'
# result = 'Test is True'Це можна використовувати з будь-якими функціями. Як-от із друком:
test = True
print ('ttt' if test else 'fff') # виведе tttСлід зазначити, що подібна синтаксична конструкція зазвичай використовується лише при повному розгалудженні і блок команд після else є обов'язковим. Тому, у випадку застосування подібного оператора для неповного розгалудження, у одній з гілок варто використовувати команду-заглушку pass.
test = True
result = 'Test is True' if test else pass
# result = 'Test is True'У мові Python все є об'єктом. Коли ми говоримо про число, рядки, функції, класи, список і т.д. - ми говоримо про об'єкти.
Python вважає, що якщо об'єкт не пустий, він True, а не False. False - це власне сам False, 0 і пустий рядок. Таким чином, якщо нам необхідно порівняти рядок з пустим рядком, або число з нулем, а також дізнатися, чи є пустим той, чи інший об’єкт, замість того, щоб написати умови в стилі старих мов:
if s !='':
pass
if bool('value'):
pass
if 8 % 2 != 0:
passЧасто, використання надмірної кількості таких порівнянь призводить до уповільнення виконання вашого коду. Але у таких випадках ми очікуємо лише один результат - 'True' або 'False'. Тому нема жодного сенсу робити повне порівняння, якщо ми можемо передати змінну напряму і умовний оператор сам визначить значення змінної:
if s:
pass
if 8 % 2:
passЦе значно скорочує і спрощує код.
Застосування and до кількох виразів не просто повертає True або False. Воно повертає перший False вираз, або останній з виразів, якщо всі вони True.
Аналогічно, операція or повертає перше істинне значення, або останнє, якщо жодне з них не True.
Використовуючи цю особливість python, тернарний оператор можна реалізувати ще більш оригінальним способом:
test = True
result = test and 'Test is True' or 'Test is False'В нашому випадку test = True, and його пропускає і повертає нам останнє істинне значення, з яким працював, тобто вираз «Test is True' or 'Test is False». Or повертає перший зустрічний True вираз, йому більше нічого не цікаво. Якщо замінити рядки наближеним змістом і використати псевдокод, отримаємо:
result = true1 and true2 or true3
result = true2 or true3
result = true2- Перевірити, чи є введене число парним.
- Перевірити, чи є число не парним, ділиться чи на три і на п'ять одночасно, але так, щоб не ділитися на 10.
- Ввести число, вивести усі його дільники.
- Ввести число, вивести його розряди та їх множники.
Перший рівень ("if"): Набрати всі приклади посимвольно і змусити їх працювати, розібратися у роботі.
Другий рівень ("if-elif-else"): Придумати власні приклади на альтернативні варіанти if і активне використання булевої алгебри.
Третій рівень ("Містер Буль. Джордж Буль!"):
Розвʼязати задачу:
Задача fizz-buzz:
Ви маєте три числа, вони вводяться з консолі. Перше число називається fizz, друге називається buzz. До третього необхідно дорахувати від одиниці. Дивлячись на поточне число, якщо воно кратне fizz – треба виводити F замість числа. Якщо число кратне buzz – треба виводити B замість числа. Якщо число кратне і fizz, і buzz, треба виводити FB. Якщо воно не кратне нічому, виводимо число. І так - поки не буде досягнуто третього введеного числа.
Приклад умови та результату: Введено числа 2, 5, 18 Висновок має бути таким:
1 F 3 F B F 7 F 9 FB 11 F 13 F B F 17 F

