Skip to content

Latest commit

 

History

History
216 lines (147 loc) · 10.7 KB

File metadata and controls

216 lines (147 loc) · 10.7 KB

Урок 2. Булева алгебра. Конструкції, що керують потоком.

Булеві змінні

Змінна типу '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

Умовний оператор if

В 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

Альтернативний синтаксис if, заміна тернарному оператору

У багатьох мовах програмування (С++, 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. Пріоритети всіх операцій шукайте в посиланнях.

Практика

  1. Перевірити, чи є введене число парним.
  2. Перевірити, чи є число не парним, ділиться чи на три і на п'ять одночасно, але так, щоб не ділитися на 10.
  3. Ввести число, вивести усі його дільники.
  4. Ввести число, вивести його розряди та їх множники.

Корисні посилання

Пріоритети операцій в Python

Match/case на Хабрі

Чейнінг операторів порівнянь

Домашка