Найти в Дзене
Машинное обучение

Продвинутая работа со списками в Python.

Оглавление

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

В этом заключается красота языка, хорошо представленная в Zen of Python. Если бы мне пришлось выделить из дзена один пункт, это было бы «Простое лучше, чем сложное». Мы должны максимально придерживаться золотого правила, согласно которому код читается гораздо чаще, чем пишется, будь то автор кода, коллеги или сторонние разработчики.

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

Циклы

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

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

-2

Код

Хотя это относительно простая задача, нам нужно было выполнить несколько операций:

Создать пустой список.

Пройти итерацию по каждому элементу данных.

Проверить является ли итерируемый элемент четным.

Добавим элемент в список добавив +1

Код выполняет свою работу, но мы можем сделать этот код более компактным и простым для понимания. Наша главная цель сделать ,чтобы код был очень понятен и читаем

Map & Filter

Функции высшего порядка принимают функции в качестве аргумента или возвращают функцию в качестве результата.

map поможет нам запустить функцию для каждого элемента последовательности, а filter добавит логику для пропуска определенных элементов. Для простоты мы будем использовать лямбда выражение для наших функций.

-3

Код

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

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

list comprehension

Мы можем определить коллекцию и построить ее на лету, передавая в нее функции и условия.

-4

Один взгляд уже говорит вам, какова цель кода. Тут мы можем выстроить наши логику и преобразовать объект данных в другие структуры.

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

-5

Код

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

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

Тернарные операторы

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

-6

Код

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

Читабельность и простота всегда выигрывают. Не потому, что код короче, а потому, что лучше передает цель кода.

-7

Код

Выражения присваивания

Мы завершим это фантастическим дополнением из PEP 572. Выражения присваивания, доступные в Python 3.8, позволяют разработчикам давать имя (назначать переменную) результату работы функции.

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

-8

Код

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

Заключение

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

В этом посте мы рассмотрели различные варианты фильтрации и преобразования данных с помощью:

Для циклов,

Map и Filter

Понимание тернарных операторов и выражениями присваивания.

Сложность разработки в том, что золотого правила написания кода не существует. Нам нужно найти способ, который лучше всего передает наше намерение. Дело не в том, чтобы быть умным, а в том, чтобы быть ясным)

Python/ django
Python RU