Букварь известных и не очень возможностей Python для простой и приятной разработки. 26 модулей, приемов и хитростей, о которых вы могли не знать.
Python сейчас находится на пике популярности. Он очень востребован во всех сферах программирования, и это неслучайно, ведь язык:
- легок в осваивании;
- суперуниверсален;
- имеет множество полезных модулей.
Чтобы работать с ним стало еще удобнее, возьмите на вооружение несколько полезных советов. Некоторые из них найдены в документации стандартной библиотеки, другие — в PyPi. Четыре или пять обнаружились на awesome-python.com.
all or any: все или хоть что-нибудь
Python — удивительно простой и выразительный язык. Его даже иногда называют «выполняемым псевдокодом». И с этим трудно поспорить, когда вы можете себе позволить конструкции, подобные этим:
x = [True, True, False] if any(x): print("По крайней мере один элемент True") if all(x): print("Все элементы True") if any(x) and not all(x): print("Хотя бы один элемент True и один False")
bashplotlib: графики в терминале
А вы знали, что можно строить графики прямо в командной строке? Теперь знаете. За одну из самых удобных возможностей языка отвечает модуль bashplotlib.
$ pip install bashplotlib
collections: коллекции на любой вкус
Встроенные типы данных в Python — высший класс, но иногда хочется чего-то большего. Что ж, если хочется, обратитесь к модулю collections и выбирайте дополнительную структуру на свой вкус.
from collections import OrderedDict, Counter # Упорядоченный список сохранит последовательность элементов x = OrderedDict(a=1, b=2, c=3) # Счетчик рассортирует символы по частотам y = Counter("Hello World!")
dir: что внутри?
Хотелось ли вам когда-нибудь заглянуть в объект и увидеть, какими свойствами он обладает? Разумеется, в Python вы можете это сделать.
>>> dir() >>> dir("Привет, мир!") >>> dir(dir)
Это одна из самых важных возможностей Python для интерактивного запуска и отладки кода. Подробнее функция dir() описана в документации.
emoji: Python — ?
Серьезно ?? Абсолютно серьезно ?.
$ pip install emoji
Не притворяйтесь, что не будете этого делать.
from emoji import emojize print(emojize(":thumbs_up:"))
__future__: импорт из будущего
Следствием популярности языка является постоянная разработка новых версий. Это значит, что регулярно появляется множество новых функций и возможностей Python. Но как быть, если у вас устаревшая версия?
Модуль __future__ позволяет импортировать функциональность из будущего. Это практически путешествие во времени — настоящее волшебство.
from __future__ import print_function print("Привет, мир!")
Попробуйте, например, использовать фигурные скобки.
geopy: где я нахожусь?
Программист может легко запутаться в географических объектах, но не с модулем geopy.
$ pip install geopy
Он взаимодействует с различными сервисами геокодирования и позволяет легко получить адрес искомого места, а также географические характеристики, включая даже высоту над уровнем моря.
Кроме того, вы можете подсчитать расстояние между двумя объектами в ваших любимых единицах.
from geopy import GoogleV3 place = "221b Baker Street, London" location = GoogleV3().geocode(place) print(location.address) print(location.location)
howdoi: StackOverflow прямо в терминале
Застряли во время разработки и никак не можете поймать за хвост решение, которое уже точно где-то видели? Надо идти на StackOverflow, но не хочется выходить из консоли?
Тогда вам нужен это суперполезный CLI-инструмент.
$ pip install howdoi
Задавайте любой вопрос, howdoi найдет что вам посоветовать.
$ howdoi vertical align css $ howdoi for loop in java $ howdoi undo commits in git
Инструмент собирает самые популярные ответы со StackOverflow, хотя они не всегда могут помочь…
$ howdoi exit vim
inspect: что здесь происходит?
Модуль inspect — отличный помощник, когда нужно разобраться, что происходит в вашем коде. Он может инспектировать даже сам себя!
В примере метод getsource() применяется, чтобы вывести исходный код inspect. А getmodule() распечатает модуль, в котором он был определен.
Последняя строчка просто выводит номер строки.
import inspect print(inspect.getsource(inspect.getsource)) print(inspect.getmodule(inspect.getmodule)) print(inspect.currentframe().f_lineno)
Конечно же, эти примитивные примеры не описывают все возможности модуля inspect. Это отличное решение для создания самодокументированного кода.
Jedi: будь джедаем
Библиотека создана для автодополнения в процессе разработки и статического анализа. С ней можно кодить быстрее и продуктивнее.
Jedi можно подключить как плагин для редактора. Но возможно, что вы уже имеете с ней дело. Например, IPython использует ее функциональность.
**kwargs: словарь аргументов
Понимание таинственного звездного синтаксиса — важный этап в изучении Python.
Двойная звездочка означает, что содержимое словаря kwargs будет передаваться в функцию в виде именованных аргументов. При этом ключи станут именами параметров.
Нет необходимости использовать именно слово kwargs, это лишь общепринятый пример.
dictionary = {"a": 1, "b": 2} def someFunction(a, b): print(a + b) return # а это то же самое: someFunction(**dictionary) someFunction(a=1, b=2)
Это полезно, если вы создаете функцию, которая оперирует именованными аргументами, не определенными на стадии написания кода.
List comprehensions: Генераторы списков
Одна из самых удобных возможностей Python — это генераторы списков. Написанный с их помощью код выглядит очень чистым и легко читается, практически как обычный человеческий язык.
numbers = [1,2,3,4,5,6,7] evens = [x for x in numbers if x % 2 is 0] odds = [y for y in numbers if y not in evens] cities = ['Лондон', 'Дублин', 'Осло'] def visit(city): print("Добро пожаловать в " + city) for city in cities: visit(city)
Если вы хотите узнать о генераторах больше, загляните сюда.
map: перебор коллекций
Существует много встроенных возможностей Python, предназначенных для программирования в функциональном стиле. Среди них метод map(), который в паре с лямбда-функциями творит чудеса.
x = [1, 2, 3] y = map(lambda x : x + 1 , x) # выведет [2,3,4] print(list(y))
Для каждого элемента коллекции x выполняется простая функция. Результатом работы метода map() является специальный объект, который легко конвертировать в любую итерируемую структуру, например, в список.
newspaper3k: все новости мира
Модуль newspaper позволяет получать новостные статьи из ведущих международных изданий. Доступны изображения, авторы и даже некоторые встроенные методы обработки естественного языка.
Так что если вы думали об использовании BeautifulSoup или какой-либо другой библиотеки вебскраппинга, не тратьте время и просто возьмите newspape.
$ pip install newspaper3k
Operator overloading: перегрузка операторов
Термин перегрузка операторов звучит так глубокомысленно, что произнося его, вы выглядите как настоящий ученый в области компьютерных наук. На самом же деле это очень простая концепция.
Например, вы думали о том, почему с помощью оператора +
можно и складывать числа, и конкатенировать строки? Это живой пример перегрузки.
Можно создать объекты, которые по-своему интерпретируют обычные операторы языка.
class Thing: def __init__(self, value): self.__value = value # перегрузка оператора > def __gt__(self, other): return self.__value > other.__value # перегрузка оператора < def __lt__(self, other): return self.__value < other.__value something = Thing(100) nothing = Thing(0) # True something > nothing # False something < nothing # Error something + nothing
pprint: красивая печать
Функция print отлично справляется со своей работой. Но если вы захотите вывести на печать какой-нибудь громоздкий многоуровневый объект, результат будет довольно уродливым.
На помощь спешит модуль pretty-print из стандартной библиотеки. Он предоставляет массу возможностей Python для тех, кто имеет дело с нетривиальными структурами и сложными объектами. Теперь все что угодно можно вывести в удобном для чтения формате.
import requests import pprint url = 'https://randomuser.me/api/?results=1' users = requests.get(url).json() pprint.pprint(users)
Queue: реализация очередей
Python позволяет многопоточную разработку, а модуль Queue дает возможность создавать очереди. Это особые структуры данных, элементы которых добавляются и извлекаются по определенным правилам.
Например, FIFO-очереди (первый на вход — первый на выход) отдают элементы в том порядке, в котором они были добавлены. LIFO-очереди (последний на вход — первый на выход), наоборот, дают доступ к элементу, добавленному последним. И наконец, в приоритетных очередях значение имеет порядок сортировки.
Взгляните, как применяются очереди для многопоточного программирования.
__repr__: вывод в виде строки
Когда вы создаете собственный класс или объект, для него следует предоставить способ строкового вывода. Это может выглядеть примерно так:
>>> file = open('file.txt', 'r') >>> print(file) <open file 'file.txt', mode 'r' at 0x10d30aaf0>
Прежде всего это нужно для удобной отладки, поэтому не ленитесь добавлять вашим классам метод __repr__
. А если вам нужно красивое строковое представление для пользовательского интерфейса, пригодится метод __str__
.
class someClass: def __repr__(self): return "<какое-то описание>" someInstance = someClass() # выведет <какое-то описание> print(someInstance)
sh: команды терминала прямо из кода
Порой применение стандартных библиотек os и subprocess превращается в головную боль для разработчика. Но есть удобная альтернатива — библиотека sh.
Она дает возможность вызвать программу, как если бы это была просто функция языка. Таким образом, можно автоматизировать процессы и задачи непосредственно из кода Python.
from sh import * sh.pwd() sh.mkdir('new_folder') sh.touch('new_file.txt') sh.whoami() sh.echo('This is great!')
Type hints: указания типов
Типизация в Python динамическая, поэтому нам не нужно определять конкретные типы данных для переменных и параметров функций.
Да, это ускоряет процесс разработки, но нет ничего более раздражающего, чем ошибки типов, возникающие во время выполнения.
В современном стандарте Python появилась возможность добавлять определение типа на стадии разработки.
def addTwo(x : Int) -> Int: return x + 2
Для типов можно даже создавать псевдонимы:
from typing import List Vector = List[float] Matrix = List[Vector] def addMatrix(a : Matrix, b : Matrix) -> Matrix: result = [] for i,row in enumerate(a): result_row =[] for j, col in enumerate(row): result_row += [a[i][j] + b[i][j]] result += [result_row] return result x = 1.0, 0.0], [0.0, 1.0એ y = 2.0, 1.0], [0.0, -2.0એ z = addMatrix(x, y)
Подобные аннотации необязательны, но они делают код проще, а также дают возможность использовать инструменты автоматического анализа для отлова случайных ошибок. Очень полезная вещь в больших проектах!
uuid
Одна из встроенных возможностей Python — генерация универсальных уникальных идентификаторов. За это отвечает модуль uuid.
import uuid user_id = uuid.uuid4() print(user_id)
Результат работы этого кода — одно из 2122 возможных 128-битных чисел. Вероятность дублирования меньше, чем одна миллиардная доля — это совсем неплохо.
Virtual environments: виртуальные среды
Одна из самых полезных возможностей Python.
Часто бывает так, что два проекта используют одну и ту же зависимость, но в разных версиях. Что вы устанавливаете в этом случае?
Нет нужды делать сложный выбор, ведь Python поддерживает виртуальные среды.
python -m venv my-project source my-project/bin/activate pip install all-the-modules
На одном компьютере теперь может работать сразу несколько автономных версий языка.
wikipedia: мировые запасы информации к вашим услугам
Википедия имеет отличный API для программного доступа к огромному количеству информации, а модуль wikipedia позволяет с легкостью с ним взаимодействовать.
import wikipedia result = wikipedia.page('freeCodeCamp') print(result.summary) for link in result.links: print(link)
Как и сам сайт, модуль поддерживает несколько языков, позволяет случайно выбирать страницу и даже имеет метод donate()
.
xkcd: комиксы
Язык получил свое название в честь комедийного шоу Монти Пайтона, поэтому у него неплохое чувство юмора. В документации множество отсылок к известным скетчам, но это еще не все. Просто запустите эту команду:
import antigravity
Ты прекрасен, Python!
YAML
YAML — это надмножество JSON, предназначенное для форматирования данных. Он отлично справляется со сложными объектами, поддерживает комментарии и даже способен обрабатывать циклические ссылки. В целом это идеальный выбор для создания файлов конфигурации.
Ряд возможностей для комбинации YAML и Python дает модуль PyYAML.
Просто инсталлируйте его:
$ pip install pyyaml
и используйте в вашем проекте:
import yaml
Теперь можно с удобством хранить данные любого типа.
zip: упаковка нескольких коллекций
Последняя, но не худшая, из букваря возможностей Python — функция zip()
. Используйте ее, если необходимо объединить два списка в один словарь:
keys = ['a', 'b', 'c'] vals = [1, 2, 3] zipped = dict(zip(keys, vals))
На вход метод принимает итерируемые объекты, на выходе получается список кортежей сгруппированных по индексу элементов.
Вы также можете «распаковать» объекты, вызвав функцию zip(*list)
.
Надеемся, что в A-Z списке возможностей Python вы нашли что-нибудь полезное для своих проектов. Делитесь вашими любимыми трюками в комментариях.
Оригинал: An A-Z of useful Python tricks