In [ ]:
%%html
<style>
.text_cell_render * {
   font-family: OfficinaSansCTT;
}
.reveal code {
    font-family: OfficinaSansCTT;
}
.text_cell_render h3 {
   font-family: OfficinaSansCTT;
}
.reveal section img {
    max-height: 500px;
    margin-left: auto;
    margin-right: auto;
}
img[alt=lexer] {
    height: 300px;
}
</style>
  • Привет! Меня зовут Николай Марков.
  • Я работаю на позиции Senior Data Engineer в компании Aligned Research Group.
  • Создаю пайплайны для анализа данных.
  • Пишу на Python суммарно уже лет шесть-семь.
  • А еще мы организуем в России встречи и конференции под брендом PyData (http://pydata.org/). Присоединяйтесь: https://www.meetup.com/PyData-Moscow/
  • У меня везде один и тот же ник - @enchantner, пишите в твиттере, телеграме или фейсбуке.
  • И в http://ods.ai/ тоже заходите.

Что такое Python?

  • Язык общего назначения
  • Интерпретируемый
  • С динамической "утиной" типизацией
  • С автоматическим управлением памятью и Garbage Collector'ом
  • Эталонная реализация - CPython (есть также PyPy, Jython, IronPython и т.д.)

Что можно писать на Python? Сайты и сервисы, например.

А также:

  • Оконные приложения (как ни странно)
  • Ботов для игр и Telegram
  • Приложения для анализа данных
  • Облачные платформы
  • Утилиты для администрирования
  • Что угодно еще

Лучше не брать Python для

  • Оконных приложений (как ни странно)
  • Фронтенд-задач
  • Мобильных приложений
  • Сложных распределенных систем

Что такое "интерпретируемый язык"?

1) Это как компилируемый, только быстро
2) Это исполняемый на виртуальной машине
3) Это позволяющий получить ошибки во время исполнения
4) Это язык, у которого зачастую есть REPL

Как происходит запуск нашей программы (скрипта)?

А что потом?

И как в конце?

Давайте поставим интерпретатор Python

  • Экосистема Python состоит из
    • интерпретатора и стандартной библиотеки
    • сторонних модулей
    • окружения и IDE
  • Python 2 умер, ставим Python 3
  • “ванильный” дистрибутив: https://www.python.org/
  • дистрибутив для data science https://www.anaconda.com/distribution/

Основные типы данных

  • bool (логический, True/False)
  • string/bytes (строковый)
  • int, float, complex (числовой)

Основные типы контейнеров

  • list (список элементов разных типов)
  • tuple (кортеж, неизменяемый список)
  • dict (словарь, набор пар ключ-значение)
  • set (множество)

Еще: https://docs.python.org/3/library/datatypes.html

Что такое "динамическая типизация"?


In [ ]:
s = 'abc'  # строка
s = "abc"  # тоже строка
n = 2  # int
n = 3.5  # float

l = []  # пустой список
l = [1, 2, 3]  # тоже список, но с числами
l = ['a', 1, None]  # разные типы в одном списке

t = (1,) # кортеж с одним элементом (не забудьте про запятую!)

d = {}  # пустой словарь
d = {'a': 1, 'b': 2}  # словарь с парами ключ-значение

s = set([1, 2])  # множество, еще можно {1, 2}

In [ ]:

Список - непрерывный кусок памяти!

https://wiki.python.org/moin/TimeComplexity


In [ ]:
l = [3,2,1]

In [ ]:
len(l)  # посчитать длину списка или строки

In [ ]:
sum(l)  # просуммировать элементы списка

In [ ]:
sorted(l)  # вернуть отсортированный список, reverse=True для сортировки в обратном порядке

In [ ]:
max(l)  # максимальный элемент;  min(l)  # минимальный

Методы самого списка


In [ ]:
l.append(9)  # добавить элемент в конец
l.extend([3, 4, 5])  # расширить один список другим
l.insert(3, 4)  # вставить элемент 4 в позицию 3
l.remove(3)  # удалить первый элемент со значением 3
l.count(3)  # посчитать число элементов со значением 3

In [ ]:

Строки, списки, срезы


In [ ]:
# s - строка или список
s = "string"
s[0]  # нулевой элемент (индексация с нуля)
s[2:4]  # элементы 2 и 3
s[1:8:2]  # элементы 1, 3, 5, 7 (шаг 2)
s[-1]  # обратный индекс - последний элемент
s[::2]  # все элементы с шагом 2
s[::-1]  # развернутая строка/список

In [ ]:

Разделение - объединение


In [ ]:
s.split("a")  # разделяем строку по "a"
s.split("\t")  # разделяем строку по табуляции
"\t".join(list_of_strings)  # объединяем

In [ ]:

Попробуем сами


In [ ]:
s = "У Мэри есть овечка"
print(s[0] == ...)
print(s[7:10] == ...)
print(s[1:8:2] == ...)
print(s[-3] == ...)
print(s[::4] == ...)
print(s[::-1] == ...)

In [ ]:

Циклы


In [ ]:
lst = [3,2,1]
for i in lst:  # перебираем элементы в контейнере
    print(i)

In [ ]:
for i, item in enumerate(lst):  # перебираем вместе с индексами
    print(str(i) + ". " + str(item))

In [ ]:
for j in range(1, 10, 2):  # что напечатает?
    print(j)

Цикл с условием останова


In [ ]:
a = 0
while a < 100:  # проверка условия
    a += 1  # инкремент (увеличение значения на 1)
    print(a)
    if a == 20:
        break  # выход из цикла

Упражнения

1) Для чисел от 0 до 100 вывести само число, а затем «fizz», если число делится на 3, и «buzz», если оно делится на 5. Подсказка: оператор взятия остатка - %

2) Даны два списка равной длины с целыми числами - например, время в секундах, проведенное на сайте, для каждого пользователя в группе A/B тестирования. Нужно найти разницу между максимальным элементом первого списка и минимальным элементом второго за один проход (O(n)).


In [ ]:
# сгенерировать список можно, например, так:
import random
a = [random.randint(-10, 10) for _ in range(10)]
b = [random.randint(-10, 10) for _ in range(10)]

mx = a[0]
mn = b[0]

In [ ]:

Set

  • Вставка и проверка наличия элемента - гораздо быстрее, чем в списке!
  • Все элементы уникальны
  • Элементы сортируются в Python 3.5+, но на это полагаться не стоит

In [ ]:
s = {1, 2, 3}
s.add(6)  # добавление элемента
s.remove(2)  # удаление элемента
3 in s  # проверка наличия элемента
4 not in s  # проверка отсутствия элемента

In [ ]:

Set как математическое множество


In [ ]:
s1, s2 = {1, 2, 3}, {2, 3}
s2.issubset(s1)  # является ли s2 подсетом s1?
s1.issuperset(s2)  # является ли s1 суперсетом над s2?
s1.union(s2)  # объединить два множества в одно
s1.intersection(s2)  # пересечение множеств
s1.difference(s2)  # разность множеств

In [ ]:
# сокращенные версии (не рекомендуются к использованию)
s2 <= s1 # можно также s1<s2
s1 >= s2 # можно также s1>s2
s1 | s2
s1 & s2
s1 - s2

In [ ]:

Dictionary

  • Структура данных - hash table (хэш-таблица)
  • На упорядоченность полагаться тоже не стоит

In [ ]:
d = {"foo": 1, 42: "bar"}
d["a"] = 125  # добавить значение по ключу в словарь
del d["a"]  # удалить значение по ключу из словаря
d.keys()  # список ключей (в Python 3 - итератор)
d.values()  # список значений (в Python 3 - итератор)
d.get(12, "freedom")  # значение по умолчанию
d.update({42: "zord", "obama": "trump"})  # обновить значения из другого словаря

In [ ]:

Шаблонизация и форматирование


In [ ]:
s = "ТеКсТ ДоМиКом"
print(s.lower())  # нижний регистр
print(s.upper())  # верхний регистр

In [ ]:
print("У Пети было {0} яблок".format(15))
print("Что лучше - {0} ящиков пива или {1} ящиков водки?".format(30, 20))
print("У Пети было {how_much} яблок".format(how_much="дофига"))

In [ ]:
"""
Взвесьте мне {0:.5f}
килограмм хурмы
""".format(21.35236172)

Еще пара примеров


In [ ]:
# f-строки (Python 3.6+):
a = 2
b = 8
f"a + b = {a + b}"

In [ ]:
# старый формат: printf-нотация:
"Жили в квартире %d веселых чижа" % 44

Вопросы под конец

1. Как можно в Python реализовать структуру "стек"?
2. Какой встроенной функцией можно сгенерировать убывающую/возрастающую последовательность чисел?
3. Что такое "динамическая типизация"?
4. Как сразу перескочить на следующую итерацию цикла, не выполняя текущую до конца?
5. Как получить сразу список пар ключ-значение из словаря?

Что бы почитать?

http://checkio.org/