Иногда возникает необходимость включить переменную или нестроковые типы данных в строковый литерал. В этой статье мы рассмотрим четыре способа сделать это.
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».