26 полезных приёмов и хитростей Python

Kate

Administrator
Команда форума
Python — один из самых популярных и востребованных языков программирования. На это есть несколько причин:

  • Его легко изучить.
  • Он очень универсальный.
  • У него есть множество модулей и библиотек.
В процессе работы с Python каждый находит для себя какие-то полезные модули и приёмы. В этой подборке вы узнаете о некоторых полезных хитростях.

all и any​

Одна из многих причин популярности Python — его читабельность и выразительность.

Часто шутят, что Python — это «исполняемый псевдокод». Однако когда вы можете писать код таким образом, становится сложно не согласиться:

x = [True, True, False]
if any(x):
print("Как минимум один True")

if all(x):
print("Ни одного False")

if any(x) and not all(x):
print("Как минимум один True и один False")

bashplotlib​

Хотите строить графики в консоли?

$ pip install bashplotlib

Стройте на здоровье.

collections​

В Python есть классные встроенные типы данных, но порой они ведут себя не совсем так, как хотелось бы.

К счастью, во встроенной библиотеке Python есть модуль collections с удобными дополнительными типами данных:

from collections import OrderedDict, Counter

# Запоминает порядок добавления ключей
x = OrderedDict(a=1, b=2, c=3)

# Считает частоту каждого символа
y = Counter("Hello World!")

dir​

Когда-нибудь задумывались о том, как заглянуть внутрь объекта в Python и посмотреть на его атрибуты? Конечно, задумывались.
https://tproger.ru/jobs/full-stack-razrabotchik/?utm_source=in_text
Используем командную строку:

>>> dir()
>>> dir("Hello World")
>>> dir(dir)
Это может пригодиться при интерактивной сессии в Python, а также для динамического изучения объектов и модулей, с которыми вы работаете.

Больше можно узнать в официальной документации.

emoji​

Да, серьёзно.

$ pip install emoji

И не делайте вид, что не хотите попробовать:

from emoji import emojize

print(emojize(":thumbs_up:"))

from __future__ import​

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

Впрочем, не всё так плохо. Модуль __future__ даёт возможность импортировать функциональность будущих версий Python. Это прямо как путешествие во времени, или магия:

from __future__ import print_function

print("Hello World!")
Почему бы не попробовать импортировать фигурные скобки?

geopy​

Программистам может быть сложно ориентироваться в географии. Однако модуль geopy всё упрощает:

$ pip install geopy

Он работает путём абстрагирования API разных сервисов геокодирования. Этот модуль даёт возможность узнать полный адрес места, его долготу и широту и даже высоту.

Также в нём есть полезный класс Distance. Он высчитывает расстояние между двумя местами в удобной единице измерения.

from geopy import GoogleV3

place = "221b Baker Street, London"
location = GoogleV3().geocode(place)

print(location.address)
print(location.location)

howdoi​

Зависли над какой-то проблемой и не можете вспомнить её решение? Нужно зайти на StackOverflow, но не хочется покидать терминал?

Тогда вам не обойтись без этого инструмента командной строки:

$ pip install howdoi

Задайте любой вопрос, и он постарается найти ответ на него:

$ howdoi vertical align css
$ howdoi for loop in java
$ howdoi undo commits in git
Но будьте осторожны: он извлекает код из топовых ответов на StackOverflow и не всегда даёт полезную информацию:

$ howdoi exit vim

inspect​

Модуль inspect пригодится для понимания того, что происходит за кулисами в Python. Вы даже можете вызывать его методы на них самих!

Ниже используется метод inspect.getsource() для вывода его собственного исходного кода. Также используется метод inspect.getmodule() для вывода модуля, в котором его определили.

Последняя команда выводит номер строки, на которой она сама находится:

import inspect

print(inspect.getsource(inspect.getsource))
print(inspect.getmodule(inspect.getmodule))
print(inspect.currentframe().f_lineno)
Конечно, кроме таких банальных применений этот модуль может оказаться полезным для понимания того, что делает ваш код. Также вы можете использовать его, чтобы писать самодокументированный код.

Jedi​

Библиотека Jedi предназначена для автодополнения и анализа кода. Она ускоряет процесс написания кода и делает его более продуктивным.

Если вы не разрабатываете свою IDE, то вам, наверное, будет более интересно использовать Jedi в качестве расширения редактора. К счастью, уже есть много вариантов.

Возможно, вы уже встречались с Jedi — IPython использует эту библиотеку для автодополнения.

**kwargs​

Когда изучаешь любой язык, на пути встречается множество краеугольных камней. В случае с Python понимание таинственного синтаксиса **kwargs можно считать одним из них.

Две звёздочки впереди объекта словаря дают возможность передавать в функцию содержимое этого словаря как именованные аргументы.

Ключи словаря — это имена аргументов, а значения передаются в функцию. Вам даже не обязательно называть его kwargs:

dictionary = {"a": 1, "b": 2}

def some_function(a, b):
print(a + b)
return

# оба варианта делают одно и то же:
some_function(**dictionary)
some_function(a=1, b=2)
Это полезно в тех случаях, когда ваши функции должны обрабатывать именованные аргументы, не определённые заранее.

Прим.перев. Также это может пригодиться при написании функций-обёрток, которые передают все аргументы другой функции.

Генераторы списков​

Ещё одна классная особенность Python, дающая возможность быстро создавать списки. Такие выражения позволяют легко писать чистый код, который читается почти как естественный язык:

numbers = [1, 2, 3, 4, 5, 6, 7]
evens = [x for x in numbers if x % 2 == 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))
Здесь map() применяет простую лямбда-функцию на каждом элементе x и возвращает объект map, который можно преобразовать в какой-нибудь итерируемый объект вроде списка или кортежа.

newspaper3k​

Если вы ещё с ним не встречались, то приготовьтесь к тому, что модуль newspaper снесёт вам крышу.

Он даёт возможность извлекать статьи и связанные мета-данные из множества разных источников. Можно извлечь изображения, текст и имена авторов.

В нём даже есть встроенная NLP-функциональность.

Поэтому, если вы собирались использовать BeautifulSoup или другую библиотеку для вебскрапинга в своём следующем проекте, лучше сэкономьте своё время и силы и установите newspaper:

$ pip install newspaper3k

Перегрузка операторов​

В Python есть поддержка перегрузки операторов — одной из тех штук, о которых говорят все настоящие computer-scientis’ы.

На самом деле идея проста. Когда-нибудь задумывались, почему Python позволяет использовать оператор + как для сложения чисел, так и для конкатенации строк? За этим как раз и стоит перегрузка операторов.

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

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​

Стандартная функция Python print() делает своё дело. Но если попытаться вывести какой-нибудь большой вложенный объект, результат будет выглядеть не очень приятно.

Здесь на помощь приходит модуль из стандартной библиотеки pprint (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.

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

Очереди «первым пришёл — первым ушёл» («first in, first out», FIFO) позволяют извлекать объекты в порядке их добавления. Из очередей «последним пришёл — первым ушёл» («last in, first out», LIFO) можно извлекать последние добавленные объекты.

Наконец, приоритетные очереди позволяют извлекать объекты согласно порядку их сортировки.

Здесь можно посмотреть на пример использования очередей в многопоточном программировании на Python.

__repr__​

При определении класса или объекта полезно добавлять «официальный» способ представления объекта строкой. Например:

>>> file = open('file.txt', 'r')
>>> print(file)
<open file 'file.txt', mode 'r' at 0x10d30aaf0>
Это сильно упрощает отладку. Вот всё, что вам нужно сделать:

class SomeClass:
def __repr__(self):
return "<какое-то описание>"

some_instance = SomeClass()

# выводит <какое-то описание>
print(some_instance)
Прим.перев. Метод __repr__() позволяет определять строковое представление, предназначенное для программиста и удобное при использовании во время отладки, а метод __str__() позволяет определять понятное пользователю строковое представление, которое можно отображать в интерфейсе программы.

sh​

Python — отличный скриптовый язык. Но иногда стандартные библиотеки os и subprocess вызывают только головную боль.

Библиотека sh может стать приятной альтернативой.

Она позволяет вызывать любую программу как обычную функцию, что полезно для автоматизации различных задач исключительно с помощью Python:

import sh

sh.pwd()
sh.mkdir('new_folder')
sh.touch('new_file.txt')
sh.whoami()
sh.echo('This is great!')
Прим.перев. Библиотека sh поддерживает только платформы Linux и macOS; для работы на Windows вам придётся поискать другой инструмент.

Аннотации типов​

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

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

С версии Python 3.5 при определении функции можно добавлять аннотации типов:

def add_two(x: Int) -> Int:
return x + 2
Можно даже определять псевдонимы типов:

from typing import List

Vector = List[float]
Matrix = List[Vector]

def add_matrix(a: Matrix, b: Matrix) -> Matrix:
result = []
for i, row in enumerate(a):
result_row = []
for j, col in enumerate(row):
result_row += [a[j] + b[j]]
result += [result_row]
return result

x = [1, 2]
y = [3, 4]
z = add_matrix(x, y)
Хотя их использование опционально, с помощью аннотаций типов код можно сделать более понятным.

Также они позволяют использовать инструменты для проверки типов, чтобы отлавливать ошибки TypeError.

uuid​

Стандартный модуль uuid — быстрый и простой способ сгенерировать UUID (universally unique identifier, глобально уникальный идентификатор).

import uuid

user_id = uuid.uuid4()
print(user_id)
Так мы создаём случайное 128-битное число, которое почти наверняка будет уникальным.

Существует более 2¹²² возможных UUID. Это более 5 ундециллионов или 5,000,000,000,000,000,000,000,000,000,000,000,000.

Вероятность нахождения дубликатов в заданном наборе крайне мала. Даже при наличии триллиона UUID вероятность того, что среди них есть дубликат, гораздо меньше, чем один к миллиарду.

Вполне недурно для двух строк кода.

Виртуальные среды​

Часто Python-программисты работают над несколькими проектами одновременно. К сожалению, порой два проекта зависят от разных версий одной зависимости. Какую же установить?

К счастью, в Python есть поддержка виртуальных сред, которые позволяют взять лучшее от двух миров. В командной строке нужно ввести:

$ python3 -m venv my-project
$ source my-project/bin/activate
$ pip install all-the-modules
Теперь вы можете иметь разные независимые версии Python на одной машине.

wikipedia​

У Wikipedia есть классное API, которое позволяет получить доступ к непревзойдённому источнику полностью бесплатной информации.

Модуль wikipedia делает доступ к этому API чуть ли чрезмерно удобным:

import wikipedia

result = wikipedia.page('freeCodeCamp')
print(result.summary)
for link in result.links:
print(link)
Как и настоящий сайт, модуль предоставляет поддержку многих языков, разрешение многозначности страниц, получение случайной страницы и даже метод donate().

xkcd​

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

Конечно, чувство юмора не заканчивается на документации. Попробуйте ввести следующую строку:

import antigravity

Оставайся собой, Python. Оставайся собой.

YAML​

YAML означает «YAML — не язык разметки» («YAML Ain’t Markup Language»). Это язык форматирования данных, являющийся надмножеством JSON.

В отличие от JSON, YAML может хранить более сложные объекты и ссылаться на собственные элементы. Также там можно писать комментарии, что делает YAML подходящим для конфигурационных файлов.

Модуль PyYAML позволяет использовать YAML в Python. Установить можно так:

$ pip install pyyaml

А затем импортировать:

import yaml

PyYAML позволяет хранить любые Python-объекты и экземпляры любых пользовательских классов.

zip​

Напоследок ещё одна клёвая штука. Когда-нибудь возникала необходимость создать словарь из двух списков?

keys = ['a', 'b', 'c']
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))
Встроенная функция zip() принимает несколько итерируемых объектов и возвращает последовательность кортежей. Каждый кортеж группирует элементы объектов по их индексу.

Можно провести операцию, обратную zip(), с помощью zip(*).

Источник статьи: https://tproger.ru/translations/an-a-z-of-python-tricks/
 
Сверху