Как использовать String Formatters в Python 3

Вступление

Метод + str.format () + Python класса string позволяет вам выполнять https: // www.digitalocean.com/community/tutorials/how-to-use-variables-in-python-3[variable] замены и форматирование значений. Это позволяет вам concatenate элементы вместе в строке посредством позиционного форматирования.

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

Использование форматеров

Форматеры работают, помещая одно или несколько * замещающих полей * или заполнителей - определенных парой фигурных скобок + {} + - в строку и вызывая метод + str.format () +. Вы передадите в метод значение, которое хотите объединить со строкой. Это значение будет передано в том же месте, где находится ваш заполнитель при запуске программы.

Давайте распечатаем строку, которая использует форматтер:

print("Sammy has {} balloons.".format(5))
OutputSammy has 5 balloons.

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

"Sammy has {} balloons."

Затем мы добавили метод + str.format () + и передали значение целого числа + 5 + этому методу. Это помещает значение + 5 + в строку, где были фигурные скобки:

Sammy has 5 balloons.

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

open_string = "Sammy loves {}."
print(open_string.format("open source"))
OutputSammy loves open source.

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

Форматтеры в Python позволяют использовать фигурные скобки в качестве заполнителей для значений, которые вы передадите с помощью метода + str.format () +.

Использование форматеров с несколькими заполнителями

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

new_open_string = "Sammy loves {} {}."                      #2 {} placeholders
print(new_open_string.format("open-source", "software"))    #Pass 2 strings into method, separated by a comma
OutputSammy loves open-source software.

Чтобы добавить другую замену, мы добавили вторую пару фигурных скобок в исходную строку. Затем мы передали две строки в метод + str.format () +, разделяя их запятой.

Следуя тому же синтаксису, мы можем добавить дополнительные замены:

sammy_string = "Sammy loves {} {}, and has {} {}."                      #4 {} placeholders
print(sammy_string.format("open-source", "software", 5, "balloons"))    #Pass 4 strings into method
OutputSammy loves open-source software, and has 5 balloons.

В + sammy_string + мы добавили 4 пары фигурных скобок в качестве заполнителей для подстановки переменных. Затем мы передали 4 значения в метод + str.format () +, смешивая строковые и целочисленные типы данных. Каждое из этих значений разделено запятой.

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

Когда мы оставляем фигурные скобки пустыми без каких-либо параметров, Python заменяет значения, передаваемые методом + str.format () +, по порядку. Как мы уже видели, конструкция форматера с двумя пустыми фигурными скобками и двумя пропущенными значениями будет выглядеть так:

print("Sammy the {} has a pet {}!".format("shark", "pilot fish"))
OutputSammy the shark has a pet pilot fish!

Первая пара фигурных скобок заменяется строковым значением " shark ", а вторая пара заменяется строковым значением " pilot fish ".

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

("shark", "pilot fish")

По сути, они являются типом данных tuple, и ​​каждое отдельное значение, содержащееся в кортеже, может вызываться по его порядковому номеру, который начинается с индексом 0.

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

print("Sammy the {0} has a pet {1}!".format("shark", "pilot fish"))

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

OutputSammy the shark has a pet pilot fish!

Но, если мы поменяем номера индексов с параметрами заполнителей, мы можем поменять значения, передаваемые в строку:

print("Sammy the {1} has a pet {0}!".format("shark", "pilot fish"))
OutputSammy the pilot fish has a pet shark!

Если вы вызываете индексный номер 2 в кортеже со значениями в позициях индекса 0 и 1, то вы вызываете значение, выходящее за пределы диапазона. Когда вы звоните по номеру индекса, выходящему за пределы диапазона, вы получите сообщение об ошибке:

print("Sammy the {2} has a pet {1}!".format("shark", "pilot fish"))
OutputIndexError: tuple index out of range

Сообщение об ошибке, которое мы видим, относится к кортежу, имеющему только значения с номерами индексов 0 и 1, поэтому номер индекса 2 выходит за пределы диапазона.

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

print("Sammy is a {}, {}, and {} {}!".format("happy", "smiling", "blue", "shark"))
OutputSammy is a happy, smiling and blue shark!

Без параметров значения, которые передаются в метод + str.format () +, объединяются в строку по порядку.

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

“happy” “smiling” “blue” “shark”

0

1

2

3

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

print("Sammy is a {3}, {2}, and {1} {0}!".format("happy", "smiling", "blue", "shark"))
OutputSammy is a shark, blue, and smiling happy!

Поскольку мы начали с индекса № 3, мы сначала назвали последнее значение " акула ". Другие номера индексов, включенные в качестве параметров, изменяют порядок отображения слов в исходной строке.

В дополнение к позиционным аргументам мы также можем ввести ключевые аргументы, которые вызываются по имени ключевого слова:

print("Sammy the {0} {1} a {pr}.".format("shark", "made", pr = "pull request"))
OutputSammy the shark made a pull request.

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

print("Sammy the {pr} {1} a {0}.".format("shark", "made", pr = "pull request"))
OutputSammy the pull request made a shark.

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

Указание типа

Мы можем включить больше параметров в фигурные скобки нашего синтаксиса. Мы будем использовать синтаксис кода формата + {field_name: преобразование} +, где + field_name + указывает порядковый номер аргумента для метода + str.format () +, который мы прошли в https: //www.digitalocean.com/community/tutorials/how-to-use-string-formatters-in-python-3#reordering-formatters-with-positional-and-keyword-arguments[reordering section] и `+ преобразование + `относится к коду преобразования типа данных, который вы используете с форматером.

Тип преобразования относится к односимвольному коду, который использует Python. Коды, которые мы будем здесь использовать, это + s + для строки, + d + для отображения десятичных целых чисел (10-значный) и + f +, которые мы будем использовать для отображения чисел с плавающей запятой с десятичными знаками. Вы можете прочитать больше о Format-Specification Mini-Language через официальную документацию Python 3.

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

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

Мы использовали синтаксис + {имя_поля: преобразование} + для первого поля замены фигурных скобок для вывода числа с плавающей запятой. Во вторых фигурных скобках используется только первый параметр + {field_name} +.

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

Если Сэмми съел 75,765367% пиццы, но нам не нужен высокий уровень точности, мы можем ограничить количество мест после десятичной точки до 3, добавив + .3 + перед типом преобразования + f +:

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

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

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

Обратите внимание, что изменение точности приведет к округлению числа.

Хотя мы отображаем число без десятичных разрядов как число с плавающей точкой, если мы попытаемся изменить число с плавающей точкой на целое число, используя тип преобразования + d +, мы получим ошибку:

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

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

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

Это не будет convert ваш float в целое число, но вместо этого ограничит количество мест, показанных после десятичной точки.

Замены переменных заполнения

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

Мы можем добавить число для обозначения размера поля (в терминах символов) после двоеточия +: + в фигурных скобках нашего синтаксиса:

print("Sammy has {0:4} red {1:16}!".format(5, "balloons"))
OutputSammy has    5 red balloons        !

В приведенном выше примере у нас есть число + 5 + размер символьного поля 4, а строка + выноски для` символьного поля размером 16 (потому что это длинная строка).

Как мы видим, по умолчанию строки выравниваются по левому краю поля, а числа - по правому краю. Вы можете изменить это, поместив код выравнивания сразу после двоеточия. + <+ выровняет текст в поле по левому краю, + ^ + будет центрировать текст в поле, а +> + выровнит его по правому краю.

Давайте выровняем число влево и отцентрируем строку:

print("Sammy has {0:<4} red {1:^16}!".format(5, "balloons"))
OutputSammy has 5    red     balloons    !

Теперь мы видим, что + 5 + выровнено по левому краю, обеспечивая пространство в поле перед + red +, а + balloonons + центрируется в его поле с пробелами слева и справа от него.

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

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

Мы принимаем строку, переданную в + str.format () + в позиции индекса 0, так как мы не указали иное, включая двоеточие, и указываем, что мы будем использовать + * + вместо пробела для заполнения вверх по полю. Мы центрируем строку с помощью + ^ +, указывая, что поле имеет размер 20 символов, а также указываем, что мы работаем с типом преобразования строки, включая + s +.

Мы можем объединить эти параметры с другими параметрами, которые мы использовали ранее:

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

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

Использование переменных

До сих пор мы передавали целые числа, числа с плавающей запятой и строки в метод + str.format () +, но мы также можем передавать переменные через метод. Это работает так же, как и любая другая переменная.

nBalloons = 8
print("Sammy has {} balloons today!".format(nBalloons))
OutputSammy has 8 balloons today!

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

sammy = "Sammy has {} balloons today!"
nBalloons = 8
print(sammy.format(nBalloons))
OutputSammy has 8 balloons today!

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

Использование средств форматирования для организации данных

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

Давайте посмотрим на типичный цикл for в Python, который выведет + i +, ` + i * i + и + i * i * i + `в диапазоне от 3 до 12:

for i in range(3,13):
   print(i, i*i, i*i*i)
Output3 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 +, так как мы работаем с целыми числами. В этом примере мы учитывали размер каждого ожидаемого вывода, предоставляя по 2 дополнительных символьных пространства для каждого, в зависимости от максимально возможного размера числа, поэтому наш вывод выглядит следующим образом:

Output  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))
Output     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

Мы также можем манипулировать выравниванием столбцов, добавив + <+, + ^ + и +> + для выравнивания текста, изменив + d + на + f +, чтобы добавить десятичные знаки, изменить поле имя индекса и многое другое, чтобы гарантировать, что мы отображаем данные, как мы хотели бы.

Заключение

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