# 2. Булева алгебра, множества, особенности сравнения объектов. На прошлом уроке мы уже знакомились с булевым типом данных. Переменная типа `bool` может содержать только два значения: **True** или **False**, при чем это не строки, не числа, а именно понятия ложь и истина. Для работы с булевыми переменными существует булева алгебра. ![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/George_Boole.jpg/267px-George_Boole.jpg) ### Булева алгебра (логические операторы) Существуют следующие логические операторы: * 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) Во многих, если не во всех языках программирования существуют условия вида **если - иначе, если - иначе**. Код выглядит примерно следующим образом: ``` если (X mod 2 == 0): число нечетное иначе: число четное ``` Операция mod - операция взятия остатка от деления. Есть различные варианты использования оператора `если`: просто `если`, с использованием `иначе` и с любым количеством `иначе, если` между `если` и `иначе, если`. ### Тернарные операторы Во многих языках программирования (С++, Java, PHP...) существуют тернарный оператор, т.е. специальный оператор условия, который возвращает один из двух результатов, в зависимости от того, выполняется его условие или нет. Выглядит он так: ``` сообщить (Время суток = 'утро') ? "Привет!" : "Пока!"; ``` Тернарные операторы часто применяются, когда варианта всего два, так как такая запись короче аналогичного действия с `если`. Однако, к сожалению, можно встретить связку нескольких `если` и тернарных операторов, которую совершенно невозможно прочесть. Другими словами, это не необходимая вещь в языке и она может стать причиной нечитаемого текста. ### Множества Множество или сет (set) по сути - "контейнер", содержащий не повторяющиеся, уникальные элементы в случайном порядке. В этом определении упомянуты две основные особенности сетов - **уникальность** и **отсутствие сортировки**. Уникальность - сет содержит только уникальные элементы, если добавлять в него дубликаты - они не добавляются, если перевести какую-то переменную с неуникальными данными в сет - дублирующие элементы будут удалены. Отсутствие сортировки - элементы в сете находятся в неком хаотичном порядке. Множества поддерживают перебор всех элементов (итерацию), добавление и удаление элементов, но в силу отсутствия сортировки не поддерживают индексацию и срезы. Создание множеств: ``` м1 = множество([1, 2, 3, 4, 5, 6]) м2 = множество([5, 6, 7, 8, 9]) a = [1, 2, 3, 4, 5, 6, 5, 4, 3, 2] вывести a [1, 2, 3, 4, 5, 6, 5, 4, 3, 2] м3 = множество(a) вывести м3 ([1, 2, 3, 4, 5, 6]) ``` Множества поддерживают операции вычитания, объединения, пересечения: ``` м1 = множество([1, 2, 3, 4, 5, 6]) м2 = множество([5, 6, 7, 8, 9]) м1 - м2 # Разность множеств ([1, 2, 3, 4]) м1 | м2 # Объединение множеств ([1, 2, 3, 4, 5, 6, 7, 8, 9]) м1 & м2 # Пересечение множеств ([5, 6]) ``` Можно добавить элемент в множество и удалить из множества элемент. В качестве параметра выступает сам элемент, поскольку индексов в множестве нет. ``` м1.добавить(7) вывести м1 ([1, 2, 3, 4, 5, 6, 7]) м1.удалить(1) вывести м1 ([2, 3, 4, 5, 6, 7, 8]) ``` ### Круги Эйлера ![](https://media.lpgenerator.ru/uploads/2016/10/25/4.jpg) Множества принято визуализировать при помощи кругов Эйлера. ### Практические задания на круги Эйлера **1. Разместить в кругах:** - Числа целые - Числа положительные - Числа отрицательные - Числа простые **2. Нарисовать круги для заварного кофе:** - эспрессо - американо - каппучино - латте - доппио **3. Решить задачу:** Все женщины - дочки, но не все женщины матери. Некоторые матери - бабушки. Нарисуйте внучек! **5. Разместить в кругах:** Зайцы четвероногие, млекопитающие, хордовые, живородящие. Лебеди птицы, яцекладущие, хордовые. Утконосы четвероногие, яйцекладущие, млекопитающие. **5. Разместить в кругах:** Всего Студентов 2000 Программистов 1500 Дизайнеров 300 Менеджеров 200 Фронтендщиков 1000 Бекендщиков 500 PHP программистов 200 JS программистов 1100 Java программистов 100 ## Полезные ссылки Доп. статьи: [Математическая логика](http://ya-znau.ru/znaniya/zn/135) [Решания задач при помощи кругов Эйлера](https://sibac.info/shcoolconf/science/xvii/42485) [Тест на логическое мышление](http://testoteka.narod.ru/pozn/1/10-on.html) [Онлайн создание диаграмм](https://creately.com/ru/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80-%D0%B4%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC-%D0%92%D0%B5%D0%BD%D0%BD%D0%B0-%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD) ## Домашка [Домашнее задание](hw2.md)