Python: вывод данных в консоль

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

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

Функция print и её параметры

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

Программист может настраивать вывод данных, используя аргументы функции:

*objects

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

Передавая объекты в функцию, программист может их передавать через запятую или использовать конкатенацию. Передача нескольких аргументов не приведёт к конфликту между *objects и другими необязательными аргументами, потому что интерпретатор автоматически распознаёт остальные параметры по ключевому слову (sep, end, file, flush)!

Вот пример:

print("apple", "orange" + " banana", "cherry")

apple orange banana cherry

sep

Этот аргумент определяет, что будет стоять между переданными объектами. По умолчанию параметр sep имеет значение » «, то есть при выводе нескольких объектов, между ними будет установлен пробел, поменяем его на другой символ, например «-«:

print("Один", "Два", "Три", sep="-")

Один-Два-Три

end

Аргумент определяет символ, которым заканчивается выполнение функции print(). По умолчанию это символ переноса строки «\n», то есть после вывода всех данных каретка переходит на следующую строку, и следующий вывод функции print начинается с новой строки. Если нужно, чтобы вывод нескольких print был в одну строку — следует заменить последний символ.

Вот пример:

print("Один")
print("Два", end=" ")
print("Три")

Один
Два Три

file

Этот аргумент позволяет переопределить поток вывода. По умолчанию установлено значение «sys.stdout», то есть данные выводятся в консоль. Если вместо этого указать какой-нибудь файл, то в данные запишутся в него.

Вот пример скрипта на Python, который откроет файл temp.txt и запишет в него текст с помощью функции print:

with open("temp.txt", "w") as f:
    print("Write to file", file=f)

flush

Этот необязательный аргумент позволяет отчистить поток вывода. По умолчанию имеет значение False, когда вывод буферизуется, программист может указать значение «True», чтобы вывод производился сразу. Например, если вы пишете в файл данные, то они попадают в буфер и записываются реально в файл когда буфер заполнится или будет закрыт файл.

Аналогично и с выводом в консоль, данные записываются в буфер и выводятся из него в консоль. Если flush выставлен в True, то вывод производится немедленно.

print("Some text", flush=True)

Форматированный вывод

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

Оператор %

Оператор % часто используется для форматирования и хорошо известен не только программистам на Python, но и программистам на C/С++. По сути, оператор % — это метка, вместо которой подставляется значение переменной или выражение. Оператор % размещается непосредственно в выводимой строке, а подставляемые значения — в кортеже после второго %. Пример:

print("Программа номер %2d, получила результат: %5.2f" % (4, 7.3333))

Программа номер  4, получила результат:  7.33

Помимо символа % указывается тип значения, а также, по желанию, длина и точность. Синтаксис выглядит так:

%(флаги)(ширина)(.точность)тип

Если рассмотреть пример, можно увидеть, что:

  • «%2d» используется для первого элемента кортежа, целого числа «4». Так как после % указана длина «2», а число в кортеже состоит только из одной цифры, в выводе добавится дополнительный пробел.
  • «%5.2f» — это формат для чисел с плавающей точкой. «5» — это общее количество цифр, которые должна содержать строка, а «.2» — это количество цифр после запятой.

Метод format

Этот инструмент был добавлен в Python версии 2.6. В сравнении с предыдущем способом format оказывается чуть более громоздким. Программист использует символ «{}», чтобы отметить место, в которое будет подставлена переменная или выражение. Внутри фигурных скобок можно указать имя, тип значения, ширину и точность.

Подставляемые значения указываются в кортеже после ключевого слова format. Их можно указывать как позиционно, так и присваивать по имени. Пример:

print('{0} {1} января празднует {other} день рождения'
    .format('Никита', '25', other ='15-ый'))

Никита 25 января празднует 15-ый день рождения

Метод format также позволяет форматировать числа, то есть указывать их ширину и точность:

print("Робот №{r:4d} весит {w:6.2f}"
    .format(r = 1134, w = 112.5534))

Робот №1134 весит 112.55

Этот способ позволяет очень гибко форматировать вывод данных. Например, программист может передавать в строку данные из готового словаря:

data = dict(name ="Бендер", race ="Робот")
print("Это {name}, он - {race}".format(**data))

Это Бендер, он - Робот

Строковый метод

Вывод с помощью строкового метода формируется с использованием операций среза и методов строк. Для работы со строковым типом данных создано несколько методов, которые позволяют просто и изящно форматировать вывод, среди них методы: ljust(), rjust(), center().

centre()

Эта функция выравнивает строку по центру в соответствии с указанной шириной, заполняя недостающую ширину пробелами. Она имеет следующий синтаксис:

str.center(len, fillchr)

Здесь:

  • str — это строка, которую будем центрировать.
  • len – это ширина строки.
  • fillchr — символ, которым заполняется недостающее пространство (по умолчанию — пробел).

Пример:

text = "Этот текст расположен в центре"
print(text.center(50))

          Этот текст расположен в центре
Важно понимать, что функция располагает текст не в центре консоли, а в центре поля указанной ширины (в примере это 50 символов).

Если поменять символ заполнения, получится следующее:

text = "Этот текст расположен в центре"
print(text.center(50, "_"))

__________Этот текст расположен в центре__________

ljust()

Метод работает аналогично centre(), только выравнивает текст не по центру, а по левому краю. То есть недостающие символы дополняются не с двух сторон, а только с правой.

rjust()

Метод работает аналогично centre(), но выравнивает текст по правому краю. То есть символы дополняются только с левой стороны.

f-строки

Иногда нужно просто вставить значение переменной в какую-то часть строки. Можно воспользоваться одним из методов форматирования, строить длинные конструкции из комбинаций строк и имён переменных, соединённых запятыми (или «+»), например:

print("Мне", age, ", теперь я могу пойти в", place, "когда захочу")

Однако в Python версии 3.6 в язык был добавлен простой и удобный инструмент, который называется f-строка или интерполированная строка. С его помощью можно удобно вставлять переменные в любое место выводимой строки. Для этого используются фигурные скобки «{}», внутри которых указывается имя переменной, а перед строкой ставится символ «f». Пример:

name = "Боб"
age = 25
print(f"{name} сегодня празднует {age}-ый день рождения")

Боб сегодня празднует 25-ый день рождения

Поля заданной ширины

В приведённых выше примерах уже использовались инструменты для настройки ширины полей. Ширина поля вывода настраивается с помощью вставки численного значения между знаком «%» и типом вывода (например, «d»). То есть установка ширины поля выглядит так:

print("%6d %6d" % (6, 6))

     6      6

Установка ширины полей работает так:

  • Интерпретатор получает информацию о численном значении ширины вывода (в примере это «6»).
  • Затем он получает информацию о подставляемом значение, то есть считает, из скольки символов оно состоит (в примере это «1»).
  • Если количество символов в подставляемом значение меньше, чем ширина строки, при выводе в строку добавляются дополнительные пробелы, иначе значение просто выводится.
Поля заданной ширины жизненно необходимы для вывода в консоль таблиц или двумерных массивов. Из-за разной длинный элементов столбцы искривляются, что приводит к потери читаемости, однако если использовать поля заданной ширины, то пока длинны значений меньше, чем ширина поля, все они будут располагаться строго друг под другом.

Примеры

С помощью форматированного вывода можно полностью настроить любой вывод в консоль, например:

Вывод ошибки

Ниже пример обработки ошибки. Мы перехватываем исключение в блоке except и выводим сообщение о ней с помощью функции print.

try:
    for i in range(4):
        if (i == 3):
            i = text
        print(f"Попытка {i} прошла успешно")
except Exception as err:
    print("Возникла ошибка: \"{}\"".format(err))

Попытка 0 прошла успешно
Попытка 1 прошла успешно
Попытка 2 прошла успешно
Возникла ошибка: "name 'text' is not defined"

Вывод списка

Ниже пример того как выводится список в одну строку:

a = ['python', 3, 'лучший', 'язык', 'программирования']
for val in a:
    print(val, end=' ')

python 3 лучший язык программирования

Если нужно перечислить элементы списка в столбик с указанием порядковых номеров, то это можно сделать следующим образом:

mylist = ["кот", "собака", "крот", "ёж"]
for i, x in enumerate(mylist):
    print("{a:d} : {b:6s}".format(a = i + 1, b = x))

1 : кот   
2 : собака
3 : крот
4 : ёж

Вывод массива

Здесь выводим массив построчно с указанием номеров элементов.

from array import *
arr = array('i', [1,3,6,2,5])
for i in range(len(arr)):
    print("%d-й элемент массива = %d" %(i, arr[i]))

0-й элемент массива = 1
1-й элемент массива = 3
2-й элемент массива = 6
3-й элемент массива = 2
4-й элемент массива = 5

Вывод словаря

Здесь приведём два варианта для словарей.

Простой вариант:

a = {1: "one", 2: "two", 3: "three"}
for key, value in a.items():
  print("{0}: {1}".format(key,value))

1: one
2: two
3: three

В виде таблицы:

arr = {"Один": "one", "Два": "two", "Три": "three"}
print(" _________________ ")
print("|  Rus   :  Eng   |")
print("|-----------------|")
for key, value in arr.items():
    print("|  {r:5s} :  {w:5s} |".format(r = key, w = value))
print("|-----------------|")

 _________________
|  Rus   :  Eng   |
|-----------------|
|  Один  :  one   |
|  Два   :  two   |
|  Три   :  three |
|-----------------|

Вывод матрицы

Сложность в выводе матрицы состоит в том, что из-за разных длин чисел элементы столбца будут стоять не друг под другом, а со смещением. С помощью форматирования можно решить эту проблему.

mtx = [[  2, 4, 12],
       [ -6, 3,  9],
       [334, 0, 11]]
for row in mtx:
    for x in row:
        print("%3d" %(x), end = " ")
    print()

  2   4  12 
 -6   3   9
334   0  11

Здесь мы создали матрицу в виде двумерных списков, но если вы работаете с матрицами с помощью библиотеки NumPy, то там вывод в консоль форматируется автоматически.