Це фрагмент книги Python з нуля, яка допоможе вам навчитися програмуванню з нуля. Ви можете знайти його на Allegro, Empik та в інтернет-книгарнях.
Поки що ми бачили лише дуже прості умови, які перевіряли значення однієї змінної. Як поводитися в ситуації, коли ми хочемо виконати дію, в якій виконуються дві умови одночасно? Наприклад:
твіт рекламується і походить від особи, за якою користувач стежить;
твіт користувача або особи, за якою користувач стежить.
Щоб отримати відповіді на такі запитання, нам потрібні логічні оператори and, or і not, які виконують операції з логічними значеннями (подібно до того, як +, - і * виконують дії з числами).
Оператор and
Щоб добре пояснити логічні оператори, наведу історію маленького Мишка. Він хотів погратися на своєму комп’ютері, тож пішов до мами, щоб запитати дозволу. Вона сказала: "Ти зможеш погратися, коли зробиш домашнє завдання і прибереш кімнату".
Ця умова в програмуванні може бути виражена таким чином:
can_play_games = finished_homework and cleaned_room
Ми бачимо там змінні finished_homework і cleaned_room, які представляють відповідно виконання домашнього завдання та прибирання кімнати (ми припускаємо, що це логічні значення, тобто True або False). Між ними бачимо оператор and [^105_1], завдяки якому весь вираз буде True, тільки якщо обидві його частини будуть True [^105_2].
| a | b | a and b |
|:-----:|:-----:|:-------:|
| True | True | True |
| True | False | False |
| False | True | False |
| False | False | False |
print(TrueandTrue)# Trueprint(TrueandFalse)# Falseprint(FalseandTrue)# Falseprint(FalseandFalse)# False# Чи може Мишко завести щеня?have_time =Trueis_responsible =Falsecan_have_puppy = is_responsible and have_time
print(can_have_puppy)# False
Прикладом використання цього оператора є перевірка, чи число розміщене в певному діапазоні, тобто чи воно більше ніж нижня межа і менше ніж верхня межа. Наприклад, ми можемо перевірити, чи змінна percent має правильне значення, тобто міститься між 0 і 100.
if percent >=0and percent <=100:print("Правильне значення")
Якщо percent буде від 0 до 100, відобразиться "правильне значення". В іншому ж випадку не відбудеться нічого.
Оператор or
На жаль, Мишко не зробив домашнього завдання, тому не зміг погратися на комп’ютері. Але потім до нього подзвонили друзі і запросили в кіно. Мишко пішов до мами та попросив грошей, щоб піти. Вона сказала: "Я дам тобі гроші, якщо ти прибереш гараж або помиєш машину".
Цю умову можна представити таким чином:
can_go_to_cinema = cleaned_garage or washed_car
Оператор or [^105_3] представляє альтернативу. Весь вираз повертає True, якщо виконується або cleaned_garage, або washed_car, або обидві умови одночасно.
| a | b | a or b |
|:-----:|:-----:|:------:|
| True | True | True |
| True | False | True |
| False | True | True |
| False | False | False |
print(TrueorTrue)# Trueprint(TrueorFalse)# Trueprint(FalseorTrue)# Trueprint(FalseorFalse)# False# Чи отримає Мишко шоколадку?behaved_well =Truecleaned_room =Falsecan_eat_chocolate = behaved_well or cleaned_room
print(can_eat_chocolate)# True
Мишко так запрацювався, що і гараж прибирав, і машину помив. Здивована мама сказала: "Я хотіла, щоб ти зробив або те, або інше, а не і одне, і друге". Мишко відповів: "Ти використала сполучник або, який, серед іншого, може означати виконання і одного, і іншого, так само як or у програмуванні". Мама Мишка погодилася з цим поясненням, тому він пішов з друзями в кінотеатр.
Оператор not
Останній логічний оператор, який ми повинні знати, — це заперечення, тобто not, перед логічним значенням. Слово "not" означає "ні". Подібно до - (мінуса) перед числом, який замінює його знак на протилежний, not перед логічним значенням перетворює його на зворотне. Оператор заперечення not змінює True на False, а False на True.
Оператор заперечення not часто ставиться у складнішому виразі перед окремою змінною. Мишко зрозумів це, коли мама сказала: "Ти зможеш погратися на комп’ютері, якщо не завалиш іспит з математики і прибереш кімнату". Він використав заперечення, щоб перекласти це речення на Python.
can_play_games =not failed_math_test and cleaned_room
Зверни увагу, що заперечення тут стосується лише нездачі іспиту. not True and False повертає False, тому що спочатку not True повертає False, а потім False and False повертає False. Як і з числами -10 + 11 дорівнює 1, а не -21. Якщо ми хочемо, щоб заперечення охоплювало більшу область виразу, ми повинні взяти весь фрагмент у круглі дужки. not (True and False) повертає True, тому що спочатку True and False повертає False, яке потім заперечується через not.
# Іспит зданийfailed_math_test =False# Кімната неприбранаcleaned_room =False# Не завалив іспит і прибрав кімнатуprint(not failed_math_test and cleaned_room)# False# Не є правдою, що# завалив іспит і прибрав кімнатуprint(not(failed_math_test and cleaned_room))# True
Читання логічних виразів
Варто потренуватися читати логічні вирази вголос. Зазвичай я роблю це так:
and я читаю як і;
or я читаю як або;
not перед змінною я читаю як ні, а перед дужками як не є правдою, що або неправда, що.
Потренуймося на наведених нижче прикладах для змінних:
is_grounded як "заборонено виходити";
cleaned room як "прибрав кімнату";
passed_test як "здав іспит".
Прочитай такі речення:
cleaned_room and passed_test — прибрав кімнату і здав іспит.
not is_grounded or passed_test — не заборонено виходити або здав іспит.
cleaned_room and not passed_test — прибрав кімнату і не здав іспит.
not (is_grounded or not passed_test) — не є правдою, що заборонено виходити або не здав іспит.
not (not cleaned_room and not passed_test) — неправда, що не прибрав кімнату і не здав іспит. Це означає те саме, що й cleaned_room or passed_test.
not (not a and not b) завжди однозначне a or b, а not (not a or not b) — рівнозначне з a and b. Такі перетворення використовуються, щоб позбутися складного для прочитання заперечення. Наприклад, якби у нас була умова not (has_computer and not is_grounded), ми могли б використати факт, що not (not a and not b) — це a or b, і скоротити вираз до not has_computer or is_grounded (not перед is_grounded зникає, бо not not a — це просто a).
Вправа: Складні логічні вирази
Що буде виведено в результаті роботи цього коду?
has_computer =Truepassed_test =Falseis_grounded =Falseprint(has_computer and passed_test)print(passed_test or is_grounded)print(has_computer andnot passed_test)can_play_games = has_computer andnot is_grounded
print(can_play_games)play_games = has_computer and can_play_games
ifnot passed_test: is_grounded =Trueprint(play_games)print(passed_test ornot is_grounded)print(not(not has_computer ornot passed_test))
Відповіді в кінці книги.
[^105_1]: "and" з англійської перекладається як "i".
[^105_2]: Точніше кажучи, увесь вираз truthy, коли обидві частини truthy. Однак ми не будемо говорити про значення як truthy або falsy.
[^105_3]: "or" з англійської перекладається як "або".
[^105_4]: Граючись мовою, ми могли б сказати, що неправда, що програмування не приймає подвійних заперечень. І навіть (не не не не) допускає багаторазові заперечення.
Marcin Moskala is a highly experienced developer and Kotlin instructor as the founder of Kt. Academy, an official JetBrains partner specializing in Kotlin training, Google Developers Expert, known for his significant contributions to the Kotlin community. Moskala is the author of several widely recognized books, including "Effective Kotlin," "Kotlin Coroutines," "Functional Kotlin," "Advanced Kotlin," "Kotlin Essentials," and "Android Development with Kotlin."
Beyond his literary achievements, Moskala is the author of the largest Medium publication dedicated to Kotlin. As a respected speaker, he has been invited to share his insights at numerous programming conferences, including events such as Droidcon and the prestigious Kotlin Conf, the premier conference dedicated to the Kotlin programming language.
Roman has experience in different fields: from running his own catering company to working as a professional lawyer for over 13 years. Recently working on becoming a DevOps engineer.