Apa maksud% s dalam string format python?

167

Apa %sartinya dengan Python? Dan apa yang dilakukan oleh sedikit kode berikut?

Misalnya...

 if len(sys.argv) < 2:
     sys.exit('Usage: %s database-name' % sys.argv[0])

 if not os.path.exists(sys.argv[1]):
     sys.exit('ERROR: Database %s was not found!' % sys.argv[1])
Tyler
sumber
4
The %operator usang dalam mendukung lebih kuat str.formatmetode, melihat PEP-3101 .
Paulo Scardine
35
Sebenarnya PEP itu mengatakan "Dalam Python 3.0,% operator dilengkapi dengan metode pemformatan string yang lebih kuat" dan bahwa itu di-backport ke Python 2.6. Di mana saya berasal dari "ditambahkan" berarti ditambahkan, tidak diganti. PEP tidak mengatakan "digantikan" dan tidak ada bagian dari PEP yang mengatakan% operator sudah ditinggalkan (namun dikatakan bahwa hal-hal lain sudah usang di bagian bawah). Anda mungkin lebih suka str.format dan tidak apa-apa, tetapi sampai ada PEP yang mengatakan itu sudah usang, tidak ada gunanya mengklaim itu ketika itu tidak.
Ben

Jawaban:

199

Ini adalah sintaks pemformatan string (yang dipinjam dari C).

Silakan lihat "PyFormat" :

Python mendukung nilai pemformatan menjadi string. Meskipun ini bisa termasuk ekspresi yang sangat rumit, penggunaan paling dasar adalah untuk memasukkan nilai ke dalam string dengan %splaceholder.

Sunting: Ini adalah contoh yang sangat sederhana:

#Python2
name = raw_input("who are you? ")
print "hello %s" % (name,)

#Python3+
name = input("who are you? ")
print("hello %s" % (name,))

The %sToken memungkinkan saya untuk memasukkan (dan berpotensi memformat) string. Perhatikan bahwa %stoken diganti dengan apa pun yang saya berikan ke string setelah %simbol. Perhatikan juga bahwa saya menggunakan tuple di sini juga (ketika Anda hanya memiliki satu string menggunakan tuple adalah opsional) untuk menggambarkan bahwa banyak string dapat dimasukkan dan diformat dalam satu pernyataan.

Andrew Hare
sumber
11
Perhatikan bahwa interpolasi string semacam ini sudah usang karena str.formatmetode yang lebih kuat .
Paulo Scardine
6
Dalam python3 raw_input () sekarang hanya input () bagi Anda yang mencoba sendiri.
Gothburz
1
Kenapa (name,), dan bukan adil name?
Cameron Hudson
112

Jawaban Andrew bagus.

Dan hanya untuk membantu Anda sedikit lebih banyak, inilah cara Anda menggunakan banyak pemformatan dalam satu string

"Hello %s, my name is %s" % ('john', 'mike') # Hello john, my name is mike".

Jika Anda menggunakan int bukan string, gunakan% d bukannya% s.

"My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12
sqram
sumber
2
bagus. % d menyelamatkan Anda dari casting str (int). tahu apa arti dari% s dan% d? Saya kira saya akan mengingat mereka sebagai string dan digit.
user391339
1
@ user391339 singkatan dari desimal :) mereka semua di sini docs.python.org/2/library/…
sqram
Saya tidak tahu untuk versi sebelumnya, tetapi setidaknya untuk 3.6 berfungsi sama bahkan jika Anda gunakan %spada bilangan bulat, itu hanya akan dikonversi menjadi string.
Lapin
@lapin kamu benar :). tetapi itu mungkin tidak selalu seperti yang Anda inginkan. Katakanlah Anda ingin membuat angka, misalnya. print('This number will be padded with 4 zeros: %05d ' % 1)- ini akan berhasil. print('This number will be padded with 4 zeros: %05s ' % 1)- ini tidak akan `
sqram
28

The formatMetode diperkenalkan pada Python 2.6. Ini lebih mampu dan tidak jauh lebih sulit untuk digunakan:

>>> "Hello {}, my name is {}".format('john', 'mike')
'Hello john, my name is mike'.

>>> "{1}, {0}".format('world', 'Hello')
'Hello, world'

>>> "{greeting}, {}".format('world', greeting='Hello')
'Hello, world'

>>> '%s' % name
"{'s1': 'hello', 's2': 'sibal'}"
>>> '%s' %name['s1']
'hello'
dansalmo
sumber
11
Jawaban ini akan ditingkatkan jika menjelaskan bahwa sintaks dalam pertanyaan adalah memformat teks dan kemudian menunjukkan metode yang lebih baru. Dengan begitu ia bisa berdiri sendiri. Memberikan contoh yang setara dengan contoh dalam pertanyaan juga akan menjadi nilai tambah.
Steve S
13

%smenunjukkan jenis konversi string ketika menggunakan kemampuan format string python. Lebih khusus lagi, %smengonversi nilai yang ditentukan ke string menggunakan str()fungsi. Bandingkan ini dengan %rjenis konversi yang menggunakan repr()fungsi untuk konversi nilai.

Lihatlah dokumen untuk pemformatan string .

Brandon E Taylor
sumber
13

%sdan %dadalah Penentu Format atau placeholder untuk memformat string / desimal / float dll.

Format specifier yang paling umum digunakan:

%s : string

%d : desimal

%f : mengapung

Kode penjelasan sendiri:

name = "Gandalf"
extendedName = "the Grey"
age = 84
IQ = 149.9
print('type(name):', type(name)) #type(name): <class 'str'>
print('type(age):', type(age))   #type(age): <class 'int'>   
print('type(IQ):', type(IQ))     #type(IQ): <class 'float'>   

print('%s %s\'s age is %d with incredible IQ of %f ' %(name, extendedName, age, IQ)) #Gandalf the Grey's age is 84 with incredible IQ of 149.900000 

#Same output can be printed in following ways:


print ('{0} {1}\'s age is {2} with incredible IQ of {3} '.format(name, extendedName, age, IQ))          # with help of older method
print ('{} {}\'s age is {} with incredible IQ of {} '.format(name, extendedName, age, IQ))          # with help of older method

print("Multiplication of %d and %f is %f" %(age, IQ, age*IQ)) #Multiplication of 84 and 149.900000 is 12591.600000          

#storing formattings in string

sub1 = "python string!"
sub2 = "an arg"

a = "i am a %s" % sub1
b = "i am a {0}".format(sub1)

c = "with %(kwarg)s!" % {'kwarg':sub2}
d = "with {kwarg}!".format(kwarg=sub2)

print(a)    # "i am a python string!"
print(b)   # "i am a python string!"
print(c)    # "with an arg!"
print(d)   # "with an arg!"
Om Sao
sumber
6

Sebagai jawaban atas pertanyaan kedua Anda: Apa yang dilakukan kode ini? ...

Ini adalah kode pemeriksaan kesalahan yang cukup standar untuk skrip Python yang menerima argumen baris perintah.

Jadi, ifpernyataan pertama diterjemahkan menjadi: jika Anda belum memberikan saya argumen, saya akan memberi tahu Anda bagaimana Anda harus memberikan saya argumen di masa depan, misalnya Anda akan melihat ini di layar:

Usage: myscript.py database-name

ifPernyataan selanjutnya memeriksa untuk melihat apakah 'nama database' yang Anda berikan ke skrip benar-benar ada pada sistem file. Jika tidak, Anda akan mendapatkan pesan seperti ini:

ERROR: Database database-name was not found!

Dari dokumentasi :

argv [0] adalah nama skrip (tergantung sistem operasi apakah ini nama path lengkap atau tidak). Jika perintah dieksekusi menggunakan opsi baris perintah -c ke interpreter, argv [0] diatur ke string '-c'. Jika tidak ada nama skrip yang diteruskan ke interpreter Python, argv [0] adalah string kosong.

mechanical_meat
sumber
2

Berikut adalah contoh yang bagus di Python3.

  >>> a = input("What is your name?")
  What is your name?Peter

  >>> b = input("Where are you from?")
  Where are you from?DE

  >>> print("So you are %s of %s" % (a, b))
  So you are Peter of DE
Gothburz
sumber