Как поместить переменную в строку?

246

Я хотел бы положить intв string. Вот чем я сейчас занимаюсь:

num = 40
plot.savefig('hanning40.pdf') #problem line

Я должен запустить программу для нескольких разных номеров, поэтому я хотел бы сделать цикл. Но вставка такой переменной не работает:

plot.savefig('hanning', num, '.pdf')

Как вставить переменную в строку Python?

Gish
источник

Ответы:

163
plot.savefig('hanning(%d).pdf' % num)

%Оператор, когда после строки, позволяет вставить значения в эту строку с помощью кодов формата (далее %dв данном случае). Для более подробной информации смотрите документацию по Python:

https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting

янтарный
источник
40
Обратите внимание, что %оператор устарел с Python 3.1. Новый предпочтительный способ заключается в использовании .format()метода, который обсуждался в PEP 3101 и упоминался в ответе Дэна Макдугалла.
Крис Мюллер
499

Ох, много, много способов ...

Конкатенация строк:

plot.savefig('hanning' + str(num) + '.pdf')

Спецификатор конверсии:

plot.savefig('hanning%s.pdf' % num)

Использование имен локальных переменных:

plot.savefig('hanning%(num)s.pdf' % locals()) # Neat trick

Использование str.format():

plot.savefig('hanning{0}.pdf'.format(num)) # Note: This is the new preferred way

Использование f-строк:

plot.savefig(f'hanning{num}.pdf') # added in Python 3.6

Использование string.Template:

plot.savefig(string.Template('hanning${num}.pdf').substitute(locals()))
Дэн Макдугалл
источник
16
Чтобы использовать оператор форматной строки с несколькими аргументами, можно использовать кортеж в качестве операнда: 'foo %d, bar %d' % (foo, bar).
fiedl
12
Ваш хитрый трюк тоже работает с синтаксисом нового формата:plot.savefig('hanning{num}s.pdf'.format(**locals()))
пикс
13
С введением f-строк в Python 3.6 это теперь можно записать как plot.savefig(f'hanning{num}.pdf'). Я добавил ответ с этой информацией.
Джоелостблом
были проблемы с использованием locals () внутри функции, вызывающей глобальную переменную; вместо этого использовал% globals (), который сработал
лоби
123

С введением отформатированных строковых литералов (для краткости "f-strings") в Python 3.6 теперь можно написать это с более коротким синтаксисом:

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'

С примером, приведенным в вопросе, это будет выглядеть так

plot.savefig(f'hanning{num}.pdf')
joelostblom
источник
17

Не знаю точно, что делает весь код, который вы опубликовали, но чтобы ответить на вопрос, поставленный в заголовке, вы можете использовать + как обычную функцию concat для строк, а также str ().

"hello " + str(10) + " world" = "hello 10 world"

Надеюсь, это поможет!

goggin13
источник
6
В то время как этот ответ является правильным, +следует избегать построения строк, так как это чрезвычайно дорого
Слейтон
6

В общем, вы можете создавать строки, используя:

stringExample = "someString " + str(someNumber)
print(stringExample)
plot.savefig(stringExample)
Йехонатан
источник
4

Если вы хотите поместить несколько значений в строку, вы можете использовать format

nums = [1,2,3]
plot.savefig('hanning{0}{1}{2}.pdf'.format(*nums))

Приведет к строке hanning123.pdf. Это можно сделать с любым массивом.

Джонатан Р
источник
3

Мне нужна была расширенная версия этого: вместо того, чтобы встраивать одно число в строку, мне нужно было сгенерировать серию имен файлов в форме 'file1.pdf', 'file2.pdf' и т. Д. Вот как это работал:

['file' + str(i) + '.pdf' for i in range(1,4)]
Раджа
источник
-1

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

str(num)
Ole
источник