Оператор за форматиране на низове – Оператор %

by Alex
String formatting operator - Operator %

Въпреки един от принципите на Python, който гласи: “Трябва да има един – и за предпочитане само един – очевиден начин да се направи нещо”, нашият любим език има цели четири начина за форматиране на низ. Това е начинът, по който това се е правело в миналото. Това е първият урок от поредица за форматиране на низове. Той включва:

  1. Изявление за форматиране на низ
  2. Метод Format()
  3. f-линии
  4. Шаблонни низове

В този урок ще се запознаем с оператора за форматиране на низове.

Какво представляват те?

Първоначално в Python имаше оператор за форматиране на низове, който имитираше функцията printf от езика C, на който е известно, че е написан самият Python. След това в Python 3.0 беше въведен методът format() за обработка на стрингове, който има по-широк и по-гъвкав синтаксис. Но този метод се оказа най-бавният. По-късно, във версия 3.6, бяха създадени f-линиите (PEP 498). Тяхната основна задача е да вграждат изрази в символни низове, като използват минимален синтаксис. Скоростта тук е на най-високо ниво за всички времена. Освен това в стандартната библиотека, в модула string, има клас Template, който реализира по-прост начин за форматиране на низове. Ако вземем за 100% продължителността на най-бавния начин (метод format()), тогава ще получим приблизително следното разпределение на скоростта:

  • Декларация за форматиране на низове – 82%
  • Метод Format() – 100%
  • f-линии – 47%

Синтаксис

Последователностите в Python съдържат уникална вградена операция, до която може да се достигне чрез оператора %. Операторът % по отношение на низове извършва операция по форматиране и вмъкване, така че обектът отдясно се вмъква по определени правила в низа отляво. Ако някога сте работили с функцията printf в езика C, веднага ще разберете как работи тя. Ето един прост пример:


print('2 * 2 = %s' % (2 * 2))
# Изход:
2 * 2 = 4

Е, нека преминем направо към неприятната част. Поведението на този оператор не винаги е очевидно:


print('2 * 2 = %s' % 2 * 2)
# Изход:
2 * 2 = 22 * 2 = 2

Както беше споменато по-горе, този начин на форматиране е дошъл в Python от езика C, а именно, той е пряка заемка от функцията printf(). Разбира се, вече има и по-удобни и по-бързи методи за форматиране; в някои ситуации обаче използването на оператора % може да се окаже по-удобно, отколкото използването на метода за форматиране на низове format(). Освен това е полезно да знаете за този метод, когато четете стари програми. Важно е да се разбере, че се форматират самите низове, а не изходните данни, както е в случая с функцията print(). На изхода се изпраща вече форматиран низ.

Задаване на точността на числа с дроби

Операторът за деление / връща реално число. Ако броят на цифрите е безкраен, Python ще го изведе като такъв:


print('5 / 3 =', 5 / 3)
# Изход:
5 / 3 = 1.6666666666666667

Обикновено е необходим само определен брой цифри. За целта в низа се записва комбинация от знаци, започваща с %. Числото след точката обозначава броя на цифрите след десетичната запетая. Символът f означава реалния тип данни float.


print("4 / 7 =", 4 / 7)
print("%.3f" % (4 / 7))
# Изходни данни:
4 / 7 = 0.5714285714285714
0.571

Скобите са задължителни, в противен случай операцията % се извършва преди /:


print("%.3f" % 4 / 7)
# Изходни данни:
Проследяване (последно извикване):
Файл "C:\Users\ivand\AppData\Roaming\JetBrains\PyCharm2021.2\scratches\scratch.py", ред 1, in
print("%.3f" % 4 / 7)
TypeError: неподдържан(и) тип(и) операнд(и) за /: 'str' и 'int'
Процесът завършва с код на изход 1

Операторът за форматиране на низове извършва закръгляне, а не орязване:


print('Закръгляне по 0.000005:',"%.5f" %(0.000005))
print("Закръгляне до 0.000004:","%.5f" %(0.000004))
# изход:
Закръгляне 0.000005: 0.00001
Закръгляне 0.000004: 0.00000

Извеждане на знаци по число


from random import randint
[print("%c" % randint(0, 9999), end='') for _ in range(10)]
# Изход:
ऍ ⍥ ನ ᇎ ᠏ ᖹ ڹ ⍠ එ

Извеждане на целочислени стойности

Ако вместо ‘c’ се използва ‘d’, ще се вмъкне самото цяло число:


from random import randint
[print("%d" % randint(0, 9999), end='') for _ in range(10)]
# Изход:
4113 1363 4474 1265 6116 6726 273 6761 2074 9782

Вмъкване в низ от стойности с речников ключ


print('%(15)s, %(second).5f' % {'15': 'XX', 'second': 0.5**1.12})
# Изходни данни:
XX, 0,46009

Извеждане на данни в полета с дадена ширина

Понякога данните не трябва да се извеждат с един интервал, а като таблица. С други думи, в полета с определена ширина, където ширината се измерва в знакови интервали. Нека вземем един пример. Да предположим, че трябва да отпечатаме числата от втория ред под числата от първия ред. Ако изпълним функцията print() по следния начин:


print(10, 235)
print(1000, 50)
# изход:
10 235
1000 50

За да направим изхода табличен, трябва да зададем ширината на полето:


print("%5d%7d" % (10, 235))
print("%5d%7d" % (1000, 50))
# Изходни данни:
10 235
1000 50

Тук форматите на данните и ширините на полетата са посочени в кавички. След знака % зад кавичките са данните, които ще бъдат заменени за всеки посочен формат. Ако броят на форматите не съвпада с броя на данните, ще се появи грешка. Форматите на данните могат да бъдат: d – цяло число, s – низ, f – реално число, c – символ. По подразбиране данните се подравняват от дясната страна на полето. За да ги подравните вляво, просто поставете знак минус пред числото, което обозначава ширината на полето. Пример:


print("%-5d%7d" % (10, 235))
print("%-5d%7d" % (1000, 50))
# Изходни данни:
10 235
1000 50

Списък с модификатори на формата

Флагове за преобразуване: За преобразуването на стойността ще се използва “алтернативна форма” (както е дефинирана по-долу). ‘0’ Преобразуването ще бъде допълнено с нули за числови стойности. ‘-‘ Преобразуваната стойност ще остане коригирана (анулира преобразуването “0”, ако са посочени и двете стойности). ‘ ‘ (интервал) Пред положително число (или празен ред), получено в резултат на преобразуването със знак, трябва да се остави интервал. ‘+’ Знакът (“+” или “-“) ще бъде поставен преди преобразуването (анулира знака “интервал”). Типове преобразувания: Стойност на преобразуването “d” Подписано цяло число Десетично число. ‘i’ Подписано цяло десетично число. ‘o’ Подписано октално число. ‘u’ Остарял тип – идентичен на ‘d’. ‘x’ Подписано шестнадесетично число (с малки букви). ‘X’ Подписано шестнадесетично число (малки букви). ‘e’ Експоненциален формат с плаваща запетая (малки букви). ‘E’ Експоненциален формат с плаваща запетая (големи букви). ‘f’ Десетичен формат с плаваща запетая. ‘F’ Десетичен формат с плаваща запетая. ‘g’ Формат с плаваща запетая. Използва експоненциален формат с малки букви, ако стойността е по-малка от -4 или не по-малка от точността, в противен случай използва десетичен формат. ‘G’ Формат с плаваща запетая. Използва експоненциален формат с главни букви, ако стойността е по-малка от -4 или не по-малка от точността, в противен случай десетичен формат. ‘c’ Единичен символ (приема цяло число или едносимволен низ). ‘r’ Низ (преобразува всеки обект на Python с repr()). ‘s’ Стринг (преобразува всеки обект на Python с функцията str()). ‘a’ String (преобразува всеки обект на Python с функцията ascii()). ‘%’ Не се преобразува никакъв аргумент, което води до символ ‘%’.

Related Posts

LEAVE A COMMENT