Комментарии 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)
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-строк кавычки трактуются как конец строки. В некоторых других языках внутри {} полностью новый контекст парсинга и кавычки не закрывают внешнюю строку. Приходится менять тип кавычек.
Добавь в Python немного C#... Что может быть лучше чашечки тёмного кофе со сливками и сахаром ранним утром после тарелки овсяной каши?!
deleted
Возможно кому-нибудь пригодятся ссылки на документацию по данному функционалу (Format Specification Mini-Language):
https://docs.python.org/3/library/string.html#formatstrings
https://docs.python.org/3/reference/lexical_analysis.html#f-strings
Не очень понял, по крайней мере по приведённому примеру, зачем лямбды в f-строках? Ведь такое же выражение как в лямбде можно просто вписать в f-строку. Единственное что приходит в голову это случай когда имена переменных очень длинные, а в выражении внутри f-строки они встречаются часто, и через лямбду можно переименовать их в условные x и y чисто для нужд вывода. Но есть ведь наверняка какие-то более важные случаи полезности использования?
Hidden text
number = 254.3463
print(f"{f'${number:.3f}':>10s}"
F-строки в Python мощнее, чем можно подумать