Почему перед этой строкой стоит буква f? Введение в f-строки и форматирование строк
Как добавить свою переменную в строку в python? Если у меня есть чье-то имя, как мне его распечатать с дополнительной информацией, например приветственным сообщением?
определять Форматирование строк
существительное
Причудливый способ заставить строки/текст выглядеть так, как вы хотите, будь то с переменными, новыми строками, пробелами, заглавными буквами и т. д.
Пример: «Форматирование строки на выходе этого простого приложения командной строки великолепно, оно имеет цвета и все такое!»
Форматирование строк прошло долгий путь за последние несколько лет. Давайте совершим небольшое путешествие по памяти и посмотрим на старые способы форматирования строк, прокрутим вниз, чтобы увидеть несколько примеров f-строки.
1. Начиная с основ.
В Python все является объектом, включая строки. Это обеспечивает дополнительную гибкость, например: "a" * 4 == "aaaa"
то есть вы можете «конкатенировать» строки путем сложения и умножения.
В старые добрые времена мы так и поступали. Возьмем, к примеру, классическое приложение hello world на python2.
name = input("What's your name? ")
print "Hello " + name
В этом примере мы используем самую простую доступную версию форматирования строк. Объединение (добавление) двух строк с помощью +
символ.
Если вы сохраните этот код в hello_name.py
и беги python3 hello_name.py
вы увидите вывод как Hello Henry
где Генри заменяется тем, что вы вводите.
Это отлично подходит для базовых сценариев и имеет смысл при чтении, но что, если мы хотим сделать что-то вроде "Hello " + name + ", looks like the weather will be " + weather_temp + " " + weather_scale + " degrees today."
. Это все еще возможно, но определенно не очень легко читать.
Что, если мы хотим взять число вроде 123.45678
и распечатать как $123.46
? Этот метод явно весьма ограничен, когда речь идет о форматировании строк.
2. Магия %.
Итак, вернемся к нашему примеру. Скажем, у нас есть число с плавающей запятой (число с десятичными знаками, а не целое), и мы хотим напечатать его как валюту, с запятыми и округлением. как нам это сделать?
amount = float(input("How much? "))
print("This much? " + amount)
Если мы введем 1234.56789
мы возвращаемся "This much? 1234.56789"
. Итак, как мы напечатаем это как сумму в долларах и центах?
Мы можем использовать нечто, называемое «оператором форматирования строки», или %
. Вместо добавления строки в конце мы можем просто поместить символ %, за которым следует тип (например, d для целого числа, f для числа с плавающей запятой, s для строки и т. д.), а затем указать переменную для замены. Это обеспечивает (немного) более читаемый код.
Тогда наш пример выше будет таким:
amount = float(input("How much? "))
print("This much? %f" % amount)
Но это все еще не помогает нам преобразовать 1234.56789
к $1,234.57
. Для этого нам нужно использовать «флаги конверсии». Например, если мы форматируем число с плавающей запятой, мы можем заменить %f
с %.2f
и это округлит число с плавающей запятой до 2 знаков после запятой.
amount = float(input("How much? "))
print("This much? $%.2f" % amount)
Итак, теперь наш вывод $1234.57
но у нас до сих пор нет запятой для разделителя тысяч…
3. Вы не можете написать «форматирование строки» без форматирования!
Итак, все в python является объектом, объекты могут иметь методы (функции), так почему бы нам просто не добавить метод к строковому объекту, чтобы помочь нам форматировать строки?
Добро пожаловать string.format()
Это был большой шаг вперед для Python. Мы не только получили более читаемый способ форматирования строк (подробнее об этом в сносках), мы также получили более сложные правила форматирования.
Итак, вернемся к нашему примеру. Скажем, у нас есть число с плавающей запятой (число с десятичными знаками, а не целое), и мы хотим напечатать его как валюту, с запятыми и округлением. как нам это сделать?
amount = float(input("How much? "))
print("This much? ${0:,.2f}".format(amount))
Наш вывод теперь This much? $1,234.57
, но как? Таким образом, основной синтаксис формата заключается в том, что он принимает первый аргумент (значение после скобок, поэтому .format(first, second) имеет два аргумента, «первый» и «второй»), и помещает его в первый индекс (обозначается как 0), поэтому x = 123
, "The number is {0}".format(x)
возвращается The number is 123
.
,
говорит Python отформатировать число с запятыми, поэтому 1200000 становится 1 200 000 (если вы создаете международное приложение, помните, что в некоторых странах символы , и . меняются местами).
Итак, .format может делать все, что мы хотим. Тогда почему ты так любишь фа-струны?
4. Настоящая причина, по которой стринги изменят вашу жизнь
Вопреки распространенному мнению, разработка не направлена (и не должна) на выполнение работы. Речь идет о выполнении работы Что жи таким образом, чтобы будущие разработчики могли понять а также продлевать.
String.format имеет все необходимые функции. Python 2.7 обладает всеми необходимыми функциями. На самом деле, C обладает всеми необходимыми функциями для решения практически любой задачи. Когда python обновился до версии 3, в язык были внесены некоторые радикальные, ломающие изменения, и хотя некоторые из них были связаны с производительностью, а некоторые — с функциональностью, мой личный фаворит, f-strings, был в первую очередь предназначен для прочность, удобочитаемость а также приспособляемость.
F-строки не привносят никаких новых функций, но они значительно повышают удобочитаемость и адаптируемость (они также повышают производительность, но для меня это побочный эффект).
Сначала рассмотрим простой пример:
name = "Jenny"
company = "Acme Inc."
print(f"Hi {name}, welcome to {company}.")
>>> 'Hi Jenny, welcome to Acme Inc'
Просто добавив f перед строкой, мы смогли ввести любую переменную, которая у нас есть в текущей строке. сфера, и вывести его в виде строки. Это не совсем революционно, но революционно то, насколько легко это понять.
В современном мире код не пишется один раз для выполнения функции, он пишется, тестируется, проверяется, модифицируется, расширяется и однажды может быть заменен. Читаемость является ключом к этому, и f-строки обеспечили огромный скачок в читабельности. Если бы вы вообще ничего не знали о python и посмотрели предыдущий пример, держу пари, вы могли бы догадаться, как выглядел вывод. Никогда не недооценивайте ценность удобочитаемости. С нашими простыми примерами это кажется слишком простым, но давайте рассмотрим более сложный пример, создание SQL-запроса.
col1 = 'bar'
col2 = 'baz'
query = f'SELECT * FROM foo WHERE {col1} = ? AND {col2} = ?'
cursor.execute(query, params)
Этот запрос возвращает все строки, в которых значения в столбцах «bar» и «baz» равны значениям, заданным в «params». Это не так захватывающе, но гораздо более ценно и более вероятно в корпоративной среде. Если мы перепишем это с %
оператор, или .format()
функция, быстро становится труднее читать.
Форматирование, доступное для f-строк, похоже на .format, поэтому я не буду включать его в этот документ, но надеюсь, что убедил вас в ценности f-строк. Для тестирования, удобочитаемости, расширяемости и многого другого.
Забавные факты
Вы можете использовать как строчную, так и заглавную F, и форматирование строки будет одинаковым.
f"The result is {result}"
такой же какF"The result is {result}"
.Если вы хотите отформатировать строки в несколько строк, вы можете либо поставить f перед каждой строкой с переменной:
print(
f"Hi {name}"
"welcome to my post"
f"you're {num_days} late"
)
Или вы можете просто использовать многострочные строки Python (обозначаемые тройными кавычками или тройными двойными кавычками):
print(
f"""Hi {name}
welcome to my post
you're {num_days} late"""
)
Умные факты
- Форматирование строк является составным, то есть вы можете форматировать строки внутри строк. Скажем, вам нужно переменное количество десятичных знаков
decimals = 3
amount = float(input("How much? "))
print(f"This much? ${amount:,.{decimals}f}")
С вводом 12312.123123
вывод этого скрипта This much? $12,312.123
.
Примечание. Пожалуйста, не делайте этого, это действительно трудно читать.
- Скажем, вы хотите использовать ключ dict внутри f-строки или любую другую кавычку, вы можете безопасно сделать это, если правильно чередуете
"
а также'
.
Например.
data = {"x": 123}
print(f'The result is {data["x"]}')
или эквивалентно:
data = {"x": 123}
print(f"The result is {data['x']}")
Подпишись на меня в Твиттере (@hjegeorge) или же Середина для получения дополнительных сообщений и напишите мне, если вы хотите узнать больше о python, науке о данных, корпоративных веб-приложениях, devOps или о чем-либо еще!