Букварь известных и не очень возможностей 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
Комментарии