Булева алгебра – это раздел математики, который занимается операциями над логическими значениями и включает двоичные переменные. Булева алгебра ведет свое начало от книги математика Джорджа Буля (на картинке выше) 1854 года.
Основные понятия в булевой алгебре это true и false, они же истина и ложь, и три оператора not, * and*, и or. Они же не, и и или.
Очень большая часть программирования строится именно на двоичной алгебре и оперирует понятиями из этой алгебры.
Тип Python boolean является одним из встроенных типов данных Python. Он используется для представления истинности
значения выражения. Например, выражение 1 < 2
является True
, тогда как выражение 0 == 1
является False
.
Понимание того, как ведут себя логические значения Python, важно для качественного программирования на Python.
Запомните слова True и False именно с большой буквы – они являются ключевыми в языке Python, и вы не можете использовать их как название переменной, функции, класса и т.д.
Эти понятия есть в каждом языке программирования (которые используются коммерчески, возможно, есть исключения для некоторых проектов, сделанных для веселья), которые мне известны.
Такой тип данных называется булевый, а такие переменные – булевые.
Может быть только два значения: True и False.
Есть три способа, как переменная может быть булевым значением:
- Явное создание переменной такого типа:
some_true_variable = True
some_false_variable = False
- Приведение типов
Как вы уже знаете в python-е есть разные типы данных, например, числа, строки и булевые значения. На самом деле их намного больше, и мы будем их изучать.
Python это язык с динамической строгой типизацией, а это значит, что мы не обязаны указывать какой тип переменной мы создаем, но мы не можем сложить или сравнить между собой число и строку.
А что если нам нужно сложить число со строкой? Например, у нас есть переменная со значением 45 и другая со значением " 47".
Первая — это число, вторая — это строка. В таком случае у нас есть два варианта. Первый — сложить переменные как числа, второй — сложить их как строки. Чтобы у нас была такая возможность, мы должны изменить тип одной из них, а затем работать с одним и тем же типом данных. Чтобы привести один тип к другому, все, что нам нужно, это написать название типа маленькими буквами и в скобках указать, что именно мы хотим изменить.
my_num = 45 # Это число
my_str = '47' # Это строка
print(my_num + my_str) # Вызовет ошибку
print(my_num + int(my_str)) # Распечатает 92
print(str(my_num) + my_str) # Распечатает 4547
my_str_not_number = 'blabla'
int(my_str_not_number) # Вызовет ошибку!! Эта строка не может быть преобразована в число
То же самое и с булевым типом, мы можем преобразовать что угодно в булевый тип bool(anything).
Для каждого типа данных свои правила преобразования к логическому типу. Для чисел и строк они такие:
Любая непустая строка преобразуется в True.
bool('') # False
bool('asdasd') # True
empty_string = ''
not_empty_string = 'some text'
bool(empty_string) # False
bool(not_empty_string) # True
С числами правила не сложнее, любое значение, которое не равно 0, это True.
bool(4) # True
bool(0) # False
bool(-3) # True
positive = 5
negative = -4
zero = 0
bool(positive) # True
bool(zero) # False
bool(negative) # True
bool(positive - 5) # False
bool(0.0) # False
- Как результат математического сравнения или результат некоторых ключевых слов.
Для сравнения в python используются математические символы
Можно сравнивать строки, числа, и многие другие типы данных, что детально мы разберем позже.
> - больше,
result = 5 > 3 # True
another_result = 3 > 5 # False
compare_the_same_values = 3 > 3 # False
small_value = 4
big_value = 6
compare_variables = big_value > small_value # True
compare_variables = small_value > big_value # False
compare_strings = 'ab' > 'baa' # False, базовое сравнение строк происходит по алфавиту
< - меньше, логика такая же
result = 5 < 3 # False
another_result = 3 < 5 # True
compare_the_same_values = 3 < 3 # False
small_value = 4
big_value = 6
compare_variables = big_value < small_value # False
compare_variables = small_value < big_value # True
compare_strings = 'ab' < 'baa' # True
>= - Больше или равно
result = 5 >= 3 # True
another_result = 3 >= 5 # False
compare_the_same_values = 3 >= 3 # True
small_value = 4
big_value = 6
compare_variables = big_value >= small_value # True
compare_variables = small_value >= big_value # False
compare_strings = 'ab' >= 'baa' # False
<= - меньше или равно
result = 5 <= 3 # True
another_result = 3 <= 5 # False
compare_the_same_values = 3 <= 3 # True
small_value = 4
big_value = 6
compare_variables = big_value <= small_value # False
compare_variables = small_value <= big_value # True
compare_strings = 'ab' <= 'baa' # True
== - равно (да там два символа равно, потому что один символ равно уже занят присвоением значения переменной)
result = 5 == 3 # False
another_result = 3 == 5 # False
compare_the_same_values = 3 == 3 # True
small_value = 4
big_value = 6
compare_variables = big_value == small_value # False
compare_variables = small_value == big_value # False
compare_strings = 'ab' == 'baa' # False
and - логическое и, !!! РЕЗУЛЬТАТ МОЖЕТ БЫТЬ НЕ БУЛЕВОЕ ЗНАЧЕНИЕ
Логическое и работает так. Если все значения в выражении истинны, результат также будет истинен. Но имейте в виду, что это ключевое слово не возвращает булево значение, оно возвращает первое значение, которое при преобразовании в булево будет ложным, или последнее, если оба истинны. Давайте лучше посмотрим примеры.
Логическому и и логическому или можно передавать разные типы данных слева и справа.
True and True # True
False and True # False
False and False # False
True and False # False
True and '' # ''
'a' and 0 # 0
0 and '' # 0
10 and '' # ''
'bla' and 23 # 23
or - логическое или, !!! РЕЗУЛЬТАТ МОЖЕТ БЫТЬ НЕ БУЛЕВОЕ ЗНАЧЕНИЕ
Логическое или работает так. Если одно значение в выражении истинно, результат также будет истинен. Но имейте в виду, что это ключевое слово не возвращает булево значение, оно возвращает первое значение, которое при преобразовании в булево будет истинным, или последнее, если оба ложны. Давайте лучше посмотрим примеры.
True or True # True
False or True # True
False or False # False
True or False # True
True or '' # True
'a' or 0 # 'a'
0 or '' # ''
10 or '' # 10
'bla' or 23 # 'bla'
not - преобразует True в False и наоборот. Сначала преобразует значение в булево, а затем меняет на противоположное.
not True # False
not False # True
not '' # True
not 33 # False
in - поиск подколлекции в коллекции. На этом уровне знаний используется для поиска вхождения одной строки в другую:
'ab' in 'bcde' # False
'ab' in 'abcd' # True
is - ИСПОЛЬЗУЕТСЯ ТОЛЬКО С ПЕРЕМЕННЫМИ, это проверка, находятся ли две переменные в одном и том же месте в памяти. Это немного сложно для понимания, и будет намного проще объяснить это, когда вы будете знать другие типы данных. Но объясню на некоторых примерах:
a = 500
b = 500
a is b # False
c = 500
d = c
c is d # True
Но у Python есть одна особенность работы этого оператора. Разработчики языка программирования решили, что числа от -5 до 255 используются очень часто, и нет никакого смысла создавать для этих чисел новую переменную каждый раз. Поэтому они сделали так, чтобы при запуске скрипта значения от -5 до 255 брались из внутренней памяти. Из-за этого возникает очень интересный эффект, и я очень люблю спрашивать об этом на собеседованиях.
a = 200
b = 200
a is b # True
a = 300
b = 300
a is b # False
На самом деле, как и в обычной математике, у любых операторов есть свой приоритет. В нашем языке программирования он такой:
Некоторые из этих операторов мы не изучали. Они используются намного реже, но если вы хотите, вы можете их изучить самостоятельно или спросить меня о деталях.
() - скобки
** - степень
+x, -x, ~x Унарный плюс, минус и битовое нет
*, /, //, % - Умножить, разделить, разделить без остатка, остаток от деления
+, - Сложение и вычитание
<<, >> Битовые сдвиги
& Битовое и
^ Битовое исключающее или
| Битовое или
==, !=, >, >=, <, <=, is, is not, in, not in - сравнения, вхождения итд.
not логическое нет
and логическое и
or логическое или
Если вы не уверены и хотите указать приоритет явно, просто используйте скобки
Любые из этих операций можно комбинировать:
age = int(input('Please enter your age:'))
name = input('Please enter your name:')
age > 18 and 'v' not in name
age < 10 or name == 'Kate'
age // 3 == 1 and len(name) > 4 or str(age) in name
В программировании есть несколько очень базовых концепций, одна из них – это ветвление.
Очень просто: выполнять блок кода только если условие истинно.
В Python для обозначения блоков кода мы используем обычные отступы. Во многих языках программирования для этого используются различные скобки. У нас используется 4 пробела (на большинстве компьютеров кнопка tab работает именно как 4 пробела).
Сейчас мы рассмотрим ключевые слова if, elif, else, но в Python любые структуры, которые вы будете изучать дальше, используют такой же синтаксис с четырьмя пробелами (или одним табом).
a = 100
b = 'bla'
if a:
print('will be printed')
if a > 50:
print('will be printed')
if 'c' in b:
print('wont be printed')
print("will be printed in any case")
Когда нам нужно добавить условие, мы просто пишем ключевое слово if, после него указываем условие и ставим двоеточие. Все, что должно выполняться при выполнении условия, должно быть написано ниже с отступом в 4 пробела. Все, что будет написано снова на предыдущем уровне, будет выполнено без условий.
Если нам нужно разделить выполнение кода на то, что делать, когда условие выполняется, и что делать, когда нет, мы можем использовать ключевое слово else.
a = 100
if a > 200:
print('wont be printed')
else:
print('will be printed')
Также мы можем добавить промежуточные условия, если не выполнится первый if, с помощью elif, который также требует условия:
Первое условие выполнилось? Нет? Ок, давайте проверим второе, тоже нет? Ну тогда пойдем в else
a = 80
if a > 100:
print('wontbe printed')
elif a > 50:
print('will be printed')
else:
print('wont be printed')
elif можно применять больше одного раза (точнее почти сколько угодно раз)
На самом деле это просто синтаксическое упрощение вот такой конструкции
a = 80
if a > 100:
print('wontbe printed')
else:
if a > 50:
print('will be printed')
else:
print('wont be printed')
Вы же не думали что вложенность может быть только одного уровня? :)
Только с версии 3.10 в Python добавили еще одну возможность использовать булевую алгебру. Во многих других языках эта конструкция называется switch case.
Идея в том, что мы можем задать несколько опций для проверки нашей переменной и выполнить только те, где наша проверка будет истинной.
status = 400
match status:
case 400:
print("Bad request")
case 401:
print("Unauthorized")
case 403:
print("Forbidden")
case 404:
print("Not found")
Будет напечатано "Bad request", потому что наша проверка остановится на версии status == 400. Эта конструкция имеет очень много деталей и тонкостей, если хотите, можете разобрать это самостоятельно, но моя практика показывает, что она используется редко.
Практика/Домашнее задание:
Задачи 1-5 это одно задание, а 6 это еще одно задание
-
Пользователь задает переменную возраст. Если он старше 18, распечатайте, что все хорошо, если нет, то распечатайте, что не все хорошо.
-
Добавить к первому условию: если возраст больше 100, распечатать текст, что пользователь вводит нас в заблуждение.
-
Добавить принты, является ли введенный возраст четным или нечетным.
-
Добавить, что пользователь вводит еще и имя. И если в имени есть буква 'a', то написать, что мы даже не собираемся его проверять.
-
Проверить, если в имени есть буква 'v', большая или маленькая, без разницы. И если возраст пользователя четный, то написать, что он выиграл приз, если нет, то не выиграл.
-
Спросить у пользователя возраст, пол и имя. Для всех младше 15 мы пишем, что рекомендуем теннис, для мальчиков старше 15 рекомендуем футбол, для девочек - баскетбол, но если в имени есть буква 'c' или 't', пишем, что не рекомендуем заниматься спортом.