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}

"""
Explanation: Привет! Меня зовут Николай Марков. 
Я работаю на позиции 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
Что такое "динамическая типизация"?
End of explanation
"""


l = [3,2,1]

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

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

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

max(l)  # максимальный элемент;  min(l)  # минимальный

"""
Explanation: Список - непрерывный кусок памяти!
https://wiki.python.org/moin/TimeComplexity
End of explanation
"""


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

"""
Explanation: Методы самого списка
End of explanation
"""


# 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]  # развернутая строка/список

"""
Explanation: Строки, списки, срезы
End of explanation
"""


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

"""
Explanation: Разделение - объединение
End of explanation
"""


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

"""
Explanation: Попробуем сами
End of explanation
"""


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

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

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

"""
Explanation: Циклы
End of explanation
"""


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

"""
Explanation: Цикл с условием останова
End of explanation
"""


# сгенерировать список можно, например, так:
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]


"""
Explanation: Упражнения
1) Для чисел от 0 до 100 вывести само число, а затем
«fizz», если число делится на 3, и «buzz», если оно делится
на 5.
 Подсказка: оператор взятия остатка - %
2) Даны два списка равной длины с целыми числами - например, время в секундах, проведенное на сайте, для каждого пользователя в группе A/B тестирования. Нужно найти разницу между максимальным элементом первого списка и минимальным элементом второго за один проход (O(n)).
End of explanation
"""


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

"""
Explanation: Set

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


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)  # разность множеств

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

"""
Explanation: Set как математическое множество
End of explanation
"""


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"})  # обновить значения из другого словаря

"""
Explanation: Dictionary

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


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

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

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

"""
Explanation: Шаблонизация и форматирование
End of explanation
"""


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

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

"""
Explanation: Еще пара примеров
End of explanation
"""


