# 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)