Вступление
Метод + 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 +
, чтобы добавить десятичные знаки, изменить поле имя индекса и многое другое, чтобы гарантировать, что мы отображаем данные, как мы хотели бы.
Заключение
Использование средств форматирования для подстановки переменных может быть эффективным способом объединения строк и организации значений и данных. Форматтеры представляют собой простой, но не описательный способ передачи подстановок переменных в строку и полезны для того, чтобы убедиться, что вывод читабелен и удобен для пользователя.