Pycore
Python Extended Cheatsheet. I'm using this repository to chronicle my journey through Python
Install / Use
/learn @amaargiru/PycoreREADME
Ядро планеты Python
Обратите внимание, пока этот материал находится в статусе черновика. Чем дальше вы продвинетесь вглубь текста, тем больше неувязок, косноязычия и ошибок вы там увидите, а где-то примерно в районе середины руководства окончательно попадёте в область разрозненных заметок, невнятных почеркушек и псоголовых воинов, воюющих с драконами. Пожалуйста, не судите строго, материал хоть и небыстро, но упорно корректируется, медленно дрейфуя в сторону большей читаемости.
Этот материал со всеми свежими правками доступен на GitHub, вы вольны сколько угодно дополнять и переделывать его. Самое главное — учебник написан на Jupiter Notebook, а это значит, что вы можете интерактивно редактировать и исполнять код, мгновенно добавляя новые сущности или проясняя непонятные моменты.
.jpg)
Введение
Добрый день! Меня зовут Михаил Емельянов, по профессии я программист программ, а этот небольшой мини-учебник по базовым возможностям языка Python меня сподвиг написать довольно существенный, на мой взгляд, разрыв между декларируемыми объемами всевозможных курсов программирования и требованиями даже достаточно скромнооплачиваеых, но реальных вакансий.
Пользуясь аналогиями из игрового мира, можно сказать, что начинающий программист зачастую стоит на берегу озера кипящей лавы, в центре которого находится остров со столь вожделенными вакансиями, а промежуточные островки, по которым нужно ловко прыгать, постепенно наращивая свои навыки в последовательных мини-квестах, либо отсутствуют, либо расположены несистемно и хаотично, либо достаточно ровная их последовательность обрывается, так и не успев помочь отойти сколько-нибудь далеко от берега. Давайте попробуем построить дорожку островков-подсказок, ряд которых, хоть и не без усилий, позволит-таки нам достичь цели.
В этом руководстве с вероятностью 100 % есть ошибки и неточности самых разных калибров, так что, если что-то углядите, не стесняйтесь заводить PR и создавать форки на GitHub, любые предложения и дополнения бурно приветствуются; давайте вместе попробуем раскрыть специфику Python'а, удобство, красоту и силу этого прекрасного языка.
Разумеется, повествование может показаться вам несколько несбалансированным, т. к. я, увлёкшись, могу более подробно освещать темы, интересные лично мне, в ущерб целостности материала, и, с другой стороны, не хочу переписывать документацию на Python, нудно перечисляя методы работы со структурами данных. Кстати, не забывайте про великолепную официальную документацию docs.python.org. Она достаточно объёмна, но, изучив её, хотя бы «по диагонали», и постепенно углубляясь в нужные разделы, вы сможете убедиться, что многие «хаки», «открытия» и прочие не очевидные вещи уже давно разжеваны, описаны и имеют подробные примеры применения.
Здесь и далее вы можете увидеть вот такие вставки. Если это не эпиграф в начале главы, то это информационная вставка, содержащая ответ на вопрос собеседования. Например:
Что такое Python?
Интерпретируемый (преимущественно) язык программирования с динамической строгой типизацией и автоматическим управлением памятью.
Существуют реализации Python, позволяющие компилировать исходный код (например, cython), но, как правило, работа с Python строится при помощи интерпретатора.Такие вставки призваны закрепить материал.
Также я бы рекомендовал для изучения базового синтаксиса Python на полную катушку использовать leetcode.com. Если отфильтровать задачи по уровню «Easy», а потом добавить дополнительную сортировку по столбцу «Acceptance», то перед вами предстанет не волчий оскал соревновательной платформы, а ванильный букварь с плавно нарастающим уровнем задачек.
Что ж, пожалуй, довольно запрягать. Погнали!
Оглавление
Ниже вы видите оглавление, сделанное для лучшего усвоения не плоским, а в виде диаграммы-путеводителя.
Пользоваться путеводителем очень просто. Как в обычном тексте, идите слева направо и сверху вниз. Если вы только начинаете изучать Python, то идите по зеленым пунктам путеводителя. Если накопленный опыт, любопытство или необходимость толкают вас глубже, начните изучать разделы, помеченные серым. Оранжевым помечены темы, требующие углубленного изучения, ими лучше заняться (хотя бы и не копая, для начала, особенно глубоко) в третий проход. Даже если вы не собираетесь плотно использовать на практике какие-то из «оранжевых» тем, рассмотрите хотя бы их общие аспекты, на уровне чёткого понимания области применения, плюсов и минусов; держите, так сказать, в «горячем резерве».

1. Структуры данных

Как известно, программирование = структуры данных + алгоритмы (у Никлауса Вирта даже книга такая есть). Начнем с данных, а потом плавненько перейдем к методам их обработки.
Список (list)
Список — самая универсальная и популярная структура данных в Python. Если вы пока точно не определились, какая структура понадобится в вашем проекте, просто возьмите список, с него относительно просто мигрировать на что-нибудь более специализированное.
Список представляет собой упорядоченную изменяемую коллекцию объектов произвольного типа. Внутреннее строение списка — динамический массив указателей, т. е. внутри списки хранят не сами объекты, а ссылки на них, что позволяет им содержать элементы разных типов.
a = [] # Создаем пустой список
a: list[int] = [10, 20]
b: list[int] = [30, 40]
a.append(50) # Добавляем значение в конец списка
b.insert(2, 60) # Вставляем значение по определенному индексу
print(a, b)
a += b
print(f'Add: {a}')
a.reverse()
b = list(reversed(a)) # reversed() возвращает итератор, а не список
print(f'Reverse: {a}, {b}')
b = sorted(a) # Возвращает новый отсортированный список
a.sort() # Модифицирует исходный список и не возвращает ничего
print(f'Sort: {a}, {b}')
a.clear() # Очистка списка
[10, 20, 50] [30, 40, 60]
Add: [10, 20, 50, 30, 40, 60]
Reverse: [60, 40, 30, 50, 20, 10], [10, 20, 50, 30, 40, 60]
Sort: [10, 20, 30, 40, 50, 60], [10, 20, 30, 40, 50, 60]
s: str = 'A whole string'
list_of_chars: list = list(s)
print(list_of_chars)
list_of_words: list = s.split()
print(list_of_words)
i: int = list_of_chars.index('w') # Возвращает индекс первого вхождения искомого элемента или вызывает исключение ValueError
print(i)
list_of_chars.remove('w') # Удаляет первое вхождение искомого элемента или вызывает исключение ValueError
e = list_of_chars.pop(9) # Удаляет и возвращает значение, расположенное по индексу. pop() (без аргумента) удалит и вернет последний элемент списка
print(list_of_chars, e)
['A', ' ', 'w', 'h', 'o', 'l', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g']
['A', 'whole', 'string']
2
['A', ' ', 'h', 'o', 'l', 'e', ' ', 's', 't', 'i', 'n', 'g'] r
Можно ли применять отрицательный индекс при работе с итеративными типами?
Да, можно. Отрицательный индекс позволяет вести отсчёт от конца структуры данных, например, массива или списка. Финт несколько неоднозначный, может привести к ошибкам, которые будет непросто найти, поэтому, например, в Golang подобный выверт запретили.
Строка (string)
Строки в Python 3 — иммутабельные последовательности, использующие кодировку Unicode.
se: str = '' # Пустая строка
si: str = str(12345) # Создает строку из числа
sj: str = ' '.join(['Follow', 'the', 'white', 'rabbit']) # Собирает строку из кусочков, используя указанный разделитель
print(f'Joined string: {sj}')
is_contains: bool = 'rabbit' in sj # Проверка наличия подстроки
is_startswith = sj.startswith('Foll')
is_endswith = sj.endswith('bat')
print(f'is_contains = {is_contains}, is_startswith = {is_startswith}, is_endswith = {is_endswith}')
sr: str = sj.replace('rabbit', 'sheep') # Замена подстроки. Можно указать количество замен: sr: str = sj.replace("rabbit", "sheep", times)
print(f'After replace: {sr}')
i1 = sr.find('rabbit') # Возвращает стартовый индекс первого вхождения или -1. Есть еще rfind(), начинающий искать с конца строки
i2 = sr.index('sheep') # Возвращает стартовый индекс первого вхождения или выкидывает ValueError. Есть еще rindex(), начинающий искать с конца строки
print(f"Start index of 'rabbit' is {i1}, start index of 'sheep' is {i2}")
d = str.maketrans({"a" : "x", "b" : "y", "c" : "z"})
st = "abc".translate(d)
print(f"Translate string: {st}")
sr = sj[::-1] # Реверс через slice с отрицательным шагом
print(f"Reverse string: {sr}")
Joined string: Follow the white rabbit
is_contains = True, is_startswith = True, is_endswith = False
After replace: Follow the white sheep
Start index of 'rabbit' is -1, start index of 'sheep' is 17
Translate string: xyz
Reverse string: tibbar etihw eht wolloF
Datetime
Для работы с датами и временем в datetime есть типы date, time, datetime и timedelta. Все они хэшируемы и иммутабельны.
from datetime import date, time, datetime, timedelta
d: date = date(year=1964, month=9, day=2)
t: time = time(hour=12, minute=30, second=0, microsecond=0, tzinfo=None
