Python 3'te dize biçimlendirme


114

Bunu Python 2'de yapıyorum:

"(%d goals, $%d)" % (self.goals, self.penalties)

Bunun Python 3 sürümü nedir?

Çevrimiçi örnekler aramayı denedim ama Python 2 sürümlerini almaya devam ettim.


Kullanımdan kaldırılmadı; kodunuz iyi çalışıyor. Daha fazlasını buradan okuyun .
jackcogdill

32
Sıradan okuyucular için not: Dolar işaretinin özel bir anlamı yoktur. Burada sadece bir dolar işareti. (Teşekkürler Martijn Pieters)
kevinarpe


1
Dolar işareti bunu çok kafa karıştırıcı hale getirdi ..
cchamberlain

Yanıtlar:


173

Burada , "yeni" biçim sözdizimiyle ilgili belgeler bulunmaktadır . Bir örnek şöyle olabilir:

"({:d} goals, ${:d})".format(self.goals, self.penalties)

İkisi de goalsve penaltiestamsayı ise (yani, varsayılan biçimleri uygunsa), kısaltılabilir:

"({} goals, ${})".format(self.goals, self.penalties)

Ve parametreler alanları olduğu için self, bunu iki kez tek bir argüman kullanarak yapmanın bir yolu da var (@ Burhan Khalid'in yorumlarda belirttiği gibi):

"({0.goals} goals, ${0.penalties})".format(self)

İzahı:

  • {} varsayılan format ile sadece bir sonraki konumsal argüman anlamına gelir;
  • {0}0varsayılan formatta indeksli argüman anlamına gelir ;
  • {:d} ondalık tamsayı formatına sahip bir sonraki konumsal bağımsız değişkendir;
  • {0:d}0ondalık tamsayı formatına sahip indeksli bağımsız değişkendir .

Bir argüman seçerken (konumsal argümanlar yerine adlandırılmış argümanlar kullanmak, alanlara erişmek vb.) Ve birçok format seçeneği (sayıyı doldurmak, binlik ayırıcı kullanmak, işareti göstermek veya göstermemek, vb.) Yapabileceğiniz başka birçok şey vardır. Diğer bazı örnekler:

"({goals} goals, ${penalties})".format(goals=2, penalties=4)
"({goals} goals, ${penalties})".format(**self.__dict__)

"first goal: {0.goal_list[0]}".format(self)
"second goal: {.goal_list[1]}".format(self)

"conversion rate: {:.2f}".format(self.goals / self.shots) # '0.20'
"conversion rate: {:.2%}".format(self.goals / self.shots) # '20.45%'
"conversion rate: {:.0%}".format(self.goals / self.shots) # '20%'

"self: {!s}".format(self) # 'Player: Bob'
"self: {!r}".format(self) # '<__main__.Player instance at 0x00BF7260>'

"games: {:>3}".format(player1.games)  # 'games: 123'
"games: {:>3}".format(player2.games)  # 'games:   4'
"games: {:0>3}".format(player2.games) # 'games: 004'

Not: Diğerlerinin de belirttiği gibi, yeni biçim öncekinin yerini almaz, her ikisi de hem Python 3'te hem de Python 2'nin yeni sürümlerinde mevcuttur. Bazıları bunun bir tercih meselesi olduğunu söyleyebilir, ancak daha yeni olan IMHO, eskisinden çok daha anlamlı ve her yeni kod yazarken kullanılmalıdır (tabii ki eski ortamları hedeflemediği sürece).


9
Şunları da yapabilirsiniz"({0.goals} goals, ${0.penalties})".format(self)
Burhan Khalid

Küme parantezlerinin dışına '%' işaretini almanız gerekir, örneğin {: .2f%} -> {: .2f}%
SuperElectric

@SuperElectric bu çizgide, demek: "conversion rate: {:.2%}".format(self.goals / self.shots)? Benim için olduğu gibi iyi çalışıyor ... (Python 3.4) fİçinde hiç olmadığını unutmayın, yüzdelik olarak biçimlendirmek istiyorum, bir kayan nokta sayısı olarak değil.
mgibsonbr

Haklısın; Python 3.4'te çalışıyor gibi görünüyor, bu yüzden OP Python3'ü sorduğu için sorun değil. Python 2.7.6 ile çalışmadığını buldum. "{:.2f}%".format(float_num)her ikisi için de iyi çalışıyor.
SuperElectric

1
@JohnSchmitt Evet, bu örneğin soruda verilen kodla aynı çıktıyı vermesi gerekiyordu. $Eski biçimi sözdiziminde ne de yeni de ne, burada özel bir anlamı vardır, böylece değişmemiş, oluşturulan dizede bulunmalıdır.
mgibsonbr

67

Python 3.6 artık PEP 498 ile kısa metrajlı dize enterpolasyonunu destekliyor . Kullanım durumunuz için yeni sözdizimi basitçe:

f"({self.goals} goals, ${self.penalties})"

Bu, önceki .formatstandarda benzer , ancak aşağıdakiler gibi şeyler kolayca yapılmasına izin verir :

>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal('12.34567')
>>> f'result: {value:{width}.{precision}}'
'result:      12.35'

12

Bu satır Python 3'te olduğu gibi çalışır.

>>> sys.version
'3.2 (r32:88445, Oct 20 2012, 14:09:29) \n[GCC 4.5.2]'
>>> "(%d goals, $%d)" % (self.goals, self.penalties)
'(1 goals, $2)'

TAMAM. GÜZEL. Soruyu gönderdikten sonra aramama devam ediyordum ve sadece% d yerine {% d} yapmamız gerektiğini fark ettim, bu da doğru mu? Yoksa bunu yapmanın tek yolu Python2 mi?
JoseBazBaz

2
Python 3 yeni bir sözdizimi sunar - bu küme parantezleridir - ancak onu kullanmanız gerekmez. Eski veya yeniyi kullanabilirsiniz. Ama farklılar; curlies kullanıyorsanız, yüzde işaretleri kullanmazsınız.
Mark Reed

2

Bu yaklaşımı beğendim

my_hash = {}
my_hash["goals"] = 3 #to show number
my_hash["penalties"] = "5" #to show string
print("I scored %(goals)d goals and took %(penalties)s penalties" % my_hash)

Sırasıyla köşeli parantezlere eklenen d ve s'ye dikkat edin.

çıktı:

I scored 3 goals and took 5 penalties
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.