Рубрики
Без рубрики

Почему перед этой строкой стоит буква f? Введение в f-строки и форматирование строк

Изучите форматирование строк в python.

Автор оригинала: 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-строки ценны. Для тестирования, читабельности, расширяемости и многого другого.

Забавные Факты

  1. Вы можете использовать либо строчную букву, либо заглавную букву F, и форматирование строки будет таким же. f"Результат есть {результат}" то же самое, что F"Результат есть {результат}" .

  2. Если вы хотите отформатировать строки по нескольким строкам, вы можете либо поставить 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"""
)

Умные факты

  1. Форматирование строк штабелируется, то есть вы можете форматировать строки внутри строк. Допустим, вам нужно переменное число десятичных знаков
decimals = 3
amount = float(input("How much? "))  # Convert input (str) to float
print(f"This much? ${amount:,.{decimals}f}")

С вводом 12312.123123 , выход этого скрипта Так много? $12,312.123 .

Примечание: Пожалуйста, не делайте этого, это действительно трудно читать.

  1. Скажем, вы хотите использовать ключ 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 или о чем-то еще!