Python tricks | Хитрости Питона
5.8K subscribers
2.21K photos
26 videos
1 file
2.52K links
Здесь вы найдете лучшие практики и приёмы, которые используют опытные программисты.

Сотрудничество: @SIeep_Token

Мы на платформе: https://telegram.me/python_tricks

Ссылка на канал: https://t.me/+QayZf6ccsQllZTYy
Download Telegram
Напишите функцию на Python, которая принимает корень бинарного дерева поиска и целое число k, и возвращает k-ый по величине элемент в этом дереве.

Условия:
Бинарное дерево поиска (BST) - это дерево, в котором каждый узел имеет не более двух детей, и для каждого узла его левое поддерево содержит только узлы с ключами, меньшими чем ключ узла, а правое поддерево - только узлы с ключами, большими чем ключ узла.
k всегда валидно и находится в пределах количества узлов в дереве.

Объяснение:
Функция kthSmallest принимает корень бинарного дерева и число k.
Вложенная функция inorder реализует обход дерева в порядке "лево-корень-право", что гарантирует получение элементов в порядке возрастания.
Рекурсивный вызов inorder собирает значения узлов в список.
Функция возвращает k-1 элемент этого списка, так как индексация в Python начинается с нуля.


Этот вопрос проверяет знания кандидата в области алгоритмов обхода дерева, рекурсии и понимания структур данных, таких как бинарные деревья поиска.

🔗 Python tricks
Обработка ошибок во время выполнения

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

🔗 Python tricks
Используйте метод “Enumerate” Для элегантного перебора списков

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

Мы можем написать подобную логику на Python, но my_list[i] кажется немного неуместным, особенно когда нам нужно вызывать значение элемента много раз.

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

🔗 Python tricks
Добавление вложенных списков

Метод append() может работать и с вложенными списками, а не только с простыми.

Итак, у нас был список nested_list, внутри которого уже были два вложенных списка [[1, 2], [3, 4]].

Простой список добавляется во вложенный список как отдельный одинарный элемент.

🔗 Python tricks
argcomplete

argcomplete — это библиотека для автоматического дополнения аргументов командной строки в Python. Это может быть полезно при разработке сценариев командной строки, когда вы хотите, чтобы ваш скрипт предлагал возможные аргументы и значения при нажатии клавиши Tab.

argcomplete поддерживает не все оболочки по умолчанию, и вам может потребоваться настроить ее соответствующим образом для вашей среды выполнения.

🔗 Python tricks
__subclasshook__
__subclasshook__

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

Протокол subclasshook предоставляет способ определить подходит ли класс для использования в качестве подкласса заданного класса. Если метод возвращает True, то класс считается подклассом. Если метод возвращает NotImplemented, то это означает, что проверка должна быть выполнена с использованием стандартных правил.

🔗 Python tricks
Добавление элемента только при выполнении условия

Вы можете добавить условие для использования append(). Если условие выполняется или если условия нет, append() добавляет элемент в конец списка. Всё как обычно.

В этом примере, если temp больше 25, то метод append() добавляет элементы в конец списка numbers. В нашем случае, это 30 и 27.

🔗 Python tricks
Строки тоже итерируются

map() использует «дочернюю» функцию на любом объекте, где применим цикл for. Мы можем применять ее к любому итерируемому объекту, даже к strings.

Преобразуем все буквы в заглавные.

🔗 Python tricks
Отличие append() от extend()

Метод extend() также используется для добавления элементов в список, но в отличие от append(), он принимает итерируемый объект (например, другой список) и добавляет его элементы по отдельности.

Таким образом, метод extend() объединяет содержимое двух списков, тогда как метод append() просто добавляет новый элемент в конец списка.

Дело в том, что append() добавляет один элемент, в то время как extend() добавляет все элементы переданного списка поочередно.

🔗 Python tricks
map() + лямбды

Мы можем комбинировать мэппинг с безымянными функциями, чтобы код стал еще короче.

Возведя все элементы списка ls в квадрат, мы получим такой результат.

🔗 Python tricks
Конкатенация списков с использованием append()

Когда мы используем append() с другим списком, происходит не конкатенация (слияние) списков в привычном понимании, а добавление одного списка как элемента в другой список.

Результат этого кода — list1 = [1, 2, 3, [4, 5, 6]]. Теперь list2 стал элементом последнего элемента списка list1.

🔗 Python tricks
self() для обращения объекта к себе

В данном случае self позволяет перемножить элементы списка на 2.

🔗 Python tricks
Загонка пользовательского ввода

Сотрудничество map(), input() и list() позволит поместить весь пользовательский текст в список. Это может пригодиться при расчете эмоциональной окраски текста, ведь слова предстоит потом возвращать к исходной форме

🔗 Python tricks
Функция math.gcd()

Функция math.gcd() используется для вычисления наибольшего общего делителя (НОД) двух целых чисел. НОД — это наибольшее число, которое является делителем обоих чисел.

Синтаксис:
math.gcd(a, b)

🔗 Python tricks
Библиотека Qiskit

Qiskit — это открытая библиотека для работы с квантовыми вычислениями в Python. Она предоставляет инструменты для создания, симуляции и запуска квантовых программ на реальных квантовых устройствах.

Вы можете изучить документацию Qiskit для получения более подробной информации и примеров использования.

🔗 Python tricks
Twisted

Twisted — это асинхронный фреймворк для разработки сетевых приложений на языке Python. Он предоставляет реализацию множества протоколов, таких как TCP, UDP, SSL/TLS, DNS, и других, используя асинхронный стиль программирования.

Код выше создает TCP-сервер, прослушивающий порт 1234, и при подключении клиента создает экземпляр MyProtocol, который обрабатывает данные в методе dataReceived. В приведенном примере, сервер просто отправляет обратно полученные данные.

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

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

🔗 Python tricks
Недостатки map()

К недостаткам map(), так же как и в случае с filter(), можно отнести «ленивую оценку» (Lazy Evaluation). Создатели языка сделали немало в 3-й версии, чтобы улучшить производительность языка, и потому вместо обработанного объекта по умолчанию нам возвращается ссылка на итератор. Пока мы не обернем ее в list() или другой метод, обработка функцией-дочкой еще не произошла.

Это неплохо на малых оборотах, но на практике, где данные весьма разнообразны, без просмотра результата вероятность ошибок на проде увеличивается: мы просто не увидим потенциальных проблем.

🔗 Python tricks
Напишите функцию на Python, которая принимает строку и возвращает словарь, содержащий количество вхождений каждого слова в строке. Считайте, что слова в строке разделяются пробелами, и игнорируйте знаки препинания.

Для начала используем метод translate для удаления знаков препинания из исходной строки. Модуль string предоставляет строку punctuation, содержащую все знаки препинания. Метод translate использует таблицу перевода для удаления указанных символов.

Затем приводим текст к нижнему регистру, чтобы учесть все слова независимо от регистра. После этого используем метод split() для разделения текста на список слов.

Создаём пустой словарь word_count для подсчета вхождений каждого слова. Затем, используя цикл for, проходимся по списку слов и обновляем счетчик в словаре. Если слово уже есть в словаре, увеличиваем его счетчик на 1; если нет, добавляем его в словарь с начальным счетчиком 1.

Наконец, возвращаем словарь word_count, который содержит количество вхождений каждого слова в тексте.

🔗 Python tricks
string.strip

Метод strip() удаляет все начальные и конечные пробелы из заданной строки. С помощью параметра chars ты указываешь набор символов, которые необходимо удалить как из левой, так и из правой частей строки.

🔗 Python tricks
Рандомные координаты

Про комикс, который вызывается с помощью import antigravity слышали все (если  вы его не видели, то ловите). Но если покопаться, можно найти пасхалку в пасхалке: в модуле antigravity.py  можно найти функцию geohash, которая открывает другой комикс и генерирует случайные координаты.

🔗 Python tricks