Иногда возникает необходимость включить переменную или нестроковые типы данных в строковый литерал. В этой статье мы рассмотрим четыре способа сделать это.
1. Запятая
Наиболее распространенным способом является разделение строк и переменных запятой, как показано ниже.
>>> name = "John"
>>> age = 16
>>> height = 1.72
>>> print("Name:", name, "; Age:", age, "; Height:", height, "m")
Name: John ; Age: 16 ; Height: 1.72 m
Это не дает больших возможностей для настройки вывода, но при этом все выглядит хорошо. Также необходимо учитывать, что каждая запятая является пробелом в итоговой строке.
Мы можем сделать лучше.
2. Оператор %
Это старый метод, но он все еще часто встречается. На самом деле, я тоже часто его использую.
>>> print("Name: %s; Age: %d; Height: %fm" % (name, age, height))
Name: John; Age: 16; Height: 1.720000m
Это дает нам большую гибкость, но есть два основных ограничения:
- Вы не можете включать такие типы данных, как список, время и т.д.
%sозначает строку,%d— int и%f— float. Нельзя путать одно с другим.
>>> print("Name: %s; Age: %d; Height: %dm" % (name, age, height))
Name: John; Age: 16; Height: 1m
В этом примере мы не получили ошибку, поскольку типы данных были конвертируемыми. В результате Python автоматически привел данные к нужному типу.
Однако есть некоторые значения типа float, например, infinity, которые не могут быть преобразованы в int.
>>> import math
>>> math.inf
inf
>>> int(math.inf)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
OverflowError: cannot convert float infinity to integer
>>> print("Infinity %s" % math.inf)
Infinity inf
>>> print("Infinity %f" % math.inf)
Infinity inf
>>> print("Infinity %d" % math.inf)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
OverflowError: cannot convert float infinity to integer
Когда для оператора % имеется более одного аргумента, они должны быть объединены в кортеж. И, наконец, вы можете указать длину числа с плавающей запятой, как показано ниже (точка, за которой следует количество десятичных знаков).
>>> print("Name: %s; Age: %d; Height: %.1fm" % (name, age, height))
Name: John; Age: 16; Height: 1.7m
3. Строковый метод format()
У строк в Python есть метод format(), который позволяет вставить любой тип данных. Он очень похож на оператор % (с %s или %d или %f, замененными на {}), но лучше.
>>> print("Name: {}; Age: {}; Height: {}m".format(name, age, height))
Name: John; Age: 16; Height: 1.72m
Метод format() лучше, потому что:
- Вам не нужно быть уверенным в типе данных
- Можно вставить данные любого типа
- Можно многократно использовать значение с помощью индексации.
>>> from datetime import datetime
>>> print("{} test scores in a list {} on {}".format(name, [23, 25.5, 28], datetime.now()))
John test scores in a list [23, 25.5, 28] on 2021–03–15 13:30:39.754769
# Indexing like a list
>>> print("{0} is {3}. {0} loves {1}, {2} and {0}".format(name, 'Harry Potter', 'ice cream', age))
John is 16. John loves Harry Potter, ice cream and John
# Another form of index
>>> print("{fname} {lname} is {age}".format(age=16, fname="John", lname="Snow"))
John Snow is 16
Последний пример индекса также иллюстрирует, что значения в методе format могут быть выражены в виде списка пар ключ=значение.
f-строки
Еще одним привлекательным вариантом является литерал форматированной строки (f-строка).
>>> print(f"{name} is {age}, and today is {datetime.now().strftime('%Y-%m-%d')}")
John is 16, and today is 2021–03–15
Главное преимущество этого подхода в том, что он позволяет вам легко узнать, где находится значение. Ну и мне кажется, это круто выглядит.
Но есть и минусы:
- Требуется python>=3.6. Вы должны быть уверены в этом, чтобы избежать ошибки.
- Вы не можете включить обратную косую черту в часть выражения (внутри
{}). - Пункт 2 также означает, что вы не можете включить
'"'без получения SyntaxError.
Заключение
- Метод format() — наилучший способ вставить переменную в строку, на мой взгляд.
- f-string — это круто, очень круто. Но требует python≥3.6
- Форматирование при помощи
%тоже по-своему удобно. - А первый метод, с перечислением через запятую, отлично подходит для быстрой работы.
Перевод статьи Bisola Olasehinde «4 ways to add variables or values into Python strings».
