Автор оригинала: Henry George.
Как добавить переменную в строку в python? Если у меня есть чье-то имя, как мне распечатать его обратно, с дополнительной информацией, например приветственным сообщением?
define Форматирование строк существительное Причудливый способ сказать, что строки/текст выглядят так, как вы хотите, будь то с переменными, новыми строками, пробелами, заглавными буквами и т. Д. Пример: “Форматирование строк на выходе этого простого приложения командной строки великолепно, у него есть цвета и все такое!”
Форматирование строк прошло долгий путь за последние несколько лет. Давайте быстро пройдемся по полосе памяти и посмотрим на старые способы форматирования строк, прокрутите вниз, чтобы увидеть некоторые примеры f-строк.
1. Начиная с основ.
В python все является объектом, включая строки. Это обеспечивает дополнительную гибкость, например: "a" * 4
, то есть вы можете “сцеплять” строки путем сложения и умножения.
В старые добрые времена мы так и делали. Возьмем, к примеру, классическое приложение python2 hello world.
#!/usr/bin/env python name = input("What's your name? ") print "Hello " + name
В этом примере мы используем самую базовую версию форматирования строк. Объединение (добавление) двух строк с символом +
.
Если вы сохраните этот код в hello_name.py
и запустить python3 hello_name.py
, вы увидите вывод как Hello Henry
, с заменой Henry на все, что вы вводите.
Это отлично подходит для базовых скриптов и имеет смысл при чтении, но что делать, если мы хотим сделать что-то вроде "Hello" + name + ", похоже, что погода будет "+ weather_temp + ""+ weather_scale + "градусы сегодня". Это все еще возможно, но определенно не очень легко читать.
Что делать, если мы хотим взять такое число, как 123.45678
и напечатать его как $123.46
? Этот метод явно весьма ограничен, когда дело доходит до форматирования строк.
2. Магия %.
Итак, давайте вернемся к нашему примеру. Допустим, у нас есть поплавок (число с десятичными знаками, а не целое число), и мы хотим напечатать его как валюту, с запятыми и округлением. Как нам это сделать?
amount = float(input("How much? ")) # Convert input (str) to float print("This much? " + amount)
Если мы введем 1234.56789
, мы возвращаемся "Так много? 1234.56789"
. Итак, как мы напечатаем это в виде суммы долларов и центов?
Мы можем использовать так называемый “оператор форматирования строк” или %
. Вместо добавления строки в конце мы можем просто поместить символ%, за которым следует тип (например, d для целого числа, f для float, s для строки и т. Д.), А затем следовать за этим с переменной для замены. Это обеспечивает (немного) более читаемый код.
Наш пример выше будет тогда:
amount = float(input("How much? ")) # Convert input (str) to float print("This much? %f" % amount)
Но это все равно не помогает нам обратиться 1234.56789
до $1,234.57
. Для этого нам нужно использовать “флаги преобразования” . Например, если мы форматируем float, мы можем заменить %f
на %.2f
, и это округлит float до 2 знаков после запятой.
amount = float(input("How much? ")) # Convert input (str) to float print("This much? $%.2f" % amount)
Итак , теперь наш выход составляет $1234.57
, но у нас все еще нет запятой для тысячного разделителя…
3. Вы не можете написать “форматирование строк” без формата!
Итак, все в python является объектом, объекты могут иметь методы (функции), так почему бы нам просто не добавить метод к объекту string, чтобы помочь нам форматировать строки?
Приветственная строка.формат()
Это был большой скачок вперед для python. Мы не просто получили более читаемый способ форматирования строк (подробнее об этом в сносках), мы также получили более сложные правила форматирования .
Итак, давайте вернемся к нашему примеру. Допустим, у нас есть поплавок (число с десятичными знаками, а не целое число), и мы хотим напечатать его как валюту, с запятыми и округлением. Как нам это сделать?
amount = float(input("How much? ")) # Convert input (str) to float print("This much? ${0:,.2f}".format(amount))
Наш выход сейчас Так много? $1234,57
, но как? Таким образом, основной синтаксис format заключается в том, что он принимает первый аргумент (значение после скобок, so .format(first, second) имеет два аргумента, “first” и “second”), и помещает его в первый индекс (обозначается 0), so x
, "Число равно {0}".format(x)
возвращает Число равно 123
.
Это ,
говорит python отформатировать число запятыми, так что 1200000 становится 1 200 000 (если вы создаете международное приложение, помните , что в некоторых странах символы и . перевернуты).
Итак, мы можем делать все, что захотим. Тогда почему ты так любишь f-струны?
4. Истинная причина, по которой f-strings изменят вашу жизнь
Несмотря на распространенное мнение, развитие не является (и не должно быть) целью выполнения работы. Речь идет о том , чтобы сделать работу хорошо и таким образом, чтобы будущие разработчики могли понять и расширить .
String.format обладает всеми необходимыми функциональными возможностями. Python 2.7 обладает всеми необходимыми функциями. На самом деле C обладает всеми необходимыми функциональными возможностями, чтобы выполнить практически любую задачу. Когда python обновился до версии 3, он внес некоторые радикальные, разрушительные изменения в язык, и хотя некоторые из них были направлены на производительность, а некоторые-на функциональность, мой личный фаворит, f-strings, был в первую очередь за надежность , читаемость и адаптивность .
F-строки не вводят никаких новых функций, но они резко повышают читабельность и адаптивность (они также повышают производительность, но для меня это побочная заметка).
Давайте сначала рассмотрим простой пример:
name = "Jenny" company = "Acme Inc." print(f"Hi {name}, welcome to {company}.")
>>> “Привет, Дженни, добро пожаловать в Acme Inc”
Просто добавив f перед строкой, мы смогли ввести любую переменную, имеющуюся у нас в текущей области scope , и распечатать ее в виде строки. Это не совсем революционно, но революционно то, как легко это понять.
В современном мире код не пишется один раз для выполнения функции, он пишется, тестируется, пересматривается, модифицируется, расширяется и однажды, возможно, заменяется. Читабельность является ключом к этому, и 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"Результат есть {результат}"
то же самое, чтоF"Результат есть {результат}"
.Если вы хотите отформатировать строки по нескольким строкам, вы можете либо поставить 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? ")) # Convert input (str) to float print(f"This much? ${amount:,.{decimals}f}")
С вводом 12312.123123
, выход этого скрипта Так много? $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']}")
Следуйте за мной в Twitter ( @thegeorge ) или Medium для получения дополнительных сообщений и напишите мне, если вы хотите узнать больше о python, data science, корпоративных веб-приложениях, DevOps или о чем-то еще!