Как стать автором
Обновить

Комментарии 25

думаю в задачах генерации массивов текста фичи крайне полезны

Ещё f-строки можно использовать в ассертах и получать понятные сообщения об ошибках.

Assert a==b f"{a} ! = {b}"

Эээээ.... это в какой версии?

Это в любой версии с поддержкой f-строк, так как подобный синтаксис:

assert foo == bar, 'spam'

Давно существует и предназначен для вывода кастомного сообщения в AssertionError в случае, если условие ложно.

Не знал, что через запятую можно добавить отсебятинки. Спасибо!

Главное теперь вовремя остановиться и не засунуть перечень из условия и сообщения в скобки

Про test= понравилось, часто такое пишу)

Интересно, почему они такие быстрые, даже быстрее, чем конкатенация. Что-то тут не так

Потому что ты заранее знаешь куда класть результат, соответственно на аллокацию меньше (в этом примере), естественно и копирований лишних не будет.

В статье и правда нереалистичные цифры, все принты работают за примерно тоже самое время. Модератор, если можете, удалите мой другой комментарий
import timeit

setup = """
x = 3
y = 4
"""

funcs = [
  'print(f"{x} {y}")',
  'print(str(x) + " " + str(y))',
  "print(str(x) + str(y))",
  'print("{} {}".format(x, y))',
]

results = {}

for item in funcs:
  results[item] = timeit.Timer(item, setup=setup).repeat(7, 1000)

for func, value in results.items():
  print("min = {}, max = {}, {}".format(min(value), max(value), func))


Результаты

min = 0.0015034589887363836, max = 0.0016057030006777495, print(f"{x} {y}")
min = 0.001643661002162844, max = 0.0017650749941822141, print(str(x) + " " + str(y))
min = 0.0015372109919553623, max = 0.0016501189966220409, print(str(x) + str(y))
min = 0.0015749409940326586, max = 0.0016585019911872223, print("{} {}".format(x, y))

Не нужно измерять print, читайте внимательнее, в статье написано как оно измерялось...

>>> from timeit import timeit
>>> for s in ('f"{x} {y}"', '"{} {}".format(x, y)' ,'x+" "+y', '"%s %s" % (x, y)'):
        print(timeit(s, 'x, y = "Hello", "World"', number=1000000), s)
0.1258036000000402 f"{x} {y}"
0.4175639999999703 "{} {}".format(x, y)
0.2175986999999395 x+" "+y
0.3835477999999739 "%s %s" % (x, y)

Проверил, результат зависит от арументов 3 и 4

min = 0.00010221399134024978, max = 0.00018698800704441965, f"{x} {y}"
min = 0.00018588098464533687, max = 0.00024034999660216272, str(x) + " " + str(y)
min = 0.00015182801871560514, max = 0.0001902490039356053, str(x) + str(y)
min = 0.00013922399375587702, max = 0.00016092602163553238, "{} {}".format(x, y)


Для 10 и 25 (как в статье)
min = 0.0001049069978762418, max = 0.00012914801482111216, f"{x} {y}"
min = 0.0001870139967650175, max = 0.00018797098891809583, str(x) + " " + str(y)
min = 0.00016022301861084998, max = 0.00016407601651735604, str(x) + str(y)
min = 0.00014531699707731605, max = 0.00014632698730565608, "{} {}".format(x, y)


Начиная со второго символа начинается прирост, был не прав

Нужно просто добавить итераций (параметер number)... Все эти варианты очень быстры и при 1000 итераций (время исполнения микросекунды) погрешность измерения очень высока - оверхед близок к собственно исполнению, плюс некоторая гранулярность из-за разрешения таймера (для винды как правило 15.6 ms) и т.д.

Для замеров скорости мелкого и быстрого кода, нужно использовать number=1000000 и выше.

Очень полезно было-бы сравнение со "старичками" - всякими разными С/Perl/Java/Cobol/...

Ведь питон - "удобный", надо реально удобство показывать !

P.S. может не очень внимательно читал (яжпаграмист, доку читаю когда больно :) - кроме древнего сишного printf и перловских понтов ничего не увидел :(

P.P.S. сишный printf - КРАЙНЕ сложная функция. И в "удобный" питон оно переползло как есть - зачем заморачиваться :)

Не знаю за что минусуют. Не уверен что использование всех таких фич улучшит читаемость, может и хорошо что не все знают о них.

Видно я кому-то по неосторожности питон оттоптал :)

Мне не нравится, что внутри выражений внутри f-строк кавычки трактуются как конец строки. В некоторых других языках внутри {} полностью новый контекст парсинга и кавычки не закрывают внешнюю строку. Приходится менять тип кавычек.

вы можете использовать \ для экранировании кавычек, так же как и в простых строках
var = "world"
print(f"he\"llo = {var}")
>>> he"llo = world

var = "world"
print(f"""he"llo = {var}""")
>>>he"llo = world

В комментарии речь шла про кавычки внутри выражения, а не в самой строке. f-строки действительно не позволяют встраивать такие же кавычки внутри выражения f-строк.

Добавь в Python немного C#... Что может быть лучше чашечки тёмного кофе со сливками и сахаром ранним утром после тарелки овсяной каши?!

Не очень понял, по крайней мере по приведённому примеру, зачем лямбды в f-строках? Ведь такое же выражение как в лямбде можно просто вписать в f-строку. Единственное что приходит в голову это случай когда имена переменных очень длинные, а в выражении внутри f-строки они встречаются часто, и через лямбду можно переименовать их в условные x и y чисто для нужд вывода. Но есть ведь наверняка какие-то более важные случаи полезности использования?

Hidden text

number = 254.3463

print(f"{f'${number:.3f}':>10s}"

Зарегистрируйтесь на Хабре, чтобы оставить комментарий