Python: Логічні оператори
Ми вже вміємо писати функції, що перевіряють поодинокі умови. А в цьому уроці навчимося будувати складові умови.
Припустимо, що сайт при реєстрації вимагає, щоб пароль був довшим за вісім символів і містив хоча б одну заголовну літеру. Спробуємо написати два окремі логічні вирази та з'єднаємо їх спеціальним оператором «І»:
Пароль довший за 8 символів І пароль містить хоча б одну велику літеру
Ось функція, яка приймає пароль і говорить, чи відповідає він умовам (True) або не відповідає (False):
def has_capital_letter(string): # Перевіряє наявність хоча б однієї великої літери в рядку def is_correct_password(password): length = len(password) return length > 8 and has_capital_letter(password) print(is_correct_password('Qwerty'))) print(is_correct_password('Qwerty1234')) # => True print(is_correct_password('qwerty1234')) # => False
and означає «І». У математичній логіці це називають кон'юнкцією. Все вираз вважається істинним, якщо дійсний кожен операнд - Кожен із складових виразів. Іншими словами, and означає «і те, й інше». Пріоритет цього оператора нижчий за пріоритет операторів порівняння. Тому вираз has_capital_letter(password) and length > 8 теж правильно відпрацьовує без дужок.
Крім and часто використовується оператор or - "АБО" (диз'юнкція). Він означає «чи те, чи інше, чи обидва». Вираз a or b вважається істинним, якщо хоча б один із операндів або одночасно всі — істинні. В іншому випадку вираз хибний.
Оператори можна комбінувати у будь-якій кількості та будь-якій послідовності. Якщо коді одночасно зустрічаються and і or , то пріоритет задають дужками.Нижче наведено приклад розширеної функції, яка визначає коректність пароля:
def has_capital_letter(string): # Перевіряє наявність хоча б однієї великої літери у рядку def has_special_chars(string): # Перевіряє зміст спеціальних символів у рядку def is_strong_password(password): length = len(password) # Дужки задають пріоритет. Зрозуміло, що до чого належить. return (length > 8 and has_capital_letter(password)) and has_special_chars(password)
Тепер уявімо, що ми хочемо купити квартиру, яка задовольняє такі умови: площа від 100 квадратних метрів і більше на будь-якій вулиці АБО площа від 80 квадратних метрів і більше, але на центральній вулиці Main Street.
Напишемо функцію, яка перевірить квартиру. Вона приймає два аргументи: площа – число та назва вулиці – рядок:
def is_good_apartment(area, street): return area >= 100 or (area >= 80 and street == 'Main Street') print(is_good_apartment(91, 'Queens Street')) # => False print(is_good_apartment(78, 'Queens Street')) # => False print(is_good_apartment(70, 'Main Street')) # => False print(is_good_apartment(120, 'Queens Street')) # => True print(is_good_apartment(120, 'Main Street')) # => True print( is_good_apartment(80, 'Main Street')) # => True
Область математики, у якій вивчаються логічні оператори, називається булевою алгеброю. Нижче побачите таблиці істинності — за ними можна визначити, яким буде результат, якщо застосувати оператора:
І and
| A |
B |
A і B |
| True |
True |
True |
| True |
False |
False |
| False |
True |
False |
| False |
False |
False |
АБО or
| A |
B |
A or B |
| True |
True |
True |
| True |
False |
True |
| False |
True |
True |
| False |
False |
False |
Завдання
Реалізуйте функцію is_leap_year() , яка приймає рік у формі числа і визначає, чи є він високосним чи ні.Рік буде високосним, якщо він кратний (тобто ділиться без залишку) 400 або він одночасно кратний 4 і не кратний 100. Як бачите, у визначенні вже закладена вся необхідна логіка, залишилося тільки перекласти її на код:
is_leap_year(2018) # false is_leap_year(2017) # false is_leap_year(2016) # true
Кратність можна перевіряти так:
# % - повертає залишок від поділу лівого операнда на правий # Перевіряємо що number кратен 10 number % 10 == 0 # Перевіряємо що number не кратен 10 number % 10 != 0
Якщо ви зайшли в глухий кут, то саме час поставити питання в «Обговореннях». Як правильно поставити запитання:
- Обов'язково докладіть виведення тестів, без нього практично неможливо зрозуміти, що не так, навіть якщо ви покажете свій код. Програмісти погано виконують код у голові, але за помилкою майже завжди зрозуміло, куди дивитися.
Тести влаштовані таким чином, що вони перевіряють рішення різними способами та на різних даних. Часто рішення працює з одними вхідними даними, але з іншими. Щоб розібратися з цим моментом, вивчіть вкладку «Тести» та уважно подивіться на виведення помилок, у якому є підказки.
Це нормально 🙆, у програмуванні одне завдання можна виконати безліччю способів. Якщо ваш код пройшов перевірку, він відповідає умовам завдання.
У поодиноких випадках буває, що рішення підігнано під тести, але це видно відразу.
Створювати навчальні матеріали, зрозумілі всім без винятку, досить складно. Ми дуже намагаємося, але завжди є що покращувати. Якщо ви зустріли матеріал, який вам незрозумілий, напишіть проблему в «Обговореннях». Ідеально, якщо ви сформулюєте незрозумілі моменти як запитань. Зазвичай, нам потрібно кілька днів для внесення правок.
До речі, ви також можете брати участь у покращенні курсів: унизу є посилання на вихідний код уроків, який можна правити прямо з браузера.
Корисне
Визначення
- Логічні оператори - оператори «І» (and), АБО (or), що дозволяють створювати складові логічні умови.
Логічні висловлювання та оператори в Python
Часто в реальному житті ми погоджуємося з будь-яким твердженням або заперечуємо його. Наприклад, якщо вам скажуть, що сума чисел 3 і 5 більша за 7, ви погодитеся, скажете: "Так, це правда". Якщо ж хтось стверджуватиме, що сума трьох і п'яти менша за сім, то ви розціните таке твердження як помилкове.
Подібні фрази припускають лише дві можливі відповіді - або "так", коли вираз оцінюється як правда/істина, або "ні", коли твердження оцінюється як помилкове/хибне. У програмуванні та математиці якщо результатом обчислення висловлювання може лише істина чи брехня, то такий вираз називається логічним.
Наприклад, вираз 4> 5 є логічним, тому що його результатом є або правда, або брехня. Вираз 4+5 не є логічним, тому що результатом його виконання є число.
На позаминулому уроці ми познайомилися з трьома типами даних – цілими та речовими числами, а також рядками. Сьогодні введемо четвертий – логічний тип даних (Тип bool). Його також називають булевим. Цей тип має лише два можливі значення: True (правда) і False (брехня).
>>>
a
=
True
>>>
type(a)
>>>
b
=
False
>>>
type(b)
Тут змінною a було надано значення True , після чого за допомогою вбудованої в Python функції type() перевірено її тип. Інтерпретатор повідомив, що це змінна класу bool. Поняття " клас " і " тип даних " у разі одне й те саме. Змінна b також пов'язана з булевим значенням.
У програмуванні False зазвичай дорівнюють до нуля, а True – до одиниці. Щоб у цьому переконатися, можна перетворити булеве значення до цілого типу:
>>>
int(True)
1
>>>
int(False)
0
Можливо й протилежне. Можна перетворити будь-яке значення до булевого типу:
>>>
bool(3.4)
True
>>>
bool(-150)
True
>>>
bool(0)
False
>>>
bool(' ')
True
>>>
bool('')
False
І тут працює правило: все, що не 0 і не порожнеча є правдою.
Логічні оператори
У природній мові (наприклад, російській), щоб порівнювати одне з одним, ми використовуємо слова "рівно", "більше", "менше". У мовах програмування для цього є спеціальні знаки, подібні до тих, що використовуються в математиці: > (більше), < (менше), >= (більше або одно),
Не плутайте операцію надання значення змінної, що позначається в мові Python одиничним знаком "рівно", і операцію порівняння (два знаки "рівно"). Присвоєння та порівняння – різні операції.
>>>
a
=
10
>>>
b
=
5
>>>
a
+
b
>
14
True
>>>
a
14
-
b
False
>>>
a
b
+
5
True
>>>
a
!=
b
True
>>>
a
==
b
False
>>>
c
=
a
==
b
>>>
a,
b,
c
(10, 5, False)
У цьому прикладі вираз c = a == b і двох подвыражений. Спочатку відбувається порівняння (==) змінних a і b. Після цього результат логічної операції надається змінною c. Вираз a, b, c виводить значення змінних на екран.
Складні логічні вирази
Логічні вирази типу kbyte >= 1023 є простими, оскільки у яких виконується лише одне логічна операція. Однак, на практиці нерідко виникає потреба у складніших виразах. Може знадобитися відповіді "Так" або "Ні" залежно від результату виконання двох простих виразів. Наприклад, "на вулиці йде сніг чи дощ", "змінна news більше 12 і менше 20".
У таких випадках використовуються спеціальні оператори, що поєднують два і простіші логічні вирази. Широко використовуються два оператори - так звані логічні І (and) та АБО (or).
Щоб отримати True під час використання оператора and , необхідно, щоб результати обох простих виразів, які пов'язує даний оператор, були істинними. Якщо хоча б в одному випадку результатом буде False, то і все складне вираз буде хибним.
Щоб отримати True при використанні оператора or необхідно, щоб результат хоча б одного простого виразу, що входить до складу складного, був істинним. У випадку оператора or складне вираз стає хибним лише тоді, коли хибні обидва складові його прості вирази.
Припустимо, змінної x було присвоєно значення 8 (x = 8), змінної y привласнили 13 (y = 13). Логічне вираз y < 15 and x >8 виконуватиметься в такий спосіб. Спочатку виконається вираз y<15. Його результатом буде True. Потім виконається вираз x >8. Його результатом буде False. Далі вираз зведеться до True and False, що поверне False.
>>>
x
=
8
>>>
y
=
13
>>>
y
15
and
x
>
8
False
Що стосується оператора or друге простий вираз перевіряється, якщо перше повернуло брехню, і перевіряється, якщо перше повернуло істину. Так як для істинності всього виразу досить єдиного True , неважливо, по який бік від or воно стоїть.
>>>
y
15
or
x
>
8
True
У мові Python є ще унарний логічний оператор not, тобто заперечення. Він перетворює правду на брехню, а брехню на правду. Унарний він тому, що застосовується до одного виразу, що стоїть після нього, а не праворуч і ліворуч від нього як у випадку бінарних and і or.
>>>
a
=
5
>>>
b
=
0
>>>
not
a
False
>>>
not
b
True
Число 5 трактується як істина, заперечення істини дає брехню.Нуль прирівнюється до False. Заперечення False дає True.
Практична робота
- Надайте двом змінним будь-які числові значення.
- Використовуючи змінні із п. 1, за допомогою оператора and складіть два складні логічні вирази, одне з яких дає істину, інше – брехня.
- Аналогічно виконайте п. 2, але з оператором or .
- Спробуйте використати у логічних виразах змінні рядкового типу. Поясніть результат.
- Напишіть програму, яка б запитувала у користувача два числа і виводила б True або False залежно від того, більше перше число другого чи ні.
Приклади рішення та додаткові уроки у pdf-версії курсу
Python. Введення у програмування