Форматирование строк в 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 «» интерполяции, поскольку они являются предпочтительными методами форматирования строк. Темы, в которые я хотел бы углубиться, включают:
- Выравнивание текста.
- Форматирование чисел.
- Преобразование типов.
И 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
Моя цель состояла в том, чтобы дать базовое объяснение синтаксиса форматирования строк и методов реализации.
Автор