Python'da dize biçimlendirme için birden fazla bağımsız değişken kullanma (ör. '% S…% s')


174

Ben benzeyen bir dize var '%s in %s've ben iki farklı% s böylece argümanları ayırmak bilmek istiyorum. Java'dan gelen aklım şu şekilde ortaya çıktı:

'%s in %s' % unicode(self.author),  unicode(self.publication)

Ama bu işe yaramıyor, Python'da nasıl görünüyor?

Yanıtlar:


191

Mark Cidade'nin cevabı doğru - bir demet sağlamanız gerekiyor.

Ancak Python 2.6 den itibaren kullanabileceğiniz formatyerine %:

'{0} in {1}'.format(unicode(self.author,'utf-8'),  unicode(self.publication,'utf-8'))

%Dizeleri biçimlendirmek için kullanımı artık desteklenmemektedir.

Bu dize biçimlendirme yöntemi, Python 3.0'daki yeni standarttır ve yeni kodda Dize Biçimlendirme İşlemleri'nde açıklanan% biçimlendirmesine tercih edilmelidir.


5
Ayrıca Python 2.7 ile başlayarak dizin numarasını düşürebilir, yani düz '{} in {}'biçimli bir dize kullanabilir.
Cristian Ciupitu

121

Birden fazla argüman kullanıyorsanız bunun bir demet halinde olması gerekir (ekstra parantezlere dikkat edin):

'%s in %s' % (unicode(self.author),  unicode(self.publication))

EOL'nin işaret ettiği gibi, unicode()işlev genellikle ascii kodlamasını varsayılan olarak kabul eder, bu nedenle ASCII olmayan karakterleriniz varsa, kodlamayı açıkça geçmek daha güvenlidir:

'%s in %s' % (unicode(self.author,'utf-8'),  unicode(self.publication('utf-8')))

Python 3.0'dan itibaren, str.format()sözdizimini kullanmak tercih edilir :

'{0} in {1}'.format(unicode(self.author,'utf-8'),unicode(self.publication,'utf-8'))

60

Birden çok argüman için bir demet / eşleme nesnesinde format

Aşağıdakiler dokümantasyondan alıntıdır:

Verilen format % values, %dönüşüm özellikleri içinde formatsıfır veya daha fazla unsurları ile değiştirilir values. Etki, sprintf()C dilinde kullanıma benzer .

Eğer formattek bir argüman gerektirir değerleri olmayan tek bir kayıt düzeni bir nesne olabilir. Aksi takdirde, değerler tarafından belirtilen öğelerin tam sayı ile bir tanımlama grubu olmalıdır formatdize , ya da tek bir eşleme nesnesi (örneğin, bir sözlük).

Referanslar


Açık str.formatyerine%

%Operatöre daha yeni bir alternatif kullanmaktır str.format. İşte belgelerden bir alıntı:

str.format(*args, **kwargs)

Bir dize biçimlendirme işlemi gerçekleştirin. Bu yöntemin çağrıldığı dize, hazır metinler veya kaşlı ayraçlarla ayrılmış değiştirme alanları içerebilir {}. Her değiştirme alanı, konum bağımsız değişkeninin sayısal dizinini veya bir anahtar kelime bağımsız değişkeninin adını içerir. Her değiştirme alanının karşılık gelen bağımsız değişkenin dize değeri ile değiştirildiği dizenin bir kopyasını döndürür.

Bu yöntem Python 3.0'daki yeni standarttır ve %biçimlendirmeye tercih edilmelidir .

Referanslar


Örnekler

İşte bazı kullanım örnekleri:

>>> '%s for %s' % ("tit", "tat")
tit for tat

>>> '{} and {}'.format("chicken", "waffles")
chicken and waffles

>>> '%(last)s, %(first)s %(last)s' % {'first': "James", 'last': "Bond"}
Bond, James Bond

>>> '{last}, {first} {last}'.format(first="James", last="Bond")
Bond, James Bond

Ayrıca bakınız


Ben bunu test etmek için bir yolu yok (ben çok Python bilmiyorum), ama örnekleri gibi bir şey '{self.author} in {self.publication}'.format(self=self)"çalışması" gerektiğini düşündürmektedir . Her şeyden emin değilim unicode.
poligeno

1
Evet, özniteliklere (ve ayrıca dizinlere) erişebilirsiniz. Bkz. Docs.python.org/library/string.html#formatstrings Örneğinizde ilkini{first[0]} almak için kullanılmış olabilirsiniz J.
Duncan

10

Değerleri parantez içine almanız yeterlidir:

'%s in %s' % (unicode(self.author),  unicode(self.publication))

Burada, ilk kez yer alacaktır. Ve saniye , kullanılacaktır.%sunicode(self.author)%sunicode(self.publication)

Not: iyilik etmelidir string formattingüzerinde %Notation'ý. Daha fazla bilgi burada


İnsanlar hala %so zaman önermek inanamıyorumformat
user1767754

8

Şimdiye kadar gönderilen cevapların bazılarında önemli bir sorun var: unicode()varsayılan kodlamanın kodunu çözer, bu genellikle ASCII'dir; aslında, unicode()verilen baytları karakterlere dönüştürerek "anlamlandırmaya" çalışır. Bu nedenle, esasen önceki yanıtlar tarafından önerilen aşağıdaki kod, makinemde başarısız oluyor:

# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))

verir:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    print '{0}'.format(unicode(author))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

Hata author, yalnızca ASCII bayt içermemesi (yani [0; 127] içindeki değerlerle) ve unicode()varsayılan olarak ASCII'den (birçok makinede) kod çözülmesinden kaynaklanır.

Sağlam bir çözüm, alanlarınızda kullanılan kodlamayı açıkça vermektir; UTF-8'i örnek olarak alarak:

u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))

(veya uUnicode sonucunu veya bayt dizesini isteyip istemediğinize bağlı olarak , ilk harf olmadan ).

Bu noktada, biçimlendirme sırasında kodu çözmek yerine authorve publicationalanlarının Unicode dizeleri olmasını düşünmek isteyebilirsiniz .


5

Python2 için bunu da yapabilirsiniz

'%(author)s in %(publication)s'%{'author':unicode(self.author),
                                  'publication':unicode(self.publication)}

yerine koymak için çok fazla argümanınız varsa (özellikle uluslararasılaştırma yapıyorsanız)

Python2.6 ve sonraki sürümler .format()

'{author} in {publication}'.format(author=self.author,
                                   publication=self.publication)

4

Ayrıca temiz ve basit kullanabilirsiniz (ama yanlış! Çünkü formatMark Byers'ın dediği gibi kullanmalısınız ):

print 'This is my %s formatted with %d arguments' % ('string', 2)

3

Tamlık için, python 3.6'da PEP-498'de f-string eklenmiştir . Bu dizeler sayesinde

minimal bir sözdizimi kullanarak ifadeleri dize değişmezlerinin içine yerleştirir.

Bu, örneğiniz için şunları da kullanabileceğiniz anlamına gelir:

f'{self.author} in {self.publication}'
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.