Jak wstawić zmienną do łańcucha?

246

Chciałbym umieścić intw string. Oto co robię w tej chwili:

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

Muszę uruchomić program dla kilku różnych liczb, więc chciałbym zrobić pętlę. Ale wstawienie zmiennej w ten sposób nie działa:

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

Jak wstawić zmienną do ciągu Python?

Gish
źródło

Odpowiedzi:

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

%Operator, gdy następujący ciąg, pozwala wstawić wartości do tego łańcucha kodem formatu (The %dw tym przypadku). Aby uzyskać więcej informacji, zobacz dokumentację Python:

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

Bursztyn
źródło
39
Zauważ, że %operator jest przestarzały od wersji Python 3.1. Nowym preferowanym sposobem jest wykorzystanie .format()metody omówionej w PEP 3101 i wspomnianej w odpowiedzi Dana McDougalla.
Chris Mueller
498

Och, wiele, wiele sposobów ...

Łączenie ciągów:

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

Specyfikator konwersji:

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

Używanie lokalnych nazw zmiennych:

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

Używanie str.format():

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

Korzystanie z ciągów F:

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

Używanie string.Template:

plot.savefig(string.Template('hanning${num}.pdf').substitute(locals()))
Dan McDougall
źródło
16
Aby użyć operatora format string z wielu argumentów, można użyć jako argumentu krotki: 'foo %d, bar %d' % (foo, bar).
fiedl
12
Twoja zgrabna sztuczka działa również z nową składnią formatu:plot.savefig('hanning{num}s.pdf'.format(**locals()))
pix
13
Wraz z wprowadzeniem ciągów f w Pythonie 3.6 można to teraz zapisać jako plot.savefig(f'hanning{num}.pdf'). Dodałem odpowiedź z tymi informacjami.
joelostblom
miał problemy z używaniem locals () wewnątrz funkcji wywołującej zmienną globalną; zamiast tego użyłem% globals (), który zadziałał
lobi
17

Nie jestem pewien, co dokładnie robi cały opublikowany kod, ale aby odpowiedzieć na pytanie postawione w tytule, możesz użyć + jako zwykłej funkcji concat łańcucha, a także str ().

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

Mam nadzieję, że to pomaga!

goggin13
źródło
6
Chociaż ta odpowiedź jest poprawna, +należy unikać ciągów znaków, ponieważ jest to niezwykle kosztowne
slayton
6

Ogólnie rzecz biorąc, możesz tworzyć ciągi znaków za pomocą:

stringExample = "someString " + str(someNumber)
print(stringExample)
plot.savefig(stringExample)
Yehonatan
źródło
4

Jeśli chcesz wstawić wiele wartości do ciągu, z którego możesz skorzystać format

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

Powoduje powstanie ciągu hanning123.pdf. Można to zrobić za pomocą dowolnej tablicy.

Jonathan R.
źródło
3

Potrzebowałem rozszerzonej wersji tego: zamiast osadzać pojedynczy ciąg w ciągu, musiałem wygenerować serię nazw plików w postaci „plik1.pdf”, „plik2.pdf” itd. Tak to wygląda pracował:

['file' + str(i) + '.pdf' for i in range(1,4)]
Radża
źródło
-1

Musisz po prostu rzucić zmienną num na ciąg znaków za pomocą

str(num)
Ole
źródło