Перевод публикуется с сокращениями, автор оригинальной статьи – Erik van Baaren.
1. Многоточие в Python
Многоточие Python – это последовательность из трех точек, часто используемая в естественных языках. Но чего вы, возможно, не знаете – это еще и валидный объект в Python:
Применяется он преимущественно в операциях нарезки матриц в NumPy. Однако можно использовать его вместо обычного pass в качестве плэйсхолдера в функции, которую еще не реализовали:
Вот валидный код Python, и выглядит он теперь не так уж плохо.
2. Data classes
Начиная с версии 3.7, Python поставляется с классами данных. У них есть несколько преимуществ по сравнению с обычными классами или другими альтернативами:
- возврат нескольких значений или словарей;
- класс данных требует минимального количества кода;
- возможность сравнения классов данных;
- возможность распечатать класс данных для отладки при помощи __repr__;
- снижение вероятности ошибок в связи с требованием класса данных type hints.
Пример класса данных в работе:
3. The Zen of Python
Одним из самых ранних Python pep является PEP-20. Это список из 19 тезисов по программированию на Python, который называется «The Zen of Python». Данные правила датируются 2004 годом и, в свою очередь, основаны на PEP-8.
Такая пасхалочка уже давно присутствует в Python и перечисляет набор правил:
Так что пока у вас есть Python REPL, можете просматривать эти правила на экране.
4. Анонимные функции
Иногда именованию функции не стоит уделять особого внимания. Например, если вы уверены, что она будет использована только раз. Для таких случаев Python предлагает применять анонимные функции, также называемые лямбда-функциями.
Лямбда-функция может быть назначена переменной, создавая краткий способ определения функции:
Это становится более интересным, когда необходимо использовать функцию в качестве аргумента. В таких случаях она часто используется только один раз. Как известно, map применяет функцию ко всем элементам итерируемого объекта. Мы можем использовать лямбду при вызове map:
Этот кусок кода встречается часто. Например, когда требуется применить операцию к каждому элементу итеративного объекта. В данной ситуации использование map() в сочетании с лямбда-функцией является кратким и эффективным.
5. List Comprehensions
List comprehension может заменить неэстетичные циклы, используемые для заполнения списка. Синтаксис выглядит следующим образом:
Простейший пример заполнения списка последовательностью чисел:
Поскольку здесь можно использовать выражения, вам доступна работа с математикой:
Вызов внешней функции:
И, наконец, вы сможете использовать «if» для фильтрации списка. В этом случае будут сохранены только те значения, которые делятся на 2:
6. Замена переменных на месте
Этот аккуратный трюк поможет сэкономить несколько строк кода:
7. Форматирование именованных строк
Такую штуку используют нечасто, но если данные уже находятся в словаре, для форматирования именованных строк пригодится следующий прием:
Вы даже можете использовать функцию locals(), но в последних версиях Python придется обращаться к f-строкам следующим образом:
8. Nested list comprehensions
Помните основной синтаксис list comprehensions?
Если expression может быть любым валидным выражением Python, оно также может быть и другим list comprehension. Это полезно, когда необходимо создать матрицу:
Или, если хотите «разгладить» предыдущую матрицу:
Первая часть цикла по матрице m, а вторая – цикл по элементам каждого вектора.
9. Обязательные аргументы
Для принудительного использования аргументов ставьте символ звездочки перед ними, заставляя все аргументы стать ключевыми:
10. Использование подчеркивания в REPL
Вы можете получить результат последнего выражения в Python REPL с помощью оператора подчеркивания, например, в Python REPL это выглядит следующим образом:
Прием работает и в оболочке IPython.
11. Проверка необходимой версии Python
Чтобы ваши пользователи не могли запустить скрипт в несовместимой версии, в коде стоит проверить наличие актуальной версии Python. Проведите простую проверку:
12. Декорируем функции
Декоратор – это обертка вокруг функции, которая определенным образом изменяет ее поведение. Существуют варианты использования декораторов, и вы, возможно, уже применяли их раньше при работе с такими фреймворками, как Flask.
Давайте создадим собственного декоратора:
Внутри print_argument мы определяем функцию-обертку. Она выводит аргумент и имя вызываемой функции, выполняет фактическую функцию и возвращает ее результат, как если бы функция вызывалась «обычно».
С помощью @print_argument мы применяем наш декоратор к функции. Декоратор может быть повторно использован и для других функций.
Давайте создадим собственного декоратора:
13. Возврат нескольких значений
Функции в Python могут возвращать более одной переменной без применения словаря, списка или класса. Это работает так:
Здесь возвращается кортеж. С тем же эффектом можно было бы написать return (name, birthdate).
Это нормально для ограниченного количества возвращаемых значений. Но все, что превышает 3 значения, должно быть помещено в класс (data).
14. Объединение словарей
Начиная с Python 3.5, стало проще объединять словари.
Если встречаются дублирующиеся ключи – в первом словаре они будут перезаписаны.
15. Нарезка списка
Синтаксис нарезания таков:
Start, stop и step необязательны. У них есть дефолтные значения, которые активируются, если не заполнить параметры:
- 0 для start;
- конец списка для stop;
- 1 для step.
Вот несколько примеров:
16. Использование памяти
С помощью sys.getsizeof() можно проверить использование памяти объектом:
Огромный список всего 48 байт, потому что функция range возвращает класс, который ведет себя как список. В вопросе памяти range эффективнее, чем использование актуального списка чисел.
17. Использование * и ** для распаковки аргументов функций
Некоторые функции требуют длинного списка аргументов. Этого следует избегать (например, с помощью классов данных), хотя это не всегда зависит от вас. Существует другой вариант – создать словарь с именованными аргументами и передать его функции. Так ваш код станет более читабельным.
Распаковать словарь можно, используя префикс **:
Аналогично можно использовать * для распаковки массива и передачи его содержимого в качестве аргументов функции:
18. Строка – заголовок
Если хотите быстро получить красивый заголовок, сделайте так:
19. Разбиение строки в список
Вы можете разбить строку на список строк. В этом случае разбиение происходит по символу пробела:
Чтобы разделить по пустому месту, не нужно передавать в split никаких аргументов – используйте mystring.split().
Split также имеет второй параметр, называемый maxsplit, который определяет максимальное количество разбиений. По умолчанию он равен -1 (без ограничений). Вот пример, с ограничением разбиения на 1:
20. Создание строки из списка строк
Создание строки из списка и установка пробелов между каждым словом:
Все сводится к тому, что функция String.join() может присоединять не только списки, но и любой iterable. Помещение его внутрь строки предотвращает реализацию одной и той же функциональности в нескольких местах.
21. Query JSON
JMESpath – это язык запросов для JSON, который позволяет получать необходимые данные из документа или словаря JSON. Библиотека доступна как для Python, так и для других ЯП, что расширяет ее возможности.
Вот несколько примеров кода для общего представления:
22. Реверс строк и списков
Вы можете использовать slice-нотацию, чтобы перевернуть строку или список. При отрицательном значении шага, элементы меняются местами:
23. Получение уникальных элементов из списка или строки
Создавая набор с помощью функции set(), вы получаете все уникальные элементы из списка или объекта:
24. Валидные значения словаря
В словарь можно поместить что угодно – вы не ограничены числами или строками. Можете поместить списки внутрь словаря и получить доступ к вложенным значениям:
25. Тернарный оператор условного присваивания
Это еще один способ сделать код более кратким и сохранить его читабельность:
А вот пример:
26. Подсчет вхождений в список
Используйте Counter из библиотеки коллекций, чтобы получить словарь с подсчетом всех уникальных элементов в списке:
27. Цепочки операторов сравнения
Создавайте еще более читаемый и аккуратный код:
28. Работа с датами
Модуль python-dateutil предоставляет мощное расширение для стандартного datetime. Устанавливается он следующим образом:
Вот пример парсинга даты из логов:
29. Использование map()
Такой синтаксис имеет данная встроенная функция:
Ниже видите пример с использованием списков:
30. Словарь и set comprehensions
Словарю нужны ключ и значение:
Определяем ключ и значение в expression.
Синтаксис set comprehension не сильно отличается от list comprehension. Мы просто используем фигурные скобки вместо квадратных:
Пример:
Заключение
В современном динамичном мире важно знать как можно больше хитростей, ускоряющих рутинную работу разработчика. Рассмотренная подборка отвечает всем требованиям повышенного уровня сложности и при должном количестве потраченного времени сможет вырастить из вас профессионала – главное не сдавайтесь! Удачи!
Дополнительный материал:
- Микросервисная архитектура на примере Python и gRPC
- Хватит использовать print для отладки в Python: переходите на Icecream
- Туториал: визуализация данных в вебе с помощью Python и Dash
- Самоучитель для начинающих: как освоить Python с нуля за 30 минут?
- Топ-20 бесплатных ресурсов для изучения Python: сохрани это в закладки
На Python создают прикладные приложения, пишут тесты и бэкенд веб-приложений, автоматизируют задачи в системном администрировании, его используют в нейронных сетях и анализе больших данных. Язык можно изучить самостоятельно, но на это придется потратить немало времени. Если вы хотите быстро понять основы программирования на Python, обратите внимание на онлайн-курс «Библиотеки программиста». За 30 уроков (15 теоретических и 15 практических занятий) под руководством практикующих экспертов вы не только изучите основы синтаксиса, но и освоите две интегрированные среды разработки (PyCharm и Jupyter Notebook), работу со словарями, парсинг веб-страниц, создание ботов для Telegram и Instagram, тестирование кода и даже анализ данных. Чтобы процесс обучения стал более интересным и комфортным, студенты получат от нас обратную связь. Кураторы и преподаватели курса ответят на все вопросы по теме лекций и практических занятий.
Комментарии