Что найти?

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

/
/

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

Выполнение четырех техник форматирования строк

Начнем с наиболее часто встречающегося метода, использующего оператор %. Я говорю «самый распространенный» просто потому, что он существует дольше всех и вы видите его повсюду (книги, сообщения в блогах, переполнение стека и т.д.). Чтобы использовать этот метод, вы указываете заполнитель в строке, используя %s для строк и %d для чисел.

>>> "Hello reader, welcome to the %s form of string formatting." % 'modulus'
'Hello reader, welcome to the modulus form of string formatting.'
>>>
>>> "Formatting multiple (%d, %d, %d, ...) values requires a %s." % (1, 2, 3, 'tuple')
'Formatting multiple (1, 2, 3, ...) values requires a tuple.'
>>>
>>> print("""If you prefer named placeholders for values %(one)d, %(two)d,
... %(three)d ... you can use a dict""" % {'one':1, 'two':2, 'three':3})
If you prefer named placeholders for values 1, 2,
3 ... you can use a dict

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

>>> "Hello reader, welcome to the {} form of string formatting".format('str.format(...)')
'Hello reader, welcome to the str.format(...) form of string formatting'
>>>
>>> print("""Formatting multiple ({0}, {1}, {2}, ...) values requires  
... that you use multiple {3} brackets and optionally specify ordering
... values.""".format(1,2,3,'{}'))
Formatting multiple (1, 2, 3, ...) values requires  
that you use multiple {} brackets and optionally specify ordering
values.
>>>
>>> print("""The {language} str.format() method also allows you to use
... named parameters which help keep code {adjective}
... """.format(language='Python', adjective='concise'))
The Python str.format() method also allows you to use
named parameters which help keep code concise

Затем есть метод строкового шаблона, который представляет собой класс в строковом модуле. Этот метод форматирования строк более подробный и не поддерживает спецификаторы типа (s, d, f и т.д.), в отличие от двух предыдущих.

С помощью этого метода вы указываете заполнитель в строке, добавляя к желаемому значению префикс $ в конструкторе класса Template (…), а затем вызываете метод replace (…) для созданного объекта с именованным параметром. Этот метод гораздо менее распространен из-за его меньшей мощности и гибкости.

>>> from string import Template
>>> tmpl = Template("Hello my name is $name")
>>> tmpl.substitute(name='Adam')
'Hello my name is Adam'

Последний метод и самая последняя реализация, доступная только в Python 3.6, известна как интерполяция строк. Это имеет сходство со строкой шаблона Javascript ES6.

Строковая интерполяция требует, чтобы строковый литерал имел префикс f «», и позволяет указывать как выражения, так и переменные непосредственно внутри строки, если они заключены в квадратные скобки {}.

>>> method="String Interpolation"
>>> f"Hello reader, I am the {method} of formatting"
'Hello reader, I am the String Interpolation of formatting'
>>>
>>> f"With this method you can have expressions like {{1 + 1}} = {1 + 1}"
'With this method you can have expressions like {1 + 1} = 2'

Углубляемся в форматирование строк

В следующих разделах я собираюсь ограничить обсуждение только методом str.format() и техникой f «» интерполяции, поскольку они являются предпочтительными методами форматирования строк. Темы, в которые я хотел бы углубиться, включают:

  1. Выравнивание текста.
  2. Форматирование чисел.
  3. Преобразование типов.

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

Выравнивание текста

Вы можете выровнять значения в пределах указанной длины текста, используя символы <,> или ^, чтобы указать выравнивание по левому краю, выравнивание по правому краю или центрирование соответственно. Затем вы следуете этим символам с желаемой шириной символа.

Python >2.6:

>>> left_aligned = "Left Align"
>>> center = "Centered"
>>> right_aligned = "Right Align"
>>> "{left_aligned:<15}{center:^10}{right_aligned:>15}".format(
...     left_aligned=left_aligned,
...     center=center,
...     right_aligned=right_aligned)
'Left Align      Centered     Right Align'

Вы также можете указать порядковые номера, а не ключевые слова.

>>> "{1:<15}{0:^10}{2:>15}".format(center, left_aligned, right_aligned)
'Left Align      Centered     Right Align'

Или вы можете опустить их, если порядок форматируемых параметров (…) совпадает с порядком {}.

>>> "{:<15}{:^10}{:>15}".format(left_aligned, center, right_aligned)
'Left Align      Centered     Right Align'

Python 3.6:

>>> f"{left_aligned:<15}{center:^10}{right_aligned:>15}"
'Left Align      Centered     Right Align'

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

Python >2.6:

>>> "{:><15}|{:-^10}|{:<>15}".format(left_aligned, center, right_aligned)
'Left Align>>>>>|-Centered-|<<<<Right Align'

Python 3.6:

>>> f"{left_aligned:><15}{center:-^10}{right_aligned:<>15}"
'Left Align>>>>>-Centered-<<<<Right Align'

Числа

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

Python> 2.6:

>>> rounded_pi = 3.14
>>> "A rounded representation of Pi {:f}".format(rounded_pi)
'A rounded representation of Pi 3.140000'

Python 3.6:

>>> f"A rounded representation of Pi {rounded_pi:f}"
'A rounded representation of Pi 3.140000'

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

Python >2.6:

>>> from math import pi
>>> pi
3.141592653589793
>>> "A rounded representation of Pi {:f}".format(pi)
'A rounded representation of Pi 3.141593'

Python 3.6:

>>> f"A rounded representation of Pi {pi:f}"
'A rounded representation of Pi 3.141593'

Чтобы указать другую точность (количество десятичных знаков), просто поставьте перед f желаемое количество десятичных знаков.

Python >2.6:

>>> "A rounded representation of Pi {:.3f}".format(pi)
'A rounded representation of Pi 3.142'

Python 3.6:

>>> f"A rounded representation of Pi {pi:.3f}"
'A rounded representation of Pi 3.142'

Другой вариант форматирования чисел с плавающей запятой – спецификатор процентов. Это работает путем преобразования ожидаемой пропорции или отношения (0-1) в значение из 100 и обрабатывает оставшуюся десятичную часть аналогично спецификатору f с точностью по умолчанию, равной шести.

Python >2.6:

>>> receptions = 17
>>> passes = 29
>>> "The completion percentage is {:.2%}".format(receptions/passes)
'The completion percentage is 58.62%'

Python 3.6:

>>> f"The completion percentage is {receptions/passes:.2%}"
'The completion percentage is 58.62%'

Хорошо, так что это касается большинства случаев использования чисел с плавающей запятой, но как насчет больших чисел? Python также поддерживает их форматирование с помощью запятых для повышения удобочитаемости больших чисел. Чтобы воспользоваться этим, просто поместите a после двоеточия.

Python >2.6:

>>> house_price = 299999.99
>>> "The price of the house is ${:,}".format(house_price)
'The price of the house is $299,999.99'

Python 3.6:

>>> f"The price of the house is ${house_price:,}"
'The price of the house is $299,999.99'

Преобразования типов

Преобразование типов – это немного менее распространенный вариант использования, но время от времени они возникают. Основные преобразования типов для чисел следующие:

Преобразование Описание
b Двоичный
О Восьмеричный
X Шестнадцатеричный
d Десятичная дробь

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

Python >2.6:

>>> number = 157
>>> print("Binary: {:b}\nOctal {:o}\nHexadecimal: {:x}\nDecimal: {:d}".format(
...     number,
...     number,
...     number,
...     number))
Binary: 10011101
Octal 235
Hexadecimal: 9d
Decimal: 157

Python 3.6:

>>> print(f"Binary: {number:b}\nOctal {number:o}\nHexadecimal: {number:x}\nDecimal: {number:d}")
Binary: 10011101
Octal 235
Hexadecimal: 9d
Decimal: 157

Моя цель состояла в том, чтобы дать базовое объяснение синтаксиса форматирования строк и методов реализации.

Оставить комментарий

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

This div height required for enabling the sticky sidebar