26 полезных возможностей Python: букварь разработки от А до Z

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

Другие статьи о возможностях Python:

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

admin
11 декабря 2018

ООП на Python: концепции, принципы и примеры реализации

Программирование на Python допускает различные методологии, но в его основе...
admin
28 июня 2018

3 самых важных сферы применения Python: возможности языка

Существует множество областей применения Python, но в некоторых он особенно...
admin
13 февраля 2017

Программирование на Python: от новичка до профессионала

Пошаговая инструкция для всех, кто хочет изучить программирование на Python...