Змінна типу '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.
На відміну від мови С, в Python оператори порівняння мають однаковий пріоритет.
Результатом порівняння є відповідь типу bool - True або False.
Python пропонує використовувати ланцюги операторів порівняння, тобто класичне для програмування подвійне порівняння може бути замінено ланцюгом:
>>> x = 5
>>> y = 10
>>> z = 15
>>> (x < y) and (y <= z)
True
>>> x < y <= z
TrueДо операторів порівняння відносяться наступні:
"<" - менше
">" - більше
"==" - дорівнює
">=" - більше або дорівнює
"<=" - менше або дорівнює
"!=" - не дорівнює
"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У багатьох мовах програмування (С++, Java, PHP...) існує тернарний оператор, тобто спеціальний оператор умов, який повертає один із двох результатів, залежно від того, виконується його умова чи ні. Виглядає він так:
print ($input == 1) ? "One!" : "Not One!";Тернарні оператори часто застосовуються, коли варіантів дій всього два, бо такий запис коротше аналогічного з if. Однак, на жаль, можна зустріти зв'язок if-ів й тернарних операторів, який є важким для розуміння. Інакше кажучи, це не потрібна річ у мові програмування, і вона може стати причиною погіршення розуміння коду.
У python немає тернарного оператора, але є можливість його імітувати за допомогою 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У мові Python все є об'єктом. Коли ми говоримо про число, рядки, функції, класи, список і т.д. - ми говоримо про об'єкти.
Python вважає, що якщо об'єкт не пустий, він True, а не False. False - це власне сам False, 0 і пустий рядок. Таким чином, якщо нам необхідно порівняти рядок з пустим рядком, або число з нулем, а також дізнатися, чи є пустим той, чи інший об’єкт, замість того, щоб написати умови в стилі старих мов:
if s !='':
pass
if 8 % 2 != 0:
passможна легко їх скоротити:
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Що стосується пріоритету операцій, not пріоритетніше and, and пріоритетніше or. Тобто спочатку виконується not, потом and, потом or. Пріоритети всіх операцій шукайте в посиланнях.
- Перевірити, чи є введене число парним.
- Перевірити, чи є число не парним, ділиться чи на три і на п'ять одночасно, але так, щоб не ділитися на 10.
- Ввести число, вивести усі його дільники.
- Ввести число, вивести його розряди та їх множники.