Python for you

channel icon
Канал для раскрытия возможностей языка программирования Python. Здесь публикуются практические примеры применения сторонних и встроенных библиотек языка, разборы решений тренировочных и бизнес задач

Условия размещения

Цена за 48 часов в ленте 1000,00
Цена за 1 час закрепления N/A
Взаимопиар Нет

НЕ рекламируются вложения, финансовые каналы, криптовалюты

-2
715
подписчиков
0
359
охват 1 публикации
0
~0
постов / день
+0,1%
50,2%
ERR % ?

Статистика

Последние публикации

Python for you
2 сентября 2023 г. 12:31
Функция pairwise модуля itertools

Функция pairwise позволяет превратить последовательность в кортежи, каждый из которых содержит символ, и следующий за ним в последовательности.

На вход pairwise можно передать любой итерируемый объект - например список или строку.

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

#beginners #itertools
Python for you
23 августа 2023 г. 7:06
Задача: разделить список цифр на группы

Рассмотрим интересную задачу с CodeWars.
Имеется список цифр lst, требуется проверить, можно ли его поделить на группы так, чтобы:
1) длина каждой группы равна group_len
2) в каждой группе цифры были последовательны, например 1,2,3

Т.е. вот при таких вводных

lst = [1, 2, 3, 6, 2, 3, 4, 7, 8]

group_len = 3

Мы можем поделить вот так
[(1,2,3), (2,3,4), (6,7,8)]

Значит ответ будет True

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

Обратите внимание, что время на выполнение ограничено,поэтому мы ищем не в исходном списке, а создаем словарь с помощью Counter. Поиск ключа в словаре занимает всегда фиксированное время, так как это хэш-таблица.

Для снижения потребления памяти применяем генератор при поиске минимального значения

#задачи
Python for you
19 августа 2023 г. 9:40
Использование else с циклом

Конструкцию else можно применить не только внутри условия if ... else.

Если поставить else после тела цикла for или while, то инструкции внутри else будут выполнены в том случае, если цикл НЕ БЫЛ прерван с помощью break и дошел до конца (завершился штатно).

В первом примере мы проходимся по списку lst, как видно, если попадается элемент равный 3, то цикл прерывается - инструкция внутри else не выполняется, тестовая строка не выводится в консоль

Во втором примере мы просто проходимся по списку lst без каких-либо проверок, цикл доходит до конца и завершается штатно - как следствие, срабатывают инструкции внутри else, и мы видим тестовую строку в выводе.

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

#beginners
Python for you
9 августа 2023 г. 17:53
Functools reduce

Функция reduce модуля functools позволяет применить указанную функцию к парам значений из итерируемого объекта.

В первом примере мы берем функцию перемножения mult, перемножаем элементы списка lst: 1 * 2 = 2, затем результат умножения первых двух элементов умножаем на 3-й элемент списка - и так до конца списка lst

Во втором примере мы для краткости используем анонимную функцию, чтобы получить разницу двух чисел. Но помимо этого, мы передали reduce третий аргумент, равный 150. Это так называемый ititializer, с него и начнется цикл вычитаний 150 - 100 = 50 (вычли первый элемент списка **lst_2**), 50 - 10 = 40 (из результата вычли второй элемент списка **lst_2**) и т.д.

#beginners #functools
Python for you
3 августа 2023 г. 7:27
Задача "сложить" массив

В данной задачке требуется сложить пополам массив array вокруг центрального элемента столько раз, сколько указано в runs.

Например, изначальный массив [1,2,3,4,5] и мы складываем его вокруг центрального элемента. То есть получим такие части
[5, 4]
[1, 2, 3]

И чтобы получить сложенный массив, нам осталось сложить друг с другом элементы 5 и 1, 4 и 2
По итогу одно складывание приведет нас к массиву
[6, 6, 3]

Если же число элементов четное, например [1,2,3,4] - то "складывать пополам" массив будем по воображаемой линии между двумя центральными элементами
[4, 3]
=> [5, 5]
[1, 2]

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

#задачи
Python for you
31 июля 2023 г. 7:33
Спецификации у функции format

Как известно, для подстановки значений переменных внутрь строки, мы можем использовать функцию format, или f-строку.
Рассмотрим возможности мини-языка спецификаций для форматирования чисел.
Чтобы использовать спецификацию, вначале нужно поставить двоеточие после переменной:
f"{n:}"

В первом примере мы указываем брать 3 знака после запятой с помощью .3f.

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

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

#beginners
Python for you
27 июля 2023 г. 7:29
Walrus оператор
Начиная с версии 3.8 в Python доступен "моржовый" (walrus) оператор.
С его помощью можно выполнить присваивание переменной прямо внутри выражения, и при этом выражение по-прежнему сможет возвращать значение.

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

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

В первом случае мы дважды вызвали n**3 для каждого элемента, а во втором только один - так как сразу присвоили значение переменной cube. Поэтому во втором случае будет тратиться в 2 раза меньше процессорного времени

#beginners
Python for you
24 июля 2023 г. 7:12
Задача: отформатировать разряды числа

Интересная задачка с CodeWars, по условию дано целое число n - требуется отформатировать его, разделив разряды запятыми.
Без использования функции format.

Суть решения в том, что мы создаем "разметочный" итератор, с помощью которого каждые три символа будет проставляться запятая.
Чтобы отсчитывать символы с конца, приведем число к формату строки, а затем "перевернём" наоборот.

Соединив разметочной итератор, и перевернутую строку с числом - получаем список, где у числа либо есть запятая, либо нет.

Переворачиваем список обратно с помощью [::-1], и получаем ответ в виде строки, с помощью join.

#задачи
Python for you
17 июля 2023 г. 7:35
Свод по значениям в колонке pandas датафрейма

Для быстрого анализа распределения значений в колонке датафрейма pandas, можно воспользоваться функцией value_counts
В примере мы рассматриваем датафрейм о посетителях торгового центра, и с помощью value_counts получаем свод, сколько посетителей мужчины, а сколько - женщины

Обратите внимание на аргумент fillna - желательно поставить его равным False, чтобы знать, что в датафрейме имеются и пустые значения

Аргумент normalize позволяет представить свод не в виде количества, а виде долей

#dataengineering #pandas
Python for you
16 июля 2023 г. 23:54
Частичное применение (функция partial)

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

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

Функция partial из модуля functools как раз призвана решать задачу частичного применения

В первом примере мы создали функцию add_3, которая как бы вызывает базовую функцию add но с аргументом x=3 по умолчанию

Во втором примере функция double_it будет работать как multiply с аргументом x = 2

#beginners #functools
Python for you
15 июля 2023 г. 20:08
Друзья, пожалуйста, выберите, какого контента вы бы хотели видеть больше в канале?
Опрос
  • Решение задач
  • Теория
  • 50/50
Python for you
13 июля 2023 г. 8:22
Задача найти первый оператор для выполнения

Рассмотрим интересную задачку с CodeWars.
Представлена строка с арифметическим выражением, требуется найти индекс оператора, который будет выполнен первым
Например, в строке "2 + 2 * 2" первым будет выполнено умножение(*), соответствующее индексу 6

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

Когда натыкаемся на знак действия, то записываем в массив signs сам знак, счетчик его глубины и индекс в строке

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

#задачи
Python for you
10 июля 2023 г. 8:05
Функция pprint

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

Для примера возьмем оргструктуру с работниками и отделами, представленную в виде словаря с вложенными структурами. Такое может прийти например из API какой-нибудь учетной системы.

Просто сравните вывод стандартной функции print и pprint, которая добавила отступы для каждого логического блока (отступ задается параметром indent, по умолчанию 1)

Также мы можем регулировать глубину вложенности, которую хотим вывести, с помощью параметра depth.

#beginners
Python for you
6 июля 2023 г. 7:35
ChainMap для объединения словарей

Модуль collections предоставляет возможность объединить два и более словарей в единую надструктуру, с которой можно работать как с одним словарем.

В примере мы создали три различных словаря, содержащих имена пользователей и их рейтинг. Затем объединили в одну структуру с помощью ChainMap.
Соответственно, теперь возможно обратиться к любому из ключей всех трёх словарей.

Также интересный факт - если мы добавим в один из словарей новый ключ - ChainMap также автоматом обновится.

#beginners #collections
Python for you
3 июля 2023 г. 7:12
Именование срезов

Как известно, можно получить срез от любого итерируемого объекта с помощью конструкции [start:stop:step]

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

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

В примере рассматривается парсинг строк с одинаковой структурой, содержащих информацию о книгах

#beginners
Python for you
29 июня 2023 г. 7:18
Модуль hashlib

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

Хэширование может быть полезно, например, для хранение паролей в базе-данных - там хранится не собственно пароль, а его хэш - и при попытке пользователя залогиниться, программа сравнит вычисленный хэш от того, что ввел пользователь - с хэшом, который хранится в БД.

Python располагает богатым набором функций для хэширования в модуле hashlib. В примере мы вычисляем хэш от тестовой строки s: вначале переводим строку в байты с помощью encode(), а затем получаем хэш по алгоритму sha256. Hexdigest() выводит представление хэша в шестнадцатеричной системе

#biginners
Python for you
26 июня 2023 г. 7:15
Функция enumerate

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

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

Именованный аргумент start позволяет начать нумерацию с нужного числа (по умолчанию с 0)

В первом примере мы пронумеровали элементы списка, нумерация с 0; во втором уже нумеруем строку, начиная нумерацию с 1.

#beginners
Python for you
22 июня 2023 г. 7:13
Задача с использованием re.findall

В предыдущем посте мы изучили функцию findall модуля re.
Рассмотрим задачу с CodeWars, где данная фунция может нам помочь.

По условию задачи требуется написать функцию, которая переводит римские цифры в арабские.
Чтобы решить задачу, требуется вычленить из заданной строки ключевые шаблоны римских цифр, обозначающие единицы, десятки, сотни, тысячи - а также нестандартные комбинации типа 4 или 9.

Как видно из решения, findall вычленяет из строки ключевые шаблоны, представляя их в виде списка - а затем остается лишь получить арабскую цифру из словаря mapping, и сложить полученые цифры.

#задачи
Python for you
19 июня 2023 г. 7:12
Функция findall модуля re

Продолжим изучать модуль регулярных выражений re.
Функция findall позволяет найти ВСЕ вхождения указанного шаблона внутри строки, вне зависимости от того, расположены они в начале, конце или середине.
Результат выводится в виде списка

В рассмотренном примере, мы пытаемся извлечь все даты рождения из заданной строки s:

- \d означает символ цифры,
- {2} - число в фигурных скобках (квантификатор), означает число повторений - две цифры для дня и месяца, четыре - для года
- [\.|\-] - выбираем в качестве разделителя точку \. или дефис \-

#beginners #регулярные_выражения
Python for you
15 июня 2023 г. 7:06
Метод subtract класса Counter

В предыдущем посте мы познакомились с классом Counter из модуля collections.

Представляется полезным рассмотреть интересный метод subtract данного класса.
Subtract позволяет посчитать разницу между двумя объектами Counter - т.е. насколько количество по каждому ключу в первом объекте Counter больше, чем во втором.

Нам необязательно передавать в конструктор список или строку - можно передать словарь с уже подсчитанными данными в конструктор Counter.

В примере мы сравниваем обьекты с1 и c2, из ключей c1 вычитаем ключи c2. В результате c1 теперь имеет у ключа a значение 1(5-4), у b -1 (6-7). Ключ d вообще отсутствовал в объекте c1 - поэтому получилось значение -5.

#beginners #collections