Рубрики
Без рубрики

Форматирование строки Python: Как стать мастером строки с помощью мини-языка Спецификации формата

Python предоставляет фантастические варианты форматирования строк, но что, если вам нужно больше контроля над тем, как представлены значения? Вот где приходят спецификаторы формата. Эта статья начинается с краткого обзора различных подходов форматирования строк. Затем мы погрузимся прямо в некоторые примеры, чтобы соединить свой аппетит для использования в мини-языке «Спецификация формата Python» в … Python String Форматирование: Как стать мастером строки с помощью мини-языка Спецификации формата ».

Автор оригинала: Jonathan Boland.

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

Эта статья начинается с краткого Обзор различных подходов форматирования строк . Затем мы погрузимся прямо в некоторые примеры, чтобы соединить свой аппетит для использования Спецификация формата Python Mini-language В вашем Собственные проекты Отказ

Но раньше все это – давайте поиграм со строкой форматирование себя в Interactive Python Shell. :

Упражнение : Создайте другую переменную налог и рассчитать сумму налога, которую необходимо оплатить на ваш доход (30%). Теперь добавьте оба значения доход а также налог в строке – с помощью формата спецификатор %s !

Не волнуйтесь, если вы боретесь с этим упражнением. Прочитав этот учебник, вы не будете! Давайте узнаем все, что вам нужно знать, чтобы начать работу с форматирование строк в Python.

Параметры форматирования строки

Инструменты форматирования строки Python значительно развивались за эти годы.

Самый старый подход – использовать % Оператор:

>>> number = 1 + 2
>>> 'The magic number is %s' % number
'The magic number is 3'

(Приведенный выше фрагмент кода уже включает в себя вид спецификатора формата. Больше на этом позже …)

str.format () Затем добавил метод:

>>> 'The magic number is {}'.format(number)
'The magic number is 3'

Совсем недавно были введены отформатированные строковые литералы (иначе известные как F-strings ). F-strings легче использовать и привести к более чистому коду, потому что их синтаксис позволяет разместить значение выражения непосредственно внутри строки:

>>> f'The magic number is {number}'
'The magic number is 3'

Другие варианты включают создание строк шаблонов, импортируя класс шаблона из строкового модуля Python или вручную форматирования строк (которые мы начнем на следующем разделе).

Если это все довольно новое для вас, и еще более подробно было бы полезно, прежде чем двигаться дальше, может быть найдено углубленное объяснение основных подходов форматирования строк здесь Отказ

Формат спецификатов

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

F-strings – самый четкий и самый быстрый подход к форматированию строки Поэтому я буду использовать их, чтобы проиллюстрировать использование спецификаторов формата на протяжении всей этой статьи. Пожалуйста, имейте в виду, однако, что спецификаторы также могут быть использованы с str.format () метод. Кроме того, строки с использованием старого % Оператор на самом деле требует своего рода спецификации формата – например, в % s Пример, показанный в предыдущем разделе буква S Известен как тип преобразования, и он указывает на то, что следует использовать стандартное представление строки объекта.

Итак, какие именно являются спецификаторы формата и какие параметры они предоставляют?

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

Процентный формат и другие типы

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

>>> asia_population = 4_647_000_000
>>> world_population = 7_807_000_000
>>> percent = asia_population / world_population
>>> f'Proportion of global population living in Asia: {percent:.0%}'
'Proportion of global population living in Asia: 60%'

Что тут происходит? Как было достигнуто это форматирование?

Ну, первое, что нужно отметить, что толстая кишка : непосредственно после переменной процента встроена в F-строку. Эта толстая кишка говорит Python, что следует, что является спецификатор формата, который следует применять к значению этого выражения.

% Символ определяет, что значение следует обрабатывать в процентах, а .0 указывает на уровень точности, который следует использовать для его отображения. В этом случае процент был округнул до целого числа, но если .1 был указан вместо этого значение, было бы округлено до одного десятичного времени и отображается как 59,5%; Использование .2 привело бы к 59,52% и так далее.

Если спецификатор формата не был включен в эксплуатацию во все, что значение было бы отображено как 0.5952350454720123, который слишком точен!

(Символ%, применяемый в этом контексте, не следует путать с оператором%, используемым в синтаксисе форматирования строки старого стиля.)

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

Например, вы можете отображать целые числа в двоичных, восьмеричных или шестнадцатеричных форматах с использованием значений типа B, O и X соответственно:

>>> binary, octal, hexadecimal = [90, 90, 90]
>>> f'{binary:b} - {octal:o} - {hexadecimal:x}'
'1011010 - 132 - 5a'

Для полного списка вариантов см. Ссылку на соответствующую область официальной документации Python в Дальнейшее чтение раздел в конце статьи.

Формат ширины, выравнивание и заполнение

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

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

>>> python, java, p_num, j_num = ["Python Users", "Java Users", 8.2, 7.5]
>>> print(f"|{python}|{java}|\n|{p_num}|{j_num}|")
|Python Users|Java Users|
|8.2|7.5|

Не отлично, но с включением некоторых ценностей ширины имеет значение начать улучшаться:

>>> print(f"|{python:16}|{java:16}|\n|{p_num:16}|{j_num:16}|")
|Python Users    |Java Users      |
|             8.2|             7.5|

Как видите, ширина указывается путем добавления номера после колонны.

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

Ну, на самом деле это связано с подходом по умолчанию Python для разных типов данных. Строконные значения выровнены на левую в стандартную стандартную, в то время как числовые значения выровнены вправо. (Это может показаться незначительным, но это соответствует подходу, взятому Microsoft Excel и другими пакетами электронных таблиц.)

К счастью, вам не нужно соглашаться на настройки по умолчанию. Если вы хотите изменить это поведение, вы можете использовать один из вариантов выравнивания. Например, сосредоточиться на первом столбце только сейчас для простоты, если мы хотим выровнять номер слева, это можно сделать, добавив < Символ до P_num Значение ширины переменной:

>>> print(f"|{python:16}|\n|{p_num:<16}|")
|Python Users    |
|8.2             |

И обратное может быть так же легко достичь, добавив > Символ перед спецификатором ширины, связанный с значением заголовка:

>>> print(f"|{python:>16}|\n|{p_num:16}|")
|    Python Users|
|             8.2|

Но что, если вы хотите, чтобы строки были сосредоточены? К счастью, Питона тоже охватил этот фронт. Все, что вам нужно сделать, это использовать ^ Символ вместо этого:

>>> print(f"|{python:^16}|\n|{p_num:^16}|")
|  Python Users  |
|      8.2       |

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

>>> print(f"|{python:_^16}|\n|{p_num:^16}|")
|__Python Users__|
|      8.2       |

Стоит отметить, что тот же выход может быть достигнут вручную, используя str () Функция наряду с соответствующим методом строки (в этом случае Str.Center () ):

>>> print("|", python.center(16, "_"), "|\n|", str(p_num).center(16), "|", sep="")
|__Python Users__|
|      8.2       |

Но подход F-String гораздо более кратко и значительно быстрее оценивает во время выполнения.

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

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

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

24-часовой часовой дисплей

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

>>> hours = 54
>>> minutes = 128
>>> quotient, minute = divmod(minutes, 60)
>>> hour = (hours + quotient) % 24
>>> f'{hour}:{minute}'
'8:8'

Все идет нормально. Наша программа правильно говорит нам, что через 54 часа и 128 минут время суток будет 8 минут до 8 часов утра, но проблема в том, что это не очень легко читать. Путаница может возникнуть в отношении того, на самом деле это на самом деле 8 часов утра или вечером и имеет одну цифру для представления количества минут, просто выглядит нечетным.

Чтобы исправить это, нам нужно вставить ведущие нули, когда час или минутное значение является одной цифрой, которая может быть достигнута с использованием чего-то, называемого нулевой прокладкой знака. Это звучит довольно сложно, но по сути нам просто нужно использовать 0 вместо одного из ценностей выравнивания, которые мы видели ранее при определении F-String, а также значение ширины 2:

>>> f'{hour:02}:{minute:02}'
'08:08'

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

>>> hours = 47
>>> minutes = 59
...
>>> f'{hour:02}:{minute:02}'
'23:59'

Варианты группировки

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

>>> proxima_centauri = 40208000000000
>>> f'The closest star to our own is {proxima_centauri:,} km away.'
'The closest star to our own is 40,208,000,000,000 km away.'

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

>>> f'The closest star to our own is {proxima_centauri:_} km away.'
'The closest star to our own is 40_208_000_000_000 km away.'

Положить все это вместе

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

Пребывание с астрономической темой, для демонстрационных целей мы покажем расстояние между Солнцем и Нептуном в миллионах километров:

>>> neptune = "Neptune"
>>> n_dist = 4_498_252_900 / 1_000_000
>>> print(f"|{neptune:^15}|\n|{n_dist:~^15,.1f}|")
|    Neptune    |
|~~~~4,498.3~~~~|

Как видите, чтение справа налево нам нужно разместить значения спецификации формата N_Dist в следующем порядке:

  1. Тип – F Определяет, что значение должно отображаться с использованием записи фиксированной точки
  2. Точность – .1 указывает на то, что одно десятичное время следует использовать
  3. Группировка – обозначает, что запятая должна использоваться как тысяча сепаратора
  4. Ширина – 15 устанавливается как минимальное количество символов
  5. Выровнять – ^ Определяет, что значение должно быть центрировано
  6. Заполнить – ~ указывает на то, что тильду должен занимать любое неиспользованное пространство

В целом, значения формата, которые не требуются, могут просто быть опущены. Однако, если значение заполнения указывается без соответствующего варианта выравнивания, ValueError будет поднять.

Окончательные мысли и дальше Чтение

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

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

Если вы хотите работать и отображать большие объемы данных в формате таблицы, хотя, вы бы хорошо, чтобы проверить отличные инструменты, предоставляемые библиотекой Pandas, которые вы можете прочитать в этих стаях Finxter.

Кроме того, если вы хотите увидеть полный список доступных значений спецификации формата, их можно найти в этом разделе Официальная документация Python Отказ

Лучший способ по-настоящему понять, как работают спецификаторы формата, чтобы сделать некоторые эксперименты с ними самостоятельно. Дайте это попробовать – я уверен, что вам повеселись по пути!

Оригинал: “https://blog.finxter.com/python-strings-format-specification-mini-language/”