Pemformatan string dengan Python 3

114

Saya melakukan ini dengan Python 2:

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

Apa versi Python 3 ini?

Saya mencoba mencari contoh secara online tetapi saya terus mendapatkan versi Python 2.

JoseBazBaz
sumber
Itu tidak usang; kode Anda berfungsi dengan baik. Baca lebih lanjut di sini .
jackcogdill
32
Catatan untuk pembaca biasa: Tanda dolar tidak memiliki arti khusus. Ini hanya tanda dolar di sini. (Terima kasih Martijn Pieters)
kevinarpe
1
pyformat.info dan python-course.eu/python3_formatted_output.php (Bukan situs saya)
Christophe Roussy
1
Tanda dolar membuat ini sangat membingungkan ..
cchamberlain

Jawaban:

173

Berikut adalah dokumen tentang sintaks format "baru". Contohnya adalah:

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

Jika keduanya goalsdan penaltiesadalah bilangan bulat (format defaultnya ok), ini bisa disingkat menjadi:

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

Dan karena parameternya adalah bidang self, ada juga cara untuk melakukannya menggunakan satu argumen dua kali (seperti yang dicatat @Burhan Khalid di komentar):

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

Menjelaskan:

  • {} berarti hanya argumen posisi berikutnya, dengan format default;
  • {0}Berarti argumen dengan indeks 0, dengan format default;
  • {:d} adalah argumen posisi berikutnya, dengan format bilangan bulat desimal;
  • {0:d}adalah argumen dengan indeks 0, dengan format bilangan bulat desimal.

Ada banyak hal lain yang dapat Anda lakukan saat memilih argumen (menggunakan argumen bernama alih-alih posisi, mengakses bidang, dll) dan banyak opsi format juga (mengisi nomor, menggunakan ribuan pemisah, menunjukkan tanda atau tidak, dll). Beberapa contoh lain:

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

Catatan: Seperti yang ditunjukkan orang lain, format baru tidak menggantikan yang sebelumnya, keduanya tersedia di Python 3 dan versi Python 2 yang lebih baru juga. Beberapa orang mungkin mengatakan itu masalah preferensi, tetapi IMHO yang lebih baru jauh lebih ekspresif daripada yang lebih lama, dan harus digunakan setiap kali menulis kode baru (kecuali itu menargetkan lingkungan yang lebih lama, tentu saja).

mgibsonbr
sumber
9
Anda juga dapat melakukannya"({0.goals} goals, ${0.penalties})".format(self)
Burhan Khalid
Anda perlu menghilangkan '%' di luar kurung kurawal, misalnya {: .2f%} -> {: .2f}%
SuperElectric
@SuperElectric maksudmu, di baris ini: "conversion rate: {:.2%}".format(self.goals / self.shots)? Bekerja dengan baik untuk saya karena ... (Python 3.4) Perhatikan bahwa tidak ada fdi dalamnya, saya meminta untuk memformat sebagai persentase, bukan sebagai angka floating point.
mgibsonbr
Kamu benar; sepertinya bekerja dengan Python 3.4, jadi tidak apa-apa karena OP bertanya tentang Python3. Saya baru saja menemukan itu tidak berfungsi dengan python 2.7.6. "{:.2f}%".format(float_num)bekerja dengan baik untuk keduanya.
SuperElectric
1
@JohnSchmitt Ya, contoh ini seharusnya memberikan keluaran yang sama persis dengan kode yang diberikan dalam pertanyaan. Ini $tidak memiliki arti khusus di sini, baik dalam sintaks format lama maupun dalam yang baru, sehingga harus ada dalam string yang dihasilkan, tidak berubah.
mgibsonbr
67

Python 3.6 sekarang mendukung interpolasi string literal singkatan dengan PEP 498 . Untuk kasus penggunaan Anda, sintaks baru adalah:

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

Ini mirip dengan .formatstandar sebelumnya , tetapi memungkinkan seseorang dengan mudah melakukan hal - hal seperti :

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

Baris itu berfungsi sebagaimana adanya di Python 3.

>>> 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)'
Mark Reed
sumber
BAIK. KEREN. Setelah saya memposting pertanyaan, saya melanjutkan pencarian saya dan menemukan bahwa kita harus melakukan {% d} daripada hanya% d, apakah itu juga benar? Atau apakah cara Python2 satu-satunya cara untuk melakukannya?
JoseBazBaz
2
Python 3 memperkenalkan sintaks baru - yaitu tanda kurung kurawal - tetapi Anda tidak diharuskan untuk menggunakannya. Anda dapat menggunakan yang lama atau yang baru. Tapi mereka berbeda; jika Anda menggunakan rambut ikal, Anda tidak menggunakan tanda persen.
Mark Reed
2

Saya suka pendekatan ini

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)

Perhatikan d dan s yang ditambahkan ke masing-masing tanda kurung.

keluarannya adalah:

I scored 3 goals and took 5 penalties
fullstacklife
sumber