Лучшие примеры форматирования строк в python

Производительность

F-строки не только гибкие, но и быстрые. И для сравнения производительности разных подходов к форматированию я подготовил два шаблона:

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

Финальная простая строка получается такой:

Сложная строка на выходе такая:

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

После недолгого тестирования я получил следующие результаты:

На простых примерах f-строки показывают самые лучшие результаты.На 25% быстрее %-форматирования и метода format().

Строковые функции, методы и операторы

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

Списки, так же как и строки могут «складываться» (соединяться) и «умножаться» (дублироваться):

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

Операторы и позволяют выяснить наличие или отсутствие в последовательности некоторого элемента:

С помощью оператора можно осуществлять перебор всех элементов любой последовательности в цикле :

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

Что бы посмотреть на список всех доступных строкам функций и методов достаточно передать функции какой-нибудь строковый объект:

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

Python F-Строки: Детали

На данный момент мы узнали почему f-строки так хороши, так что вам уже может быть интересно их попробовать в работе. Рассмотрим несколько деталей, которые нужно учитывать:

Кавычки

Вы можете использовать несколько типов кавычек внутри выражений. Убедитесь в том, что вы не используете один и тот же тип кавычек внутри и снаружи f-строки.

Этот код будет работать:

Python

print(f»{‘Eric Idle’}»)
# Вывод: ‘Eric Idle’

1
2

print(f»{‘Eric Idle’}»)

# Вывод: ‘Eric Idle’

И этот тоже:

Python

print(f'{«Eric Idle»}’)
# Вывод: ‘Eric Idle’

1
2

print(f'{«Eric Idle»}’)

# Вывод: ‘Eric Idle’

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

Python

print(f»»»Eric Idle»»»)
# Вывод: ‘Eric Idle’

1
2

print(f»»»Eric Idle»»»)

# Вывод: ‘Eric Idle’

Python

print(f»’Eric Idle»’)
# Вывод: ‘Eric Idle’

1
2

print(f»’Eric Idle»’)

# Вывод: ‘Eric Idle’

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

Python

print(f»The \»comedian\» is {name}, aged {age}.»)
# Вывод: ‘The «comedian» is Eric Idle, aged 74.’

1
2

print(f»The \»comedian\» is {name}, aged {age}.»)

# Вывод: ‘The «comedian» is Eric Idle, aged 74.’

Словари

Говоря о кавычках, будьте внимательны при работе со . Вы можете вставить значение словаря по его ключу, но сам ключ нужно вставлять в одиночные кавычки внутри f-строки. Сама же f-строка должна иметь двойные кавычки.

Вот так:

Python

comedian = {‘name’: ‘Eric Idle’, ‘age’: 74}

print(f»The comedian is {comedian}, aged {comedian}.»)
# Вывод: The comedian is Eric Idle, aged 74.

1
2
3
4

comedian={‘name»Eric Idle’,’age’74}

print(f»The comedian is {comedian}, aged {comedian}.»)

# Вывод: The comedian is Eric Idle, aged 74.

Обратите внимание на количество возможных проблем, если допустить ошибку в синтаксисе SyntaxError:

Python

>>> comedian = {‘name’: ‘Eric Idle’, ‘age’: 74}
>>> f’The comedian is {comedian}, aged {comedian}.’
File «<stdin>», line 1
f’The comedian is {comedian}, aged {comedian}.’
^
SyntaxError: invalid syntax

1
2
3
4
5
6

>>>comedian={‘name»Eric Idle’,’age’74}

>>>f’The comedian is {comedian}, aged {comedian}.’

File»<stdin>»,line1

f’The comedian is {comedian}, aged {comedian}.’

^

SyntaxErrorinvalid syntax

Если вы используете одиночные кавычки в ключах словаря и снаружи f-строк, тогда кавычка в начале ключа словаря будет интерпретирован как конец строки.

Скобки

Чтобы скобки появились в вашей строке, вам нужно использовать двойные скобки:

Python

print(f»{{74}}»)

# Вывод: ‘{ 74 }’

1
2
3

print(f»{{74}}»)

 
# Вывод: ‘{ 74 }’

Обратите внимание на то, что использование тройных скобок приведет к тому, что в строке будут только одинарные:

Python

print( f»{{{74}}}» )

# Вывод: ‘{ 74 }’

1
2
3

print(f»{{{74}}}»)

 
# Вывод: ‘{ 74 }’

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

Python

print(f»{{{{74}}}}»)

# Вывод: ‘{{74}}’

1
2
3

print(f»{{{{74}}}}»)

 
# Вывод: ‘{{74}}’

Бэкслеши

Как вы видели ранее, вы можете использовать бэкслеши в части строки f-string. Однако, вы не можете использовать бэкслеши в части выражения f-string:

Python

>>> f»{\»Eric Idle\»}»
File «<stdin>», line 1
f»{\»Eric Idle\»}»
^
SyntaxError: f-string expression part cannot include a backslash

1
2
3
4
5

>>>f»{\»Eric Idle\»}»

File»<stdin>»,line1

f»{\»Eric Idle\»}»

^

SyntaxErrorf-stringexpression part cannot includeabackslash

Вы можете проработать это, оценивая выражение заранее и используя результат в f-строк:

Python

name = «Eric Idle»
print(f»{name}»)

# Вывод: ‘Eric Idle’

1
2
3
4

name=»Eric Idle»

print(f»{name}»)

 
# Вывод: ‘Eric Idle’

Междустрочные комментарии

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

Python

>>> f»Eric is {2 * 37 #Oh my!}.»
File «<stdin>», line 1
f»Eric is {2 * 37 #Oh my!}.»
^
SyntaxError: f-string expression part cannot include ‘#’

1
2
3
4
5

>>>f»Eric is {2 * 37 #Oh my!}.»

File»<stdin>»,line1

f»Eric is {2 * 37 #Oh my!}.»

^

SyntaxErrorf-stringexpression part cannot include’#’

Как создать строку

Строки всегда создаются одним из трех способов. Вы можете использовать одинарные, двойные и тройные скобки. Давайте посмотрим

Python

my_string = «Добро пожаловать в Python!»
another_string = ‘Я новый текст тут…’

a_long_string = »’А это у нас
новая строка
в троичных скобках»’

1
2
3
4
5
6

my_string=»Добро пожаловать в Python!»

another_string=’Я новый текст тут…’

a_long_string=»’А это у нас

новая строка
в троичных скобках»’

Строка с тремя скобками может быть создана с использованием трех одинарных скобок или трех двойных скобок. Так или иначе, с их помощью программист может писать строки в нескольких линиях. Если вы впишете это, вы увидите, что выдача сохраняет разрыв строк. Если вам нужно использовать одинарные скобки в вашей строке, то впишите двойные скобки. Давайте посмотрим на пример:

Python

my_string = «I’m a Python programmer!»
otherString = ‘Слово «Python» обычно подразумевает змею’
tripleString = «»»В такой «строке» мы можем ‘использовать’ все.»»»

1
2
3

my_string=»I’m a Python programmer!»

otherString=’Слово «Python» обычно подразумевает змею’

tripleString=»»»В такой «строке» мы можем ‘использовать’ все.»»»

Данный код демонстрирует то, как вы можете вписать одинарные или двойные скобки в строку. Существует еще один способ создания строки, при помощи метода str. Как это работает:

Python

my_number = 123
my_string = str(my_number)

1
2

my_number=123

my_string=str(my_number)

Если вы впишете данный код в ваш интерпретатор, вы увидите, что вы изменили значение интегратора на строку и присвоили ее переменной my_string. Это называется кастинг, или конвертирование. Вы можете конвертировать некоторые типы данных в другие, например числа в строки. Но вы также заметите, что вы не всегда можете делать обратное, например, конвертировать строку вроде ‘ABC’ в целое число. Если вы сделаете это, то получите ошибку вроде той, что указана в этом примере:

Python

int(‘ABC’)

Traceback (most recent call last):
File «<string>», line 1, in <fragment>
ValueError: invalid literal for int() with base 10: ‘ABC’

1
2
3
4
5

int(‘ABC’)

Traceback(most recent call last)

File»<string>»,line1,in<fragment>

ValueErrorinvalid literal forint()withbase10’ABC’

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

Python

x = int(«123»)

1 x=int(«123»)

То все должно работать

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

Давайте попробуем сделать это и посмотрим, что получится:

Python

my_string = «abc»
my_string = «d»

Traceback (most recent call last):
File «<string>», line 1, in <fragment>
TypeError: ‘str’ object does not support item assignment

1
2
3
4
5
6

my_string=»abc»

my_string=»d»

Traceback(most recent call last)

File»<string>»,line1,in<fragment>

TypeError’str’objectdoes notsupport item assignment

Здесь мы пытаемся изменить первую букву с «а» на «d«, в итоге это привело к ошибке TypeError, которая не дает нам сделать это. Теперь вы можете подумать, что присвоение новой строке то же значение и есть изменение строки. Давайте взглянем, правда ли это:

Python

my_string = «abc»
a = id(my_string)
print(a) # 19397208

my_string = «def»
b = id(my_string)
print(b) # 25558288

my_string = my_string + «ghi»
c = id(my_string)
print(c) # 31345312

1
2
3
4
5
6
7
8
9
10
11

my_string=»abc»

a=id(my_string)

print(a)# 19397208

my_string=»def»

b=id(my_string)

print(b)# 25558288

my_string=my_string+»ghi»

c=id(my_string)

print(c)# 31345312

Проверив id объекта, мы можем определить, что когда мы присваиваем новое значение переменной, то это меняет тождество

Обратите внимание, что в версии Python, начиная с 2.0, строки могут содержать только символы ASCII. Если вам нужен Unicode, тогда вы должны вписывать u перед вашей строкой

Пример:

Python

# -*- coding: utf-8 -*-
my_unicode_string = u»Это юникод!»

1
2

# -*- coding: utf-8 -*-

my_unicode_string=u»Это юникод!»

В Python, начиная с версии 3, все строки являются юникодом.

Функции, неочевидные для новичков

bool

Эта функция проверяет достоверность (истинность) объектов Python. Относительно чисел будет выполняться проверка на неравенство нулю.

Применяя к коллекциям, будет проверяться их длина (больше 0 или нет).

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

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

enumerate

Если нужно в цикле посчитать количество элементов (по одному элементу за раз), эта функция может быть очень полезной. Такая задача может показаться специфической, но она бывает нужна довольно часто.

Например, если нужно отслеживать номер строки в файле.

также часто используется для отслеживания индекса элементов в последовательности.

Также следует обратить внимание, что новички в Python часто используют. Если вы когда-нибудь встретите конструкции типа , лучше заменить её на

Она поможет упростить конструкцию операторов.

zip

Эта функция ещё более специализирована, чем . используется для перебора сразу нескольких объектов одновременно.

По сравнению с , последняя функция удобна, когда нужна индексация во время цикла. Если нужно обрабатывать несколько объектов одновременно, предпочтительнее .

reversed

Функция , как и , возвращает итератор.

Единственное, что можно сделать с этим итератором, пройтись по нему (но только один раз).

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

Есть несколько и других способов перевернуть списки в Python.

Данная функция, как правило, является лучшим способом «перевернуть» любой список (а также набор, массив и т. д.) в Python.

В отличие от , не изменяет список, а возвращает итератор перевёрнутых элементов.

(в отличие от ) не создает новый список. Возвращаемый им итератор извлекает следующий элемент в обратном порядке при проходе по циклу. Также синтаксис намного более читабелен, чем .

Можно использовать факт, что не копирует список. Если объединить его с функцией , можно переписать функцию (из раздела ), не занимая дополнительной памяти (не копируя объект).

sum

Эта функция берёт набор чисел и возвращает их сумму.

В Python есть много вспомогательных функций, которые выполняют циклы за вас (отчасти потому, что они хорошо сочетаются с генератор-выражениями).

min и max

Эти функции выдают минимальное и максимальное число из набора соответственно.

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

и также принимают -свойство, позволяющее настроить, что на самом деле означают «минимум» и «максимум» для конкретных объектов.

sorted

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

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

также позволяет настраивать сортировку с помощью -свойства.

any и all

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

Используя , можно переписать функцию следующим образом.

Отрицание условия и возвращаемого значения позволит также использовать в этом примере точно также (что усложнит конструкцию, но вполне сойдёт в качестве примера использования).

Добавить комментарий

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

Adblock
detector