Python академия
7.72K subscribers
2.34K photos
6 videos
269 links
Python академия. Учи Python быстро и легко. По всем вопросам @evgenycarter
Download Telegram
В чем сложность массивов и хешмапов в python

Сложность массивов (списков) и хешмапов (словари) в Python зависит от операций, которые вы выполняете. Вот основные операции и их временные сложности:

Массивы (списки)
В Python массивы представлены списками (`list`). Сложность операций со списками зависит от конкретного действия:

- Доступ по индексу: O(1) — доступ к элементу списка по индексу выполняется за постоянное время, так как список реализован как динамический массив.
- Добавление элемента:
- В конец списка: O(1) амортизированное — добавление элемента в конец списка обычно занимает постоянное время, так как динамический массив увеличивает свой размер экспоненциально.
- В начало или середину списка: O(n) — если вы добавляете элемент в начало или в середину списка, это требует сдвига всех последующих элементов, что занимает линейное время.
- Удаление элемента:
- Из конца списка: O(1) — удаление последнего элемента занимает постоянное время.
- Из начала или середины списка: O(n) — удаление элемента требует сдвига оставшихся элементов.
- Поиск элемента: O(n) — поиск элемента в списке требует обхода всего списка в худшем случае.

Хешмапы (словари)
Хешмапы в Python реализованы с помощью словарей (`dict`). Они используют хеширование для обеспечения быстрого доступа к элементам по ключу:

- Доступ по ключу: O(1) — доступ к элементу по ключу выполняется за постоянное время благодаря хешированию.
- Добавление элемента: O(1) — добавление нового элемента выполняется за постоянное время, если не происходит коллизий.
- Удаление элемента: O(1) — удаление элемента по ключу также выполняется за постоянное время.
- Поиск по ключу: O(1) — поиск элемента по ключу занимает постоянное время.

Сравнение
- Списки полезны, когда важен порядок элементов и доступ к ним по индексу. Однако некоторые операции (например, вставка или удаление в середине списка) могут быть медленными из-за необходимости сдвига элементов.
- Словари обеспечивают быстрый доступ к элементам по ключу, что делает их более эффективными для операций, связанных с поиском и манипуляцией данных по ключу.

Таким образом, основная сложность использования списков и словарей в Python связана с выбором правильной структуры данных для конкретной задачи, чтобы минимизировать временные затраты на ключевые операции.

Подписывайтесь на канал 👉@pythonofff
👍52
Обрабатываем естественный язык

TextBlob — удобный пакет для обработки текста. Он предоставляет простой API для погружения в общие задачи обработки естественного языка (NLP), такие как анализ тональности, пометку частей речи, перевод и многое другое.

Здесь особенно круто, что к объектам класса TextBlob можно применять методы строк (upper, split, format и т. д.) и в целом обращаться с ними как с обычными строками.

Документация находится здесь, но некоторые примеры есть и на картинке выше. Еще важно, что несколько функций, например translate(), требуют подключения к интернету.

Подписывайтесь на канал 👉@pythonofff
👍1
Аргументы командой строки

При запуске программ через терминал можно указывать аргументы через пробел. В Python список этих аргументов хранится в переменной argv во встроенном модуле sys.

Первым элементом всегда является имя запускаемого скрипта, вторым и далее — непосредственно сами аргументы.

Подписывайтесь на канал 👉@pythonofff
👍2
Как использовать ключевое слово global в Python

По умолчанию Python думает, что внутри функции вы хотите использовать локальную переменную.

И когда мы сначала пытаемся вывести значение переменной, а затем повторно присваиваем значение переменной, к которой мы пытаемся получить доступ, Python запутывается.

Подписывайтесь на канал 👉@pythonofff
3👍1
Получаем версию Python

Во пакете sys есть удобная переменная version_info, которая хранит в себе версию Python, с помощью которого был запущен скрипт.

Проверка версии интерпретатора может быть полезна в случае, если вы используете какие-то фичи из более новых версий языка.

Подписывайтесь на канал 👉@pythonofff
2
Как удалить ключ из словаря при помощи генератора

Генераторы словаря в Python — это быстрые однострочники, которые позволяют легко создавать словари.

Здесь важно понимать, что мы создаем новый словарь. Поэтому это не самый экономичный метод удаления ключа. Но если вы уверены, что ключ существует, а словарь не слишком велик, можно воспользоваться и генератором.

Подписывайтесь на канал 👉@pythonofff
2
PyAutoGUI

PyAutoGUI позволяет Python управлять мышью и клавиатурой для автоматизации взаимодействия с другими приложениями. Пакет работает в Windows, macOS и Linux на Python 2 и 3.

Из ключевого функционала можно выделить следующее:
— Передвижение курсора и нажатие на кнопки мыши;
— Набор текста, например для заполнения форм;
— Скриншоты, поиск указанных изображений на экране (например, иконки) и нажатие на них;
— Поиск приложения на экране, изменение размера его окна, перемещение по экрану и т. д.

Основные функции показаны в примере на картинке выше, остальное — в документации проекта https://pyautogui.readthedocs.io/en/latest/

Подписывайтесь на канал 👉@pythonofff
👍8
Что такое строка?

Строка — это тип данных в Python. Строка записывается как последовательность символов, заключенная в одинарные или двойные кавычки.

Подписывайтесь на канал 👉@pythonofff
Временные файлы

В стандартной библиотеке Python есть модуль tempfile, который содержит классы и методы для корректной работы со временными файлами и директориями.

Функция TemporaryFile создает временный файл в системной директории и возвращает файлоподобный объект.

Созданный временный файл будет автоматически удален по закрытию файла или при выходе из контекстного менеджера.

Также другие процессы и приложения не смогут получить доступ к этому временному файлу.

Подписывайтесь на канал 👉@pythonofff
👍2
Цепочка исключений

Для формирования цепочек исключений используется ключевое слово from, после которого требуется указать ещё одно исключение. Это исключение будет подвязано к вызванному в атрибут __cause__ (поддерживает запись).

В результате, если вызванное исключение не обработано, то на вывод будут отправлены оба исключения.

Подписывайтесь на канал 👉@pythonofff
Что следует учитывать при использовании метода lower()

Метод lower() делает довольно простую вещь. Он создает новую строку, в которой все прописные буквы меняются на строчные. Но есть несколько моментов, о которых следует помнить при его использовании.

Строки неизменяемы
Строки являются неизменяемым типом данных. Это означает, что их нельзя поменять после создания, только перезаписать заново. Поэтому исходная строка после использования метода lower() остается неизменной.

Подписывайтесь на канал 👉@pythonofff
1👍1
Выполняем код по расписанию

Часто от программиста требуется написать код, который должен выполняться в определенный промежуток времени или по расписанию. Для решения этой проблемы существует много решений, но одно из них — это библиотека aiocron.

Она позволяет просто описать в декораторе конфигурацию расписания, согласно которому метод будет запускаться. В примере выше функция attime будет выполняться каджую минуту с 6 утра до 10 вечера в рабочие дни недели. Подробнее о написании своих расписаний можно почитать тут.

Подписывайтесь на канал 👉@pythonofff
🎉1
Метод lower() возвращает новую строку

lower() возвращает новую строку. Этот момент логически вытекает из предыдущего. Следовательно, если вы хотите использовать результат работы метода в дальнейшем, вам нужно сохранить его в новую переменную.

Подписывайтесь на канал 👉@pythonofff
👍3
Пример работы метода lower(): проверяем пользовательский ввод

Скрипт задает пользователю вопрос "What color is the sun?" («Какого цвета солнце?») и ждет от него ответа. Затем программа проверяет, совпадает ли ответ с "yellow" (желтый), и если да, то печатает "Correct!" («Правильно!»). Если пользователь введет другой ответ, программа напечатает "That is not the correct color!" («Это неправильный цвет!»).

Подписывайтесь на канал 👉@pythonofff
💩5
Валидация данных с Pydantic

Pydantic — это библиотека для парсинга и валидации данных, в котором атрибуты класса имеют статическую типизацию.

Эта типизация используется в момент создания обьекта класса для проверки значений.

Пакет хорош в ситуациях когда вам нужно распарсить какой-то json, и все это превращается в рутину: проверка структуры json, необходимых полей, значений и так далее.

Также имеется поддержка множества других типов данных, помимо стандартных, таких как почта, url адрес, номер платежных карт.

Полноценный пример есть на картинке выше. Документация находится здесь.

Подписывайтесь на канал 👉@pythonofff
👍1
Почему так происходит?

Программа проверяет, совпадает ли пользовательский ответ со строкой yellow. Однако — Yellow с заглавной буквой Y — это совершенно другая строка.

Вы можете легко исправить это, используя метод lower() и внеся небольшое изменение в программу.

Подписывайтесь на канал 👉@pythonofff
💩3
Функция zip в Python

Функция zip принимает на вход в качестве аргументов итерируемые объекты, а возвращает итератор из кортежей, где i-й кортеж содержит i-й элемент из каждой последовательности.

Но если передать на вход итерируемые объекты неравной длины, то количество кортежей будет сформировано по самой короткой последовательности, а оставшиеся элементы в более длинных будут игнорироваться, что может привести к нежелательным результатам.

В python 3.10 в функцию был добавлен необязательный аргумент strict, который является флагом проверки входных итерируемых объектов на равенство их длин. В случае, если длины не равны, то будет выброшено исключение ValueError.

В случае же если требуется составить кортежи по всем элементам последовательности в независимости от равенства длин, в модуле itertools существует функция zip_longest. Данная функция работает точно также как zip, но заменяет отсутствующие элементы значением, переданным в fillvalue, которое по умолчанию равно None.

Подписывайтесь на канал 👉@pythonofff
3👍3
Модули Dataset и DataLoader

Как и Tensorflow, PyTorch имеет несколько наборов данных, включенных в пакет (например, Text, Image и Audio). В этом руководстве будет использоваться один из таких встроенных наборов данных изображений — CIFAR10.

Эти датасеты очень распространены и широко задокументированы в сообществе ML. Они отлично подходят для прототипирования и сравнительного анализа моделей, поскольку вы можете сравнить производительность своей модели с тем, чего смогли достичь другие.

Подписывайтесь на канал 👉@pythonofff
👍1
Работаем с данными

pandas - это мощный инструмент для анализа данных в Python. С помощью данного фреймворка, работа с «реляционными» или «помеченными» данными простой и интуитивно понятной. Сегодня мы применим его для модификации csv файла.

Чтобы загрузить датафрейм из файла (пример), используем метод pd.read_csv().

Применим фильтр по полю sepal.length > 5. В SQL данная операция выглядела бы таким образом:
SELECT * FROM df WHERE sepal.length > 5.
В pandas же для получения необходимых строк фрейма можем использовать метод loc, передав в нее необходимый фильтр:
df = df.loc[df['sepal.length'] > 5]

Для удаления одной или нескольких колонок можно использовать метод df.drop():
df = df.drop(columns=['petal.width', 'petal.length'])

При сохранении в файл мы можем дополнительно указать pandas не добавлять генерирующийся индекс строкам, если он нам не нужен:
df.to_csv('new_iris.csv', index = False)

Подписывайтесь на канал 👉@pythonofff
👍1
Результат обратного распространения и обучения

Для шага обратного распространения нам нужно сначала запустить optimizer.zero_grad(). Это устанавливает градиент в ноль перед запуском обратного распространения, поскольку мы не хотим накапливать градиент за последующие проходы.

Метод loss.backward() использует потери для вычисления градиента, затем мы используем Optimizer.step() для обновления весов.

Подписывайтесь на канал 👉@pythonofff
👍1😁1