% S bir python biçim dizesinde ne anlama geliyor?


167

%sPython'da ne anlama geliyor? Ve aşağıdaki kod parçası ne işe yarar?

Örneğin...

 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])

4
%Operatör daha güçlü lehine kullanımdan kaldırılmıştır str.formatyöntemle, bkz PEP-3101 .
Paulo Scardine

35
Aslında PEP "Python 3.0'da% operatörü daha güçlü bir dize biçimlendirme yöntemi ile desteklenir" der ve Python 2.6'ya desteklenir. Nereden geldiğimde "eklenmiş" anlamına gelir, değiştirilmez. PEP "yerine geçmiştir" demez ve PEP'in hiçbir bölümünde% operatörünün kullanımdan kaldırıldığı anlamına gelmez (yine de başka şeylerin altından kaldırıldığı söylenir). Str.format'ı tercih edebilirsiniz ve bu iyi, ama itiraz edildiğini söyleyen bir PEP olana kadar, olmadığı zaman olduğunu iddia etmenin bir anlamı yok.
Ben

Yanıtlar:


199

Bir dize biçimlendirme sözdizimidir (C'den ödünç alır).

Lütfen "PyFormat" a bakın :

Python, değerleri dizelere biçimlendirmeyi destekler. Bu çok karmaşık ifadeler içermesine rağmen, en temel kullanım %syer tutucuyla bir dizeye değerler eklemektir .

Düzenleme: İşte gerçekten basit bir örnek:

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

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

%sBelirteç bana bir dize takın (ve potansiyel olarak biçimlendirmek) için izin verir. %sBelirtecin, %simgeden sonra dizeye geçirdiğim her şeyle değiştirildiğine dikkat edin . Ayrıca burada da bir tuple kullanıyorum (sadece bir tuple kullanarak bir dize isteğe bağlı olduğunda) birden fazla dize eklenebilir ve bir deyimde biçimlendirilmiş olduğunu göstermek için dikkat edin.


11
Bu tür dize enterpolasyonunun daha güçlü str.formatyöntem lehine kullanımdan kaldırıldığını unutmayın .
Paulo Scardine

6
Python3'te raw_input () artık sadece kendiniz için uğraşanlar için input () 'dir.
Gothburz

1
Neden (name,)ve sadece name?
Cameron Hudson

112

Andrew'un cevabı iyi.

Ve size biraz daha fazla yardımcı olmak için, bir dizede birden çok biçimlendirmeyi nasıl kullandığınız

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

Dize yerine ints kullanıyorsanız,% s yerine% d kullanın.

"My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12

2
Güzel. % d sizi str (int) dökümünden kurtarır. % s ve% d ne anlama geliyor? sanırım onları string ve digit olarak hatırlayacağım.
user391339

1
@ user391339 ondalık anlamına gelir :) hepsi burada docs.python.org/2/library/…
sqram

Ben önceki sürümleri için bilmiyorum, ama en azından 3.6 için %stamsayılarda kullanmak bile aynı çalışır, sadece bir dizeye dönüştürülecektir.
Mart'ta lapin

@lapin haklısın :). ama bu her zaman istediğiniz şey olmayabilir. Diyelim ki bir rakam yazmak istiyorsunuz. print('This number will be padded with 4 zeros: %05d ' % 1)- bu çalışacak. print('This number will be padded with 4 zeros: %05s ' % 1)- bu olmayacak
sqm

28

formatYöntem Python 2.6 tanıtıldı. Daha yeteneklidir ve kullanımı çok daha zor değildir:

>>> "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'

11
Sorudaki sözdiziminin metni biçimlendirdiğini ve ardından daha yeni yöntemi gösterdiğini açıklarsa bu yanıt geliştirilecektir . Bu şekilde kendi başına durabilirdi. Sorudaki örneğe eşdeğer bir örnek vermek de bir artı olacaktır.
Steve S

13

%s, python'un dize biçimlendirme yeteneklerini kullanırken dönüştürme türünde bir dize belirtir . Daha spesifik olarak, işlevi %skullanarak belirtilen bir değeri bir dizeye dönüştürür str(). %rBunu, repr()değer dönüştürme işlevini kullanan dönüşüm türüyle karşılaştırın .

Dize biçimlendirme için dokümanlara göz atın .


13

%sve %ddizeleri / ondalıkları / kayan öğeleri vb. biçimlendirmek için Biçim Belirleyicileri veya yer tutuculardır.

En yaygın kullanılan Format belirleyici:

%s : string

%d : ondalıklar

%f : şamandıra

Kendini açıklayan kod:

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!"

6

İkinci sorunuza cevap olarak: Bu kod ne işe yarar? ...

Bu, komut satırı bağımsız değişkenlerini kabul eden bir Python betiği için oldukça standart bir hata denetleme kodudur.

İlk ififade şu anlama gelir: Bana bir argüman iletmediyseniz, size gelecekte bana nasıl bir argüman iletmeniz gerektiğini söyleyeceğim, örneğin bunu ekranda göreceksiniz:

Usage: myscript.py database-name

Sonraki ififade, betiğe ilettiğiniz 'veritabanı adı'nın gerçekten dosya sisteminde olup olmadığını kontrol eder. Değilse, şöyle bir mesaj alırsınız:

ERROR: Database database-name was not found!

Gönderen belgeler :

argv [0] komut dosyası adıdır (işletim sisteminin tam yol adı olup olmadığına bağımlıdır). Komut, yorumlayıcıya -c komut satırı seçeneği kullanılarak yürütüldüyse, argv [0] '-c' dizesine ayarlanır. Python yorumlayıcısına komut dosyası adı geçmediyse, argv [0] boş dizedir.


2

İşte Python3'te iyi bir örnek.

  >>> 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.