---
# System prepended metadata

title: 1. Коробочки та імена
tags: [book]

---

---
tags: book
---
# 1. Коробочки та імена

## До читача

Цей курс, ця книга --- ***про магію***. Конструктивну *магію*. Щось, що одночасно повсюдне, але разом з тим --- індивідуальне. Те, що перенаправляє енергію та рухає матерію в часопросторі.

Медіум (провідник) *магії* в нашому світі --- **комп'ютери**. В основному саме електронні пристрої. Лептопи, сервери, смартфони, плати. Саме вони є "чарівними паличками", без яких *магія* не може швидко та ефективно впливати на реальність.

Але недостатньо тільки чарівної палички. Потрібно мати заклинання записане на папері. У випадку з конструктивною *магією*, про яку я говорю, заклинання повинно бути записано **мовою програмування** та перетворено у біти-байти електронного вигляду.

Та навіть якщо є і заклинання, і медіум, **цього не достатньо**. Вміти запускати код на комп'ютері ще не означає, що ти --- *чарівник*. Юзер, як максимум. Справжній *маг* мусить вміти створювати нові заклинання, нову *магію*. І нова *магія* створюється в голові. Так, я думаю ця фраза недостатньо виділена, і її важливість не зрозуміла, тому́ прокричу:

:::danger
**МАГІЯ ПОЧИНАЄТЬСЯ У ГОЛОВІ ЧАРІВНИКА!**
:::

Не забувай про це. *Магія* в першу чергу утворюється в голові, потімп ерекладається у код, який уже потім виконується на комп'ютері та змінює навколишній світ.

Тому, приділяй увагу в першу чергу то́му, **ЩО** ти думаєш, в другу чергу --- **ЯК** ти думаєш, і в третю чергу --- **ЧИ ПРАВИЛЬНО** ти думаєш. Якщо в процесі навчання ти перестав *думати*, то це збій програми, охрана атмєна. Закрий очі та спробуй знову уявити. Від цього залежить успіх навчання.

## Скрипт для вчителя

---

## Магія SWAP

:::warning
Магія змінює реальність через комп'ютери. В комп'ютери магія потрапляє через закликання (код). Заклинання пишуться магами (як правило людьми). А люди створюють магію в голові, в мозку. **Все це --- основний рух магії в природі**.

Але як це, створювати магію в голові?
:::

Оскільки основний рух магії починається в мозку, я підготував спеціальні вправи для починаючого чародія. Ці вправи потрібно виконувати в голові, без використання паперу. 

Якщо щось "не влазить" в голову, спробуй відволіктись, поспати, послухати музику, зробити собі коробочки і дивитись на них, писати різні імена на листочках та переклеювати їх. А потім повертайся до завдань.

*Імена та коробочки --- це один з фундаментів магії*.

### SWAP v1

Цю послідовність потрібно виконувати з операцією **переміщення** --- вміст однієї коробочки повністю "переміщується" в іншу коробочку.

1. ... Очисти сцену.
2. Уяви три коробочки. Назви їх `a`, `b` та `temp`
3. Помісти в перші дві коробочки два різних числа. Наприклад, 1 та 2. Що в третій коробочці?
4. Число з коробочки `a` перемісти у коробочку `temp`. Назви коробочки і що в них знаходиться.
5. Число з коробочки `b` перемісти у коробочку `a`. Назви коробочки і що в них знаходиться.
6. Число з коробочки `temp` перемісти у коробочку `b`. Назви коробочки і що в них знаходиться.

:::info
**Завдання**: виконай це в уяві 5 разів, для закріплення

**Питання**: 
- що цей алгоритм робить?
- що станеться, якщо виконати цей алгоритм два рази підряд?
    - три рази підряд? 
    - чотири рази підряд?
:::

:::spoiler Перевір себе
1. --
2. Всі три коробочки --- порожні
3. Наприклад, 3 та 5. Третя коробочка --- порожня
  `a` --- 3, `b` --- 5, `temp` --- порожня
4. `a` --- порожня, `b` --- 5, `temp` --- 3
5. `a` --- 5, `b` --- порожня, `temp` --- 3
6. `a` --- 5, `b` --- 3, `temp` --- порожня

Цей алгоритм міняє місцями вміст коробочок `a` та `b`. Якщо виконати його два рази підряд, то числа повернуться в початкове положення. Взагалі, парна кількість повторів --- позиція чисел не змінюється, непарна --- числа міняються місцями.
:::

### SWAP v2

А цей алгоритм потрібно виконувати з операцією **копіювання** --- вміст однієї коробочки дублюється в іншу коробочку. Копіювання відбувається з заміною!

1. Очисти сцену.
2. Уяви три коробочки. Їх назви `x`, `y` та `temp`
3. Помісти в перші дві коробочки два різних числа. Наприклад, 2 та 3. Що в третій коробочці?
4. Число з коробочки `x` скопіюй у коробочку `temp`. Назви коробочки і що в них знаходиться.
5. Число з коробочки `y` скопіюй у коробочку `x`. Назви коробочки і що в них знаходиться.
6. Число з коробочки `temp` скопіюй у коробочку `y`. Назви коробочки і що в них знаходиться.

:::info
**Завдання**: виконай це в уяві 5 разів, для закріплення

**Питання**: що цей алгоритм робить?
:::

:::spoiler Перевір себе
1. --
2. Всі три коробочки --- порожні
3. Наприклад, 0 та 10. Третя коробочка --- порожня
  `x` --- 0, `y` --- 10, `temp` --- порожня
4. `x` --- 0, `y` --- 10, `temp` --- 0
5. `x` --- 10, `y` --- 10, `temp` --- 0
6. `x` --- 10, `y` --- 0, `temp` --- 0

Цей алгоритм міняє місцями вміст коробочок `x` та `y`. В коробочці `temp` залишається проміжний результат --- копія `y`. 
:::

### SWAP v3

А в цьому алгоритмі уже інша операція --- **перенесення імені**. Цікаво, що тепер нам не потрібна третя коробочка! Зате на одну коробочку можна наліпити кілька імен!

1. Очисти сцену.
2. Уяви дві коробочки. Назви їх `first` та `second`. Це --- імена, уяви їх як наліпки на коробочки.
3. Помісти в коробочки два різних числа. Які є коробочки, які в них імена та які там числа?
4. Наліпи ім'я `temp` на коробочку з іменем `first`. Назви коробочки, які у них імена та що в них знаходиться.
5. Переліпи ім'я `first` на коробочку з ім'ям `second`. Назви коробочки, які у них імена та що в них знаходиться.
6. Переліпи ім'я `second` на коробочку з ім'ям `temp`. Назви коробочки, які у них імена та що в них знаходиться.

:::info
**Завдання**: виконай це в уяві 5 разів, для закріплення

**Питання**: що цей алгоритм робить?
:::

:::spoiler Перевір себе
1. --
2. --
3. Перша кор.: ім'я `first`, число -1
  Друга кор.: ім'я `second`, число 99
4. Перша кор.: імена `first` та `temp`, число -1
  Друга кор.: ім'я `second`, число 99
5. Перша кор.: ім'я `temp`, число -1
  Друга кор.: імена `second` та `first`, число 99
6. Перша кор.: імена `temp` та `second`, число -1
  Друга кор.: ім'я `first`, число 99
  
Як не дивно, коробочки не міняють свій вміст. АЛЕ! Міняються імена коробочок. Та, яка раніше називалась `first` стає `second`, а та яка раніше була `second` стає `first`. В сумі це виглядає так, ніби коробочки `first` та `second` помінялися місцями!

Єдине треба зауважити, що на одній з коробочок тепер висить "лишнє" ім'я `temp`.
:::

### SWAP мовою Python, частина 1

:::warning
Якщо ти сумлінно виконуєш всі завдання в голові, то мабуть розумієш --- це доволі важко, вимагає багато концентрації уваги. І вимагає пам'ятати, що відбувається у кожен крок. Щоб спростити це, потрібно записати думки.
:::

Мова Python дозволяє записати вищеописану *магію* у вигляді *заклинання*, або коду. Давайте я спочатку покажу як це виглядає, а потім опишу деталі:

```python=
# коробочки та числа в них
a = 0
b = 5
temp = None

# магія
temp = a
a = b
b = temp

# тепер a та b помінялись місцями!
```

Твоє завдання: перевірити що це дійсно так.

1. По-перше, кожен рядок вверху можна записати в командному рядку Python, наприклад, на офіційному сайті: https://www.python.org/shell/
  ![](https://i.imgur.com/P79ToS5.gif)
2. По-друге, кожен рядок --- це окрема команда. Деякі команди створюють нові коробочки, інші --- роблять маніпуляції з коробочками або іменами.
3. По-третє, щоб взнати "що в коробочці", достатньо просто написати її ім'я в новому рядку:
  ![](https://i.imgur.com/OnrkI2r.png)
4. По-четверте, так, там слово `None` мусить бути з великої букви! Переладається як "нічого", "порожньо", а читається --- "нан".
5. По-п'яте, слово "temp" --- скорочення від слова "temporary", перекладається як "тимчасовий". Традиційно, імена `t`, `temp`, `tmp` використовуються для тимчасових, не важливих (але потрібних) коробочок. Можна придумати і інші імена, тут немає обмежень з боку мови Пайтон. Просто традиція.

:::info
**Завдання**: спробуй і переконайся!
:::

:::spoiler (а після того як спробував, дивись сюди)
1. Можна показати на екран одразу кілька коробочок, через кому
2. Можна назвати коробочки по-іншому. Суть не зміниться
![](https://i.imgur.com/rTXh1m7.png)
:::

### SWAP мовою Python, частина 2

Перше справжнє завдання для чарівника-дослідника: а який з видів алгоритмів SWAP тут записаний? Як ти бачив, є три різних алгоритми. І всі вони уявляються по різному.

На всіх коробочках є заводські номери. Якщо ми знатимемо заводські номери на кожному кроці алгоритму, то зможемо відслідкувати рух коробочок, точно так само як поліцейські відслідковують машини по заводським номерам двигунів.

Щоб взнати заводський номер коробочки, потрібно запустити таку команду:
```python
id(ім'я коробочки)
```

Наприклад:
```python=
>>> a = 0
>>> b = 5

>>> id(a)
140395481564256

>>> id(b)                                      
140395481564416
```

Номери довгі, але різні. Значить, це різні коробочки. Тож, як робити дослідження? Спробуйте запускати по одній команді, і після цього через `id` дивитись та записувати номери коробочок. Потім спробуйте по тому, як змінюються номери, визначити алгоритм.

:::info
**Питання**: то що, а) коробочки переносяться, б) вміст коробочок копіюється чи в) переклеюються імена на коробочках? Як воно працює?
:::

:::spoiler Підказка №1 (дивитись тільки якщо зовсім не знаєш як бути)
```python=
>>> a = 0; b = 10; temp = None

>>> id(a), id(b), id(temp)
(...9131616, ...9131936, ...8804656)

>>> temp = a
>>> id(a), id(b), id(temp)
(...9131616, ...9131936, ...9131616)

>>> a = b
>>> id(a), id(b), id(temp)
(...9131936, ...9131936, ...9131616)

>>> b = temp
>>> id(a), id(b), id(temp)
(...9131936, ...9131616, ...9131616)
```
Так, я цього не казав, але кілька дій можна впихнути в один рядок, якщо між ними написати крапку з комою ("semicolon" англійською).
:::

:::spoiler Підказка №2 (дивитись тільки якщо попередня підказка не допомогла)

Як легко підсвітити однакові числа? Можна виділити число і пошукати його на сторінці через Ctrl-F, тоді браузер підсвітить ці числа:

![](https://i.imgur.com/qpz9h6B.png)

---

![](https://i.imgur.com/gfMiZqv.png)

---

![](https://i.imgur.com/42t5CsV.png)

:::

:::spoiler Підказка №3 

Варіант SWAP v1 точно не підходить, бо у нас немає порожніх коробочок в кінці. Тому залишається або варіант v2 або v3. Щодо цього є така підказка. Спробуємо створити три різні коробочки з одним значенням:
```python=
>>> temp1 = None; temp2 = None; temp3 = None
>>> id(temp1); id(temp2); id(temp3)
140258218804656
140258218804656
140258218804656

>>> temp4 = 42; temp5 = 42; temp6 = 42
>>> id(temp4); id(temp5); id(temp6)
140258219132960
140258219132960
140258219132960
```
Який можна зробити висновок?
:::

:::spoiler Підказка, яка ускладнює життя

В попередній підказці було показано, що у однієї коробочки може бути кілька імен. І було показано це на прикладі коробочки 42. Але чи для всіх чисел це так?
```python=
>>> temp7 = 1000
>>> temp8 = 1000
>>> temp9 = 1000
>>> id(temp7); id(temp8); id(temp9)
140257988333040
140257988332816
140257988332880
```
Як це пояснити? Чи змінює це наше уявлення про роботу алгоритму SWAP?
:::

### Неправильний SWAP

Ось типова помилка, яку роблять починаючі чародії при реалізації SWAP:

```python=
a = 10
b = 20

# Поміняємо місцями значення a та b
a = b
b = a
```

:::info
**Питання**: чому це неправильно?
:::

### SWAP мовою Python, частина 3

Все, що було до цього моменту --- це була розминка.

Всі ці попередні алгоритми потрібні були щоб зрозуміти, де коробочки, де --- їх номери, і де --- їх імена. Насправді Пайтон дозволяє робити SWAP дуже просто:

```python=
b, a = a, b
```

Ось і все. Навіть якщо є три коробочки, це працює:

```python=
b, c, a = a, b, c
```

Перетворення вище можна записати більш розгорнуто:
- перейменування `b` $\leftarrow$ `a`.
- перейменування `c` $\leftarrow$ `b`.
- перейменування `a` $\leftarrow$ `c`.

А також (і це важливо!) це можна записати через простіші конструкції:

```python=
temp = с
с = b
b = a
a = temp
```

:::info
**Завдання**:
1. Переконайся, що перетворення вище таке саме як і `b, c, a = a, b, c`
2. Уяви це перетворення
3. Чи можна зробити цей SWAP3 **не використовуючи** додаткове ім'я `temp`?
4. Запиши простішими командами перетворення `a, b, c = c, a, b`
:::

### SWAP, закріплення

```python=
a, b, c = c, b, a
b, a = c, b
```

:::info
**Питання**: яка перестановка відбулась вище?
:::

:::spoiler Перевір себе
В `a` $\leftarrow$ `b`
В `b` $\leftarrow$ `a`
В `c` $\leftarrow$ `a`
:::

### Хитра махінація

Ось ще один простий приклад з коробочками:
```python=
a = 1
b = a
c = b
a = 2
```

:::info
**Питання**: які тепер значення в коробочках `a`, `b`, `c`? Використай знання з попередніх прикладів та свою уяву.
:::

:::spoiler Перевір себе

В `b` та `c` --- 1, в `a` --- 2.

Це можна пояснити, якщо уявити кожен рядок як наклеювання/переклеювання імені на відповідну коробочку.
:::

### Особливі SWAP, багато коробочок, частина 1

Я показав вище SWAP для двух та трьох коробочок/імен. А що як коробочок більше?

Більше коробочок --- більше мороки, тому спробую підвести до цього більш плавно.

Скільки може бути різних перестановок двух коробочок? Можливо це неочікувано, але дві коробочки можна переставити тільки одним способом:

![](https://i.imgur.com/K76AUAY.gif)

Більше варіантів немає. На анімації зверху показано поворот за годинниковою стрілкою, та навіть якби там був поворот проти годинникової стрілка, це була би та сама перестановка. Але для трьох коробочок уже цікавіше.

:::info
**Завдання**: опиши всі можливі перестановки трьох коробочок.
:::

:::spoiler Підказка №1
Всього їх є 5.
:::
:::spoiler Підказка №2
Три з них уже було згадано у вправах вище!
:::
:::spoiler Просто картинка для привертання уваги
![](https://i.imgur.com/zHrPnPi.gif)
:::
:::spoiler Перевір себе
Я запишу всі 5 перестановок мовою Пайтон, бо малювати картинки накладно:
```python=
b, c, a = a, b, c     # зсув вліво
c, a, b = a, b, c     # зсув вправо
c, b, a = a, b, c     # задом наперед
b, a, c = a, b, c     # переставити першу і другу
a, c, b = a, b, c     # переставити другу і третю
```
Чисто технічно, існує ще шоста перестановка:
```
a, b, c = a, b, c
```
і вона називається "тривіальна", бо нічого не відбувається :smiley:. Як нуль у світі перестановок, нічого цікавого. Майже нічого цікавого ;) 
:::

### Особливі SWAP, багато коробочок, частина 2

Перший особливий SWAP для багатьох коробочок --- це перестановка "задом-наперед":

```python=
v5, v4, v3, v2, v1 = v1, v2, v3, v4, v5
```

Така перестановка існує для будь-якої кількості коробочок. Нюанс в тому, що якщо кількість коробочок непарна --- то середня коробочка (`v3` в цьому випадку) нікуди не переставляється.

Англійською мовою така перестановка називається *"reverse"*.

:::info
**Завдання**: запиши (уяви) цю перестановку через простіші двох-коробочні перестановки.
:::
:::spoiler Перевір себе
```python=
# reverse
v5, v1 = v1, v5
v4, v2 = v2, v4
```
Всього дві команди!
:::

:::info
**Питання**: що станеться, якщо зробити цю перестановку двічі? Чи залежить це від парності кількості коробочок?
:::
:::spoiler Перевір себе
Коробочки повернуться в початкове положення. Не залежить.
:::
---

Другий особливий SWAP для багатьох коробочок --- це так званий циклічний зсув, або ротація. Коли перша коробочка переноситься в кінець, а всі інші зсуваються на одне місце:

```python=
x2, x3, x4, x5, x1 = x1, x2, x3, x4, x5
```

Але у неї є двійник --- коли зсув відбувається в протилежну сторону!

```python=
x5, x1, x2, x3, x4 = x1, x2, x3, x4, x5
```

В англійській мові ці перестановки називають *"circular shift"*, інколи *"rotate"*. І щоб їх відразняти, кажуть *"rotate left"* або *"rotate right"*, ротація вліво або вправо.

:::info
**Завдання**:
- запиши (уяви) ці перестановки через простіші перестановки
- зроби "ротацію вліво" через "ротації вправо" (або навпаки)
:::

:::spoiler Перевір себе
Є два варіанти зробити ротацію. Перший, використовуючи тимчасове ім'я:
```python=
# ротація вліво
temp = x1
x1 = x2
x2 = x3
x3 = x4
x4 = x5
x5 = temp
```
Другий варіант, через простий SWAP:
```python=
# ротація вліво
x2, x1 = x1, x2
x3, x2 = x2, x3
x4, x3 = x3, x4
x5, x4 = x4, x5
```
Ротацію вправо можна зробити через 4 ротації вліво:
```python=
# ротація вправо
x2, x3, x4, x5, x1 = x1, x2, x3, x4, x5
x2, x3, x4, x5, x1 = x1, x2, x3, x4, x5
x2, x3, x4, x5, x1 = x1, x2, x3, x4, x5
x2, x3, x4, x5, x1 = x1, x2, x3, x4, x5
```
Так, просто повторити 4 рази!
![](https://i.imgur.com/tWusX1n.gif)
![](https://i.imgur.com/MRmrz5Q.gif)
:::

:::info
**Питання**: що буде якщо зробити ротацію вліво 10 разів? 15 разів? 16 разів?
:::
:::spoiler Перевір себе
Кожні 5 ротацій позиція коробочок буде повторюватись. Тому якщо зробити ротацію 5, 10, 15, 20, 25, ... разів, то коробочки будуть повертатись на свої першопочаткові місця. Відповідно, 16 ротацій це те саме що 1 ротація.
:::

## Коробочки з багатим внутрішнім світом

:::warning
А тепер, від простих числових коробочок перейдемо до складних. В цьому розділі потрібно буде думати про реальні об'єкти --- наприклад, про людей --- як про коробочки.
:::

Для правильного уявлення про складні коробочки-об'єкти, потрібно розповісти про *дочірні імена* та про *тентаклі*.

- дочірні імена: кожен об'єкт складається з інших об'єктів. Наприклад, об'єкт "людина" складається з рук, ніг, голови та інших органів. І **"рука Григорія"** це не те саме, що **"рука Вікторії"**. В цьому випадку **"Григорій"**, **"Вікторія"** --- імена, а **"рука"**, **"нога"** --- дочірні імена
- коробочки можуть випускати тентаклі. Так, щупальця. Багато шупалець. На кінці кожного шупальця є маленький кубик з заводським номером коробочки. Ці щупальця поводяться дуже дивно, але разом з тим вони з'єднують різні об'єкти докупи

### Люди-коробочки

Подумай (або уяви) собі людей: твоїх друзів та твою сім'ю. У кожної людини є вік (у роках) та ім'я. Скільки таких людей ти можеш згадати?

:::info
**Завдання**: подумай та пригадай вік та ім'я для:
- своїх друзів
- своєї сім'ї: батьків, дідусів, бабусь, рідних братів та сестер
:::

В подальшому тобі доведеться кожну згадану людину за допомогою магії в своїй уяві перетворити в коробочку з ім'ям, заводським ім'ям, кількома дочірніми іменами та тентаклями. 

### Друзі-коробочки

Якщо ти можеш уявити свого друга як коробочку з тентаклями, це дуже добре. Я покажу як записати таку думку мовою Пайтон:

```python=
class Friend: pass

aleks = Friend()
```

В першому рядку я описав абстрактного "друга", а в третьому рядку я створив друга-коробочку з ім'ям `aleks`. Як вказати своєму другу вік та ім'я?

```python=
class Friend: pass

aleks = Friend()
aleks.age = 31
aleks.name_ukr = "Сашко"
aleks.name_eng = "Sasha"
```

Тепер мій друг з думок перетворився на друга-коробочку з трьома властивостями (дочірніми іменами). 

Зробивши кілька таки друзів-коробочок я буду мати *базу даних* своїх друзів. Малееньку, але базу.

```python=
class Friend: pass

aleks = Friend()
aleks.age = 31
aleks.name_ukr = "Сашко"
aleks.name_eng = "Sasha"

taras = Friend()
taras.age = 31
taras.name_ukr = "Тарас"
taras.name_eng = "Taras"

#...
```
Я можу перевірити що всі дані записані коректно в Пайтоні:

![](https://i.imgur.com/iUtzxgj.gif)

:::info
**Завдання**: 
- перетвори своїх друзів в коробочки, дай цим коробочкам імена та вкажи їх властивості (ім'я та вік, можливо нікнейм)
- запиши свою уяву мовою Пайтон
- перевір, що можна отримати вік будь-якої коробочки (`age`)
:::

### Кращий друг

Не в сенсі "мій найкращий друг", а в сенсі --- кращий вигляд друга-коробочки.

![](https://i.imgur.com/5hNew9Z.png)

Виглядає не дуже зрозуміло, але це можна поправити. Зробимо новий клас, `NiceFriend`:

```python=
class NiceFriend:
    def __str__(self):
        return str(self.__dict__)
    def __repr__(self):
        return str(self)
```

і використаємо його для створення друзів-коробочок:
```python=
aleks = NiceFriend()
aleks.age = 31
aleks.name = "Алекс"
```
![](https://i.imgur.com/w2MBNDy.png)

Це, звісно не інфографіка, але краще ніж було.

:::info
**Завдання**: зміни свій попередній код так, щоб використовувався `NiceFriend`.
:::

(Я не пояснюю в деталях як воно працює. Вважай поки-що, що це магія, пояснення будуть згодом)

### Сім'я з щупальцями

Як я згадував, наші коробочки --- магічні, у них є *тентаклі*. Тентаклі (або щупальця) --- це спосіб яким коробочки об'єднуються. Одна коробочка тягне щупальце до іншої коробочки, так і прилипає.

Тентаклі мають такі особливості:
- щупальця прилипають до об'єкта. Місце, де щупальце прилипло можна якось назвати
- якщо взятись за щупальце, то його можна потягнути, і цим самим отримати коробочку
- щупальце можна обрізати, обірвати, тоді воно зникає
- щупальця між собою не з'єднуються, але вони можуть вдвох приліпитись до іншої коробочки (під різними дочірніми іменами)
- в деяких випадках щупальце може прилипнути до своєї ж коробочки, але краще так не робити!

Ти, як маг, контролюєш хто скільки щупалець має та які щупальця куди прилипають. І перший приклад використання щупалець --- родинні зв'язки.

Нехай у нас є сім'я (сподіваюсь, ти можеш уявити цих людей по їх коробочкам):

```python=
class Human:
    def __str__(self):
        return str(self.__dict__)
    def __repr__(self):
        return str(self)

me = Human()
me.name = "Данило"

eugene = Human()
eugene.name = "Євген"

tanya = Human()
tanya.name = "Тетяна"
```

Якщо я хочу вказати, що `eugene` --- мій батько, а `tanya` --- моя мама, то я вкажу цим людям-коробочкам протягнути щупальця до мене-коробочки:

```python=
me.father = eugene

me.mother = tanya
```
Тепер до мене-коробочки прилипло два щупальця, і я можу їх розрізняти, бо їм дав різні імена --- `father` та `mother`.

![](https://i.imgur.com/N6ZZGZb.png)

Щоб "обірвати щупальце", є спеціальна команда `del`:
![](https://i.imgur.com/frHOxgF.png)

Добре, а як зробити так, щоб батьки-коробочки знали про мене-коробочку як про сина? Точно так само:

```python=
me.father = eugene
me.mother = tanya

me.father.son = me
me.mother.son = me

## це те саме, що
# eugene.son = me
# tanya.son = me
```
![](https://i.imgur.com/i5S34Fz.png)

Зауваж, що `father` та `son` --- це різні щупальця, один тягнеться від `eugene` $\rightarrow$ `me`, інший --- `me` $\rightarrow$ `eugene`. Не забувай!

Отже, тепер у тебе є всі знання щоб записати твоє дерево сім'ї у вигляді заклинання! 

:::info
**Завдання**: 
- запиши своє генеалогічне дерево хоча б до третього покоління (дідусі та бабусі)
- вкажи кожному ім'я та професію
:::
:::info
**Питання**:
- що краще вказувати --- вік чи рік народження?
- як взнати ім'я бабусі за допомогою Python?
- як взнати професію сина батька твоєї матері за допомогою Python?
:::
:::spoiler Перевір себе
- краще вказувати рік народження. Вік постійно змінюється, тому треба буде оновлювати дані час від часу, а рік народження --- не змінюється
- `me.father.mother.name` та `me.mother.mother.name`
- `me.mother.father.son.profession`
:::

### Практика

Будь-яка достатньо складна магія складається з великої кількості коробочок і великої кількості щупалець (зв'язків) між коробочками. Рекомендую попрактикуватись в цьому.

Подумай, яку область ти знаєш дуже добре (краще ніж інші), і запиши її об'єкти та зв'язки між ними мовою Пайтон. Ось приклади для тем:
- комп'ютерні ігри, яка в якому році вийшла, які ігри є клонами інших ігор, ...
- музика, які групи надихали інші гурти, жанри, учасники, ...
- наука, техніка, якась специфічна область
- історія
- автомобілі
- ютуб канали, які канали які рекомендують, популярність, ...
- ...

:::info
**Завдання**: досліди свої думки і запиши найкраще знану область мовою Пайтон, щоб було багато коробочок та щупалець між коробочками.
:::
