LINUX.ORG.RU
ФорумTalks

Строчная подстановка в Питоне

 моща


0

2

А вы знали, что в Питоне, начиная с 3.6 вместо:

'1 + 3 = {}'.format(1+3)

можно писать:

f'1 + 3 = {1 + 3}'

Я только что узнал об этом от друга, который проходит курс о Питоне. Вот она, моща Питона во всей красе! Разве можно такую фичу представить в C++? Ну не реально же!

★★★★★

Последнее исправление: seiken (всего исправлений: 1)

Мы остановились, добившись успешной компиляции следующего: for(;P(«\n»),R-;P(«|»))for(e=C;e-;P(«_»+(*u++/8)%2))P("| "+(*u/4)%2);

Irma ★★
()

Разве можно такую фичу представить в C++?

std::stringstream ss;
ss << "1 + 3 = " << 1 + 3;

Просто символов больше - вместо одной фигурной скобки нужно три - кавычка и два знака «меньше».

А ещё в питоновской версии ты забыл f перед открывающей кавычкой, иначе не заработает.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)

Разве можно такую фичу представить в C++? Ну не реально же!

В любом развитом ЯП строковая интерполяция либо есть из коробки, либо её самому можно запилить средствами языка.

theNamelessOne ★★★★★
()

Вот она, моща Питона во всей красе

Это не мощь, а очередной костыль. В нормальных языках это делается просто

'1 + 3 = ' . 1 + 3

И не надо изобретать новую «фичу» на каждый чих.

no-such-file ★★★★★
()

А вы знали, что в Питоне, начиная с 3.6 вместо:

да, но так и не проникся этим

Kolins ★★★★
()
Ответ на: комментарий от KivApple

Я же не писал, что вот такое вычисление на плюсах не сделать… нет, речь шла о фиче. Вообще, в плюсах 20 есть форматная строка, но это не подстановка. Питоновская фича похожа на подстановку команд в шелле. Это то, что делает шелл мощнейшим скриптовым ЯП.

seiken ★★★★★
() автор топика
Ответ на: комментарий от apt_install_lrzsz

Ну так шарп довольно продвинутый ЯВУ.

seiken ★★★★★
() автор топика

О сколько нам открытий чудных… :)

Про декораторы ещё почитай.

CrX ★★★★★
()
Ответ на: комментарий от theNamelessOne

В любом развитом ЯП строковая интерполяция либо есть из коробки, либо её самому можно запилить средствами языка.

Да ты что?! Как запилить такое на плюсах? Не путать с std::format, который прошлый век.

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

А теперь подставь в центр строки, без забора из конкатенаций.

Какой ещё забор?

'1 + 3 = '. 1 + 3 .' питономакаки'

А теперь ты сделай так

'1 + 3 = {--'. 1 + 3 .'--}'
no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Решение чего? Как сделать?

f"1 + 3 = {{--{1+3}--}}"

Так что ли?

Непонятно только к чему это всё было. Конкатенация в питоне тоже есть, только +, а не .

'1 + 3 = {--' + str(1+3) + '--}'

Только речь не про неё, а про форматирование строк в целом и f-строки в частности.

Показывай, как на своём чудо-языке ты делаешь это c помощью точек своих:

TEMPLATE = "{name} is {age} years old."
person = {"name": "Ivan", "age": 33}
print(TEMPLATE.format(**person))
CrX ★★★★★
()
Ответ на: комментарий от CrX

Только речь не про неё, а про форматирование строк в целом и f-строки в частности.

В частности зачем нужны f строки если есть конкатенация? Наверное потому что конкатенация в питоне выглядит как говно, даже по сравнению с пыхом.

Показывай, как на своём чудо-языке ты делаешь это c помощью точек своих

В любом языке такие вещи в продакшене делаются на темплейт-движках с поддержкой интернационализации в т.ч. согласованием по числительным.

Но вообще, как выше уже отметили, нашлёпать такое несложно в любом языке. Для этого не нужно изобретать новый синтаксис.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

В частности зачем нужны f строки если есть конкатенация?

Ну мне удобно с их помощью задавать число знаков после запятой при выводе чисел с плавающей точкой (точнее, когда числа с плавающей точкой встречаются в легенде к графику, который рисует matplotlib). Конкатенацией так не сделать.

knovich
()
Последнее исправление: knovich (всего исправлений: 1)
Ответ на: комментарий от no-such-file

В частности зачем нужны f строки если есть конкатенация?

  1. Удобство
  2. Производительность

Но вообще, как выше уже отметили, нашлёпать такое несложно в любом языке.

Ну с этим никто не спорил.

CrX ★★★★★
()
Ответ на: комментарий от CrX

Производительность

Ну да, питон же тормоз, приходится всё на свете тащить в язык.

Удобство

Для лаб. Тут вопросов нет.

А в реальном боевом коде ты всё равно будешь валидировать значения, возможно переводить и т.д. На этом фоне копеечный сахар не просто теряется, он там вообще не используется.

Ну а где реально мощный формат, так это в ЛИСП. Но это уже не для макак.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от no-such-file

А в реальном боевом коде ты всё равно будешь валидировать значения, возможно переводить и т.д. На этом фоне копеечный сахар не просто теряется, он там вообще не используется.

Да всё там используется. Особенно в относительно небольших скриптах. А монументальные проекты на питоне в принципе писать так себе идея. Можно ли без этого сахара? Да конечно можно, и его добавили довольно недавно по историческим меркам, в 3.6 что ли, до этого прекрасно жили без них. Но с ними приятнее. Особенно использовать питон по прямому назначению — побыстренькому написать что-то небольшое.

CrX ★★★★★
()
Ответ на: комментарий от CrX

Очень ограниченное применение у этих строк.

В реале там будут или локализованные строки, или куча валидации, или всё вместе.

wandrien ★★
()
Ответ на: комментарий от CrX

Производительность

А как f-строки помогают с производительностью? Разве это не просто синтаксический сахар над конкатенацией? Насколько я знаю, эти строки примерно эквивалентны:

f"x + y = {x + y}"
"x + y = " + str(x + y)
theNamelessOne ★★★★★
()
Ответ на: комментарий от seiken

Питоновская фича похожа на подстановку команд в шелле. Это то, что делает шелл мощнейшим скриптовым ЯП.

В джаваскрипте всё равно интерполяция строк мощнее :-P

static_lab ★★★★★
()
Ответ на: комментарий от theNamelessOne

производительностью

Производительность работы программиста же. f-строчки экономят время, когда пишешь всякие логи, ошибки и прочие вещи.

EXL ★★★★★
()
Ответ на: комментарий от theNamelessOne

Конкретно в этом примере с f-строкой лишь чуть-чуть быстрее получается:

>>> y = 1
>>> starttime = time.time(); z = ["x + y = " + str(x + y) for x in range(10_000_000)]; print(time.time() - starttime)
1.3884761333465576
>>> starttime = time.time(); z = [f"x + y = {x+y}" for x in range(10_000_000)]; print(time.time() - starttime)
1.2255635261535645

НО! Стоит чуть-чуть усложнить пример, и уже:

>>> y = 1

>>> starttime = time.time(); z = [f"x + y = {x + y}; where x = {x} and y = {y}" for x in range(10_000_000)]; print(time.time() - starttime)
2.243973731994629
>>> starttime = time.time(); z = [f"x + y = {x + y}; where x = {x} and y = {y}" for x in range(10_000_000)]; print(time.time() - starttime)
2.239164352416992

>>> starttime = time.time(); z = ["x + y = " + str(x + y) + "; where x = " + str(x) + " and y = " + str(y) for x in range(10_000_000)]; print(time.time() - starttime)
3.5466392040252686
>>> starttime = time.time(); z = ["x + y = " + str(x + y) + "; where x = " + str(x) + " and y = " + str(y) for x in range(10_000_000)]; print(time.time() - starttime)
3.5206360816955566

И разница уже весьма ощутимая (в читаемости, кстати, тоже, а в писабильности ещё больше).

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 3)
Ответ на: комментарий от CrX

f"1 + 3 = {{--{1+3}--}}"

Немножко просмотрел это. Дичь какая, как я из этого должен понять кто на ком стоял? Ведь сахар-то именно ради «читаемости». Конкатенация хотя бы однозначно понятна.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Ну в таких надуманных примерах просто не стоит использовать f-строки.

CrX ★★★★★
()

проходит курс о Питоне.

В средней школе? Там говорят на информатике питон преподают. Сочувствую детям.

Ygor ★★★★★
()

Ага, знал

а еще есть:

>>> [a, b] = [1, 2]
>>> a
1
>>> b
2

и вот такое

>>> s = { x for x in [1,1,2,3] }
>>> s
{1, 2, 3}

и такое

>>> d = { x: x+1 for x in [1,2,3] }
>>> d
{1: 2, 2: 3, 3: 4}

и даже такое

>>> c = (x for x in [1,2,3])
>>> c
<generator object <genexpr> at 0x0000016272495780>

и, наверное, дофига чего еще я не знаю, потому что лень читать свежие спеки))

Norgat ★★★★★
()
Ответ на: комментарий от Ygor

В средней школе? Там говорят на информатике питон преподают. Сочувствую детям.

Да, в школе иногда дают Питон. Но нет, он давно уже не школьник.

seiken ★★★★★
() автор топика
Ответ на: комментарий от Norgat

и такое и такое и даже такое

и всё это абсолютно ненужный визуальный мусор, усложняющий чтение алгоритма

wandrien ★★
()
Ответ на: комментарий от Puzan

В Питоне с многострочными лямбдами проблема,.потому что Сам говорил " как только я вижу нетривиальную лямбду, я думаю ‘счас подождите, я её нарисую, чтобы понять’"

seiken ★★★★★
() автор топика
Последнее исправление: seiken (всего исправлений: 1)
Lua 5.4.6  Copyright (C) 1994-2023 Lua.org, PUC-Rio
> '1 + 3 = ' .. 1 + 3
1 + 3 = 4
> 

И 30 лет назад можно было так. На то они и интерпретируемые языки.

LINUX-ORG-RU ★★★★★
()

Раздули Питон до половины C++.

There should be one-- and preferably only one --obvious way to do it.

urxvt ★★★★★
()
Ответ на: комментарий от seiken

Ну т.е. «мне не нужно, значит никому не нужно» :)

Puzan ★★★★★
()
Ответ на: комментарий от Ghostwolf

Мне это нравится даже меньше, чем % второго питона.

seiken ★★★★★
() автор топика
Ответ на: комментарий от Ghostwolf

В данном случае выглядит. Когда много этих ‘{}’ — не выглядит. Когда используются имена локальных переменных — тоже. И писать f-строки тоже намного удобнее. Ну и ещё они значительно выигрывают у format по производительности, но это уже отдельный вопрос.

CrX ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)