print() или pprint(), вот в чем вопрос
Рассмотрим применение одной из самых часто используемых функций и определим, в каких случаях лучше использовать ее собрата pprint().
print()
Функция print() не нуждается в представлении, обычно она и является первым шагом в сторону изучения Python.
print("Hello, Python!") > Hello, Python!
print() - это встроенная функция, и кроме каких-то объектов, которые она принимает для вывода, у нее есть несколько полезных аргументов, о которых не все знают на начальных этапах.
print(*objects, sep=' ', end='\n', file=None, flush=False)
Записывает в поток все неименованные аргументы (*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() открывают широкий горизонт для возможностей отладки, тестирования и просто удобного представления данных, делая жизнь кодеров немножечко легче.