Найти тему
С любовью о Python

print() или pprint(), вот в чем вопрос

Оглавление

Рассмотрим применение одной из самых часто используемых функций и определим, в каких случаях лучше использовать ее собрата pprint().

print()

Функция print() не нуждается в представлении, обычно она и является первым шагом в сторону изучения Python.

print("Hello, Python!")
> Hello, Python!

print() - это встроенная функция, и кроме каких-то объектов, которые она принимает для вывода, у нее есть несколько полезных аргументов, о которых не все знают на начальных этапах.

print(*objects, sep=' ', end='\n', file=None, flush=False)

Что по сути делает print()?

Записывает в поток все неименованные аргументы (*objects). При этом эти аргументы превращаются в строки, подобно использованию встроенной функции str(), разделяются значениями из аргумента sep, и к последнему объекту в конец добавляется значение из end, которое по умолчанию = новой строке.

Оба аргумента sep и end должны быть строками.

Если в функцию print() не было передано никаких объектов, она выводит данные из end.

Рассмотрим несколько примеров:

print(1)
print()
print("2", "3")

> 1
> # Здесь ничего не напечатано, т.к. нет объектов, просто новая строка (\n)
> 2 3 # Переданные объекты разделены пробелом из sep и в конце добавлена новая строка

Теперь разделим переданные объекты произвольными символами " | " и вместо символа новой строки из end напечатаем "finish". Нетрудно догадаться, что сроки склеятся, т.к. мы не указали символ новой строки в конце.

for _ in range(2):
print(1, 2, 3, sep=" | ", end="finish")

> 1 | 2 | 3finish1 | 2 | 3finish

Исправим ситуацию и добавим знак новой строки. Теперь выводимая информация будет разделена:

for _ in range(2):
print(1, 2, 3, sep=" | ", end="finish\\n")

> 1 | 2 | 3finish
> 1 | 2 | 3finish

Рассмотрим оставшиеся аргументы.

file - это поток или файлоподобный объект; если он не указан или равен None, будет использоваться стандартный поток вывода sys.stdout, то есть значение будет выводиться в консоль.

Мы можем сохранить вывод функции print() сразу в файл, для этого достаточно использовать контекстный менеджер:

with open("print_info.txt", "w") as file:
for i in range(5):
print(i, file=file)

Что происходит: открываем файл print_info.txt в режиме записи (если файла нет, то создаем на лету) с помощью контекстного менеджера и сохраняем в этот файл вывод функции print().

Проверим, что все отработало как надо: должен появиться файл print_info.txt с таким содержимым:

0
1
2
3
4

Дельного применения аргумента flush с значением не по дефолту я не нашел и сам не пользовался, поэтому лишь опишу, зачем он нужен.

flush позволяет выводить сообщения без задержек. По умолчанию, данные вывода записываются сначала в буфер обмена, а после - в консоль или файл.

pprint()

Вообще, pprint - это целый модуль с набором функций для красивого вывода результатов. Но давайте разберем только одноименную функцию и не будем пока распыляться.

pprint.pprint(object, stream=None, indent=1, width=80, depth=None, ***, compact=False, sort_dicts=True, underscore_numbers=False)

Рассмотрим важные параметры:

stream (по умолчанию = sys.stdout) — это файлоподобный объект, в который будут записываться выходные данные. По сути, то же самое, что и file у функции print().

Следующие параметры определяют способ отображения вложенности сложных структур данных:

indent (по умолчанию = 1) - определяет величину отступа, добавляемого для каждого уровня вложенности.

depth контролирует количество уровней вложенности, которые могут быть напечатаны. Если печатаемая структура данных слишком глубока, следующий содержащийся уровень заменяется на .... По умолчанию ограничений на глубину форматируемых объектов нет.

width (по умолчанию = 80) определяет желаемое максимальное количество символов в строке вывода.

sort_dicts - если имеет значение True (по умолчанию), словари будут отформатированы с отсортированными ключами, в противном случае они будут отображаться в порядке вставки.

underscore_numbers - если = True, целые числа будут отформатированы с использованием символа разделителя тысяч (_), в противном случае символы подчеркивания не отображаются.

Итак, рассмотрим пару примеров.

Выведем данные в консоль и отсортируем с помощью pprint() словарь, сделаем числа более читаемыми:

import pprint

pprint.pprint(
{"c": 123123123213, "b": 5524524524556, "a": 432456426},
underscore_numbers=True,
sort_dicts=True
)

> {'a': 432_456_426, 'b': 5_524_524_524_556, 'c': 123_123_123_213}

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

А теперь посмотрим, насколько удобно работать с словарями большой вложенности:

import pprint

test_json = {
"quiz": {
"sport": {
"q1": {
"question": "Which one is correct team name in NBA?",
"options": [
"New York Bulls",
"Los Angeles Kings",
"Golden State Warriros",
"Huston Rocket"
],
"answer": "Huston Rocket"
}
},
"maths": {
"q1": {
"question": "5 + 7 = ?",
"options": [
"10",
"11",
"12",
"13"
],
"answer": "12"
},
"q2": {
"question": "12 - 8 = ?",
"options": [
"1",
"2",
"3",
"4"
],
"answer": "4"
}
}
}
}

print(test_json) # 1
pprint.pprint(
test_json,
indent=2,
sort_dicts=False,
) # 2
pprint.pprint(
test_json,
indent=2,
sort_dicts=False,
depth=2
) # 3

Расписывать весь вывод не буду, объясню словами:

# 1: Словарь будет выведен в консоль в 1 строку.

# 2: Словарь будет отформатирован в читаемом виде и выведен в консоль с 2 отступами и без сортировки по ключам

# 3: Все почти как и в предыдущем пункте, только с ограничением по вложенности = 2. И выглядит это так:

{'quiz': {'sport': {...}, 'maths': {...}}}

Таким образом, функции print() и pprint() открывают широкий горизонт для возможностей отладки, тестирования и просто удобного представления данных, делая жизнь кодеров немножечко легче.

***

Присоединяйтесь ко мне в Telegram: https://t.me/python3_with_love. Там есть все, и читать код намного удобнее.

Наука
7 млн интересуются