Форматирование строк в Python 3

Published by Leave your thoughts

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

Данное руководство охватывает основные методы форматирования строк в Python.

Метод format

Метод форматирования str.format() добавляют в строку один или несколько заполнителей, которые определяются фигурными скобками ({}). Вы можете передать методу любое значение, которое необходимо вставить в строку. При запуске программы это значение будет добавлено в строку в то место, где находятся фигурные скобки.

Например:

print("I have {} apples.".format(5))
I have 5 apples.

В приведённой выше строке используются фигурные скобки:

"I have {} apples."

Метод str.format() имеет значение 5. Он вставит это значение в предложенную строку на место фигурных скобок.

I have 5 apples.

Также можно сохранить строку с заменителем в переменной:

apple_string = "I have {}."
print(apple_string.format("5 apples"))
I have 5 apples.

Теперь метод format вставил на место заменителя строку «5 apples».

Множественная замена

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

new_apple_string = "I love {} {}."                 #2 {} заменителя
print(new_apple_string.format("red", "apples"))    #Значения нужно разделить запятой
I love red apples.

Метод str.format() может передавать несколько строк; для этого нужно разделить их запятыми, как показано в примере выше.

Попробуйте добавить в строку ещё несколько заменителей:

my_string = "I love {} {}, and have {} {}."               #4 {} заменителя
print(my_string.format("red", " apples", 5, "apples"))    #4 строки в методе
I love red apples, and have 5 apples.

Позиционные и именованные аргументы

Если фигурные скобки передаются без каких-либо параметров, Python вставит значения, переданные с помощью метода str.format (), по порядку, как это было в предыдущих примерах. Рассмотрим ещё один пример:

print("My friend {} has a pet {}!".format("Sam", " winged dinosaur"))
My friend Sam has a pet winged dinosaur!

Первая пара фигурных скобок заменяется первым значением метода, вторая пара – вторым значением. Значения метода выглядят так:

("Sam", " winged dinosaur")

Эти данные являются кортежем. Любое значение кортежа можно вызвать с помощью индекса – порядкового номера (начиная с 0).

Читайте также: Типы данных в Python 3

Вы можете использовать эти индексы внутри фигурных скобок:

print("My friend {0} has a pet {1}!".format("Sam", " winged dinosaur"))

Это вернёт такой же результат:

My friend Sam has a pet winged dinosaur!

А теперь попробуйте поменять индексы местами:

print("My friend {1} has a pet {0}!".format("Sam", " winged dinosaur"))
My friend winged dinosaur has a pet Sam!

Если вы вызовете значение с индексом 2, а в методе значения с таким индексом нет, программа вернёт ошибку. Например:

print("My friend {2} has a pet {1}!".format("Sam", " winged dinosaur"))
IndexError: tuple index out of range

Это значит, что запрашиваемый индекс находится вне диапазона кортежа (в данном случае это числа между 0 и 1).

Добавьте ещё несколько заполнителей и значений, например:

print("Tom is a {}, {}, and {} {}!".format("happy", "smiling", "tall", "man"))
Tom is a happy, smiling, and tall man!

Без дополнительных параметров метод str.format() вставит значения по порядку.

Значения кортежа имеют следующие индексы:

«happy» «smiling» «tall» «man»
0 1 2 3

Попробуйте изменить порядок внесения значений в строку с помощью индексов:

print("Tom is a {3}, {2}, and {1} {0}!".format("happy", "smiling", "tall", "man"))
Tom is a man, tall, and smiling happy!

Теперь метод format добавил значения в обратном порядке (согласно указанным индексам).

Кроме позиционных аргументов существуют также именованные аргументы. Эти аргументы можно вызвать по имени. Например:

print("Tom {0} {1} a {pr}.".format("has", "made", pr = "pull request"))
Tom has made a pull request.

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

print("Tom {pr} {1} a {0}.".format("has", "made", pr = "pull request"))
Tom pull request made a has.

Типы

В фигурные скобки можно добавить больше параметров. Попробуйте использовать синтаксис {field_name:conversion}, где field_name задаёт индекс аргумента метода str.format(), а conversion – тип данных с помощью односимвольного кода, который использует Python. Здесь мы используем такой код:

  • s – строки (string)
  • d – десятичные числа (decimal)
  • f – число с плавающей точкой (float)

Читайте также: Официальная документация Python.

Попробуйте передать с помощью метода целое число как число с плавающей точкой, добавив тип f.

print("Sam ate {0:f} percent of a {1}!".format(75, "pizza"))
Sam ate 75.000000 percent of a pizza!

В первых фигурных скобках был использован синтаксис {field_name:conversion}, в остальных заполнителях используется только номер индекса.

Вы можете ограничить количество нулей после точки. Указывая тип f, вы можете дополнительно задать точность значения; для этого добавьте точку, затем укажите количество цифр, которое должно идти после запятой, а затем – сам тип.

Рассмотрим такой пример:

print("Sam ate {0:.3f} percent of a pizza!".format(75.765367))
Sam ate 75.765 percent of a pizza!

Как видите, несмотря на то, что в значении после точки идёт 6 символов, в строке отображается только три символа.

Попробуйте уменьшить количество символов после точки до одного.

print("Sam ate {0:.1f} percent of a pizza!".format(75.765367))
Sam ate 75.8 percent of a pizza!

Метод format округлит число до 75.8.

Попробуйте изменить тип данных на десятичные числа:

print("Sam ate {0:.d} percent of a pizza!".format(75.765367))
ValueError: Unknown format code 'd' for object of type 'float'

Чтобы вывести только целое число и опустить все символы после точки, используйте:

print("Sam ate {0:.0f} percent of a pizza!".format(75.765367))
Sam ate 76 percent of a pizza!

При этом число с плавающей точкой не станет целым числом.

Отступы в переменных

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

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

print("Tom has {0:4} red {1:10}!".format(5, "apples"))
Sammy has    5 red apples    !

По умолчанию строки выравниваются внутри поля по левому краю, а числа – по правому краю. Это можно изменить с помощью символов:

  • < — выравнивание по левому краю;
  • ^ — выравнивание по центру;
  • > — выравнивание по правому краю.

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

print("Tom has {0:<4} red {1:^10}!".format(5, "apples"))
Sammy has 5    red   apples  !

По умолчанию Python заполняет свободное пространство внутри поля пробелами. Вы можете выбрать другой символ для заполнения. Его нужно указать сразу после двоеточия. Например:

print("{:*^20s}".format("Hallo"))
******* Hallo********

Эти параметры можно комбинировать с другими параметрами, например:

print("Sam ate {0:5.0f} percent of a pizza!".format(75.765367))
Sam ate    76 percent of a pizza!

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

Переменные

Теперь вы умеете передавать методу str.format() целые числа, числа с плавающей точкой и строки.

Кроме того, метод str.format() может работать с переменными.

Рассмотрим такой пример:

nApples = 8
print("Tommy has {} apples today!".format(nApples))
Tommy has 8 apples today!

Переменную можно использовать и вместо исходной строки, например:

tommy = "Tommy has {} apples today!"
nApples = 8
print(tommy.format(nApples))
Tommy has 8 apples today!

Переменными можно заменить любую часть синтаксиса. Это упрощает работу с пользовательскими входными данными.

Организация данных

Функции форматирования позволяют структурировать большое количество данных. Чтобы сделать вывод удобочитаемым, можно увеличить размер поля и изменить выравнивание.

Рассмотрим типичный пример Python, который выведет число «i», «i*i» и «i*i*i» в диапазоне от 3 до 12:

for i in range(3,13):
print(i, i*i, i*i*i)
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
11 121 1331
12 144 1728

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

Попробуйте отформатировать его:

for i in range(3,13):
print("{:3d} {:4d} {:5d}".format(i, i*i, i*i*i))

В данном случае фигурные скобки не содержат индекса. После двоеточия сразу идёт размер поля, затем тип данных (d). Таким образом, в каждом столбце окажется минимум один свободный символ.

3    9    27
4   16    64
5   25   125
6   36   216
7   49   343
8   64   512
9   81   729
10  100  1000
11  121  1331
12  144  1728

Также можно задать одинаковое количество символов в каждом столбце.

for i in range(3,13):
print("{:6d} {:6d} {:6d}".format(i, i*i, i*i*i))
3      9     27
4     16     64
5     25    125
6     36    216
7     49    343
8     64    512
9     81    729
10    100   1000
11    121   1331
12    144   1728

Также вы можете изменять выравнивание с помощью символов <, ^ и >, изменять тип данных, добавлять индексы.

Заключение

Форматирование в Python – это удобный и эффективный способ объединения строк и визуальной организации данных. Методы форматирования довольно просты, но их синтаксис не всегда очевиден. Тем не менее, с их помощью вы можете передавать переменные в строку и сделать вывод удобочитаемым.

Tags:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>