Skip to content

Latest commit

 

History

History
297 lines (223 loc) · 11.3 KB

lesson05.md

File metadata and controls

297 lines (223 loc) · 11.3 KB

Урок 5. Import, tuple, set, dict.

Імпорт бібліотек

Є три варіанти імпорту бібліотек: імпорт повністю всієї бібліотеки, імпорт переліку функцій з неї або імпорт функції з псевдонімом:

import sys #
from sys import argv #
from sys import argv as cli_param #

Tuple (кортеж...)

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

# New tuple made of different types
>>> t = (2, 2.05, "Hello")
>>> t
(2, 2.05, 'Hello')
# Assigning three different variables using tuple, multiple assignment
>>> (a, b, c) = t
>>> print(a, b, c)
2 2.05 Hello
>>> z, y, x = t
>>> print(z, y, x)
2 2.05 Hello
# Creating one element tuple
>>> x = 12,
>>> x
(12,)
# Creating tuple w/o brackets
>>> tup = 1, 2, 'qwerty'
>>> tup
(1, 2, 'qwerty')

До кортежів застосовуються багато функцій з тих, що застосовуються до списків: отримання довжини кортежу, конкатенація (склеювання) кортежу, зрізи, методи index і count:

>>> t = 1, 2, 3
>>> t = t + (4, 5)
>>> t
(1, 2, 3, 4, 5)
>>> t[:-1]
(1, 2, 3, 4)
>>> t[2:-1]
(3, 4)
>>> len(t)
5
>>> t.index(2)
1
>>> t.count(3)
1

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

Найчастіше кортежі використовують для того, щоб одержати дані з функції, зберігати дані тощо. Особливості роботи з ними:

  • робота з ними швидше (порівняно зі списками);
  • займають у пам'яті менше місця;
  • можуть виступати як ключі для словника;
  • не мають окремих методів;
  • використовуються для масової ініціалізації змінних та повернення відразу кількох значень з функції.

Set (Множина)

Сети - від математичної 'множини' - невідсортована колекція унікальних елементів. У цьому визначенні згадані дві основні особливості сетів – унікальність та відсутність сортування.

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

Відсутність сортування - елементи в сеті знаходяться в певному хаотичному порядку.

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

>>> a = {1, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 3}
>>> a
{1, 2, 3, 4, 5, 6}

>>> b = {1, 2, 3, 'a', 'c', 0.34}
>>> b
{0.34, 1, 2, 3, 'a', 'c'}

Множини підтримують деякі операції:

>>> set1 = {1, 2, 3, 4, 5, 6}
>>> set2 = {5, 6, 7, 8, 9}
>>> set1 - set2 # Sets difference
{1, 2, 3, 4}

>>> set1 | set2 # Sets union
{1, 2, 3, 4, 5, 6, 7, 8, 9}

>>> set1 & set2 # Sets cross
{5, 6}

Додати елемент до множини можна за допомогою функції add, а видалити з множини елемент - за допомогою функції remove. Як параметр виступає сам елемент, оскільки індексів у множині немає.

>>> set1.add(7)
>>> set1
{1, 2, 3, 4, 5, 6, 7}
>>> set1.remove(1)
>>> set1
{2, 3, 4, 5, 6, 7, 8}

Сети можна використовувати для фільтрації дублів у колекціях. Для цього колекцію потрібно конвертувати в сет, а потім назад:

>>> L = [1, 2, 3, 4, 3, 2, 5, 6, 7, 5, 3, 2]
>>> L
[1, 2, 3, 4, 3, 2, 5, 6, 7, 5, 3, 2]
>>> L = list(set(L))
>>> L
[1, 2, 3, 4, 5, 6, 7]

Сети можна використовувати для роботи з великими наборами даних: припустимо, у нас є бази даних програмістів та менеджерів:

>>> programmers = {'ivanov','petrov','sidorov'}
>>> managers = {'ivanov','moxov','goroxov'}

>>> programmers & managers
{'ivanov'}

>>> programmers | managers
{'ivanov', 'petrov', 'sidorov', 'goroxov', 'moxov'}

>>> programmers - managers
{'petrov', 'sidorov'}

4. Dict (Словник)

Словник (хеш, асоціативний масив) – мінлива та невпорядкована структура даних, призначена для зберігання елементів виду ключ: значення.

Значенням елемента словника може бути будь-який тип даних, ключем елемента - будь-який незмінний (immutable) тип даних, тобто str, int, float, tuple та ін.

Створення словника

Є кілька способів створити словник: пряме створення, створення за допомогою перетворення на тип (використовуючи функцію dict), використовуючи функцію fromkeys та через генератор словників :)

Розглянемо всі ці методи з прикладу:

>>> d = {}
>>> d
{}
>>> d1 = {'a':1, 'b': 2}
>>> d1
{'a': 1, 'b': 2}


>>> d = dict(short='dict', long='dictionary')
>>> d
{'short': 'dict', 'long': 'dictionary'}
>>> d = dict([(1, 1), (2, 4)])
>>> d
{1: 1, 2: 4}


d = dict.fromkeys(['a', 'b', 1, (1, 2)])
>>> d
{'a': None, 1: None, 'b': None, (1, 2): None}

>>> d = dict.fromkeys(['a', 'b', 1, (1, 2)], 4)
>>> d
{'a': 4, 1: 4, 'b': 4, (1, 2): 4}


>>> d = {a: a ** 2 for a in range(7)}
>>> d
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36}

Функція dict має одну особливість, з її допомогою можна швидко створювати словники з ключами-рядками, опускаючи лапки. Це показано на прикладі нижче. На жаль, працює тільки з явними рядками, принцип формування яких такий самий, як і принцип найменування змінних:

>>> dict(a=1, b=2, c=3, d=13)
{'a': 1, 'c': 3, 'b': 2, 'd': 13}
>>> dict(a=1, b=2, c=3, d=13, 1=2)
  File "<stdin>", line 1
SyntaxError: keyword can't be an expression
>>> dict(a=1, b=2, c=3, d=13, '1'=2)
  File "<stdin>", line 1
SyntaxError: keyword can't be an expression

Операції зі словниками

Зі словниками доступні операції взяття елемента, видалення елемента, додавання елемента та його оновлення:

>>> d = dict(a=1, b=2, c=3, d=13)
>>> d
{'a': 1, 'c': 3, 'b': 2, 'd': 13}
>>> d['a']
1
>>> d[1] = 15
>>> d
{'a': 1, 1: 15, 'c': 3, 'b': 2, 'd': 13}
>>> del d[1]
>>> d
{'a': 1, 'c': 3, 'b': 2, 'd': 13}
>>> d['a'] = 111
>>> d['a']
111

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

>>> d['a']
1
>>> d['e']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'e'
>>> d.get('e')
>>>
>>> d.get('e', 'No such element')
'No such element'
>>>

Методи та функції для роботи зі словниками

>>> d
{'a': 1, 'c': 3, 'b': 2, 'd': 13}
>>> d.update({'4': 4, '5': 5})
>>> d
{'a': 1, 'c': 3, 'b': 2, '5': 5, 'd': 13, '4': 4}


>>> len(d)
6

>>> d.keys()
['a', 'c', 'b', '5', 'd', '4']
>>> d.values()
[1, 3, 2, 5, 13, 4]
>>> d.items()
dict_items([('a', 1), ('c', 3), ('b', 2), ('d', 13), ('4', 4), ('5', 5)])

Словники можна чудово проходити у циклі:

for key in d.keys():
    print(key, d[key])
for key, val in d.items():
    print(key, val)

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

 >>> calculator = {
    'plus': lambda x, y: x + y,
    'minus': lambda x, y: x - y,
    'mul': lambda x, y: x*y,
    'div': lambda x, y: x/y,
    'mod': lambda x, y: x%y
}
calculator['minus'](9,3)
6

Домашні завдання

  1. Створити словник оцінок передбачуваних студентів (Ключ – ПІ студента, значення – список оцінок студентів). Знайти найуспішнішого і самого слабенького за середнім балом.
  2. Створити структуру даних для студентів з імен та прізвищ, можна випадкових. Придумати структуру даних, щоб вказувати, у якій групі навчається студент (Групи Python, FrontEnd, FullStack, Java). Студент може навчатися у кількох групах. Потім вивести:
  • студентів, які навчаються у двох та більше групах
  • студентів, які не навчаються на фронтенді
  • студентів, які вивчають Python або Java
  1. Написати функцію переведення розмірів жіночої білизни з міжнародної у решту. Всередині функції потрібно просто звертатися до правильно складеного словника.