Bagaimana cara mencetak seperti printf di Python3?

125

Dalam Python 2 saya menggunakan:

print "a=%d,b=%d" % (f(x,n),g(x,n))

Saya sudah mencoba:

print("a=%d,b=%d") % (f(x,n),g(x,n))
Mike L
sumber
11
%selalu menjadi operator string, tidak terkait dengan printpernyataan itu. Anda dapat, misalnya, membuat string dengan s="a=%d,b=%d"%(f(x,n),g(x,n)), lalu mencetak string itu dengan print s.
chepner

Jawaban:

207

Di Python2, printadalah kata kunci yang memperkenalkan pernyataan:

print "Hi"

Dalam Python3, printadalah fungsi yang dapat dipanggil:

print ("Hi")

Di kedua versi, %adalah operator yang membutuhkan string di sisi kiri dan nilai atau tupel nilai atau objek pemetaan (seperti dict) di sisi kanan.

Jadi, baris Anda seharusnya terlihat seperti ini:

print("a=%d,b=%d" % (f(x,n),g(x,n)))

Juga, rekomendasi untuk Python3 dan yang lebih baru adalah menggunakan {}pemformatan -style alih-alih pemformatan -style %:

print('a={:d}, b={:d}'.format(f(x,n),g(x,n)))

Python 3.6 memperkenalkan paradigma pemformatan string lain: f-string .

print(f'a={f(x,n):d}, b={g(x,n):d}')
Robᵩ
sumber
14
atau: di print('a={first:4.2f}, b={second:03d}'.format(first=f(x,n),second=g(x,n))) mana contoh ini menunjukkan bagaimana Anda dapat menggunakan pengubah gaya printf dan masih menggunakan kata kunci.
fbicknel
2
@Rapt, ini memiliki beberapa keuntungan besar. Tidak sedikit dari itu Anda dapat mereferensikan format yang sama hanya beberapa kali atau rusak: "{1}, {1}, {0}, dan {1}" .format ("telur", "spam") = = "spam, spam, telur, dan spam"
Dr Xorile
53

Cara yang paling direkomendasikan untuk dilakukan adalah menggunakan formatmetode. Baca lebih lanjut di sini

a, b = 1, 2

print("a={0},b={1}".format(a, b))
thethourtheye
sumber
28

Fungsi printf () sederhana dari Cookbook Python O'Reilly .

import sys
def printf(format, *args):
    sys.stdout.write(format % args)

Contoh output:

i = 7
pi = 3.14159265359
printf("hi there, i=%d, pi=%.2f\n", i, pi)
# hi there, i=7, pi=3.14
stackoverflowuser2010
sumber
Heh ... PRINTdan FORMAT...? Kembali ke masa 60+ tahun hingga hari-hari FORTRAN :)
Skeeve
1
Tautan ke buku masak O'Reilly sudah mati.
Ideogram
22

Python 3.6 memperkenalkan f-string untuk interpolasi inline. Apa yang lebih bagus lagi adalah memperpanjang sintaks untuk juga memungkinkan penentu format dengan interpolasi. Sesuatu yang telah saya kerjakan ketika saya mencari di Google (dan menemukan pertanyaan lama ini!):

print(f'{account:40s} ({ratio:3.2f}) -> AUD {splitAmount}')

PEP 498 memiliki detailnya. Dan ... itu mengurutkan peeve peliharaan saya dengan penentu format dalam bahasa lain - memungkinkan penspesifikasi yang dapat berupa ekspresi! Yay! Lihat: Format Penentu .

kva1966
sumber
2
Catatan: Ini juga cara paling berkinerja untuk menyuntikkan variabel ke dalam string.
Rotareti
17

Contoh sederhana:

print("foo %d, bar %d" % (1,2))

Donald Derek
sumber
11

Yang lebih sederhana.

def printf(format, *values):
    print(format % values )

Kemudian:

printf("Hello, this is my name %s and my age %d", "Martin", 20)
Famory Toure
sumber
2

Karena Anda %berada di luar print(...)tanda kurung, Anda mencoba memasukkan variabel Anda ke dalam hasilprint panggilan Anda . print(...)kembaliNone , jadi ini tidak akan berhasil, dan ada juga hal kecil dari Anda yang sudah mencetak template Anda saat ini dan perjalanan waktu dilarang oleh hukum alam semesta yang kita huni.

Seluruh hal yang ingin Anda cetak, termasuk %operan dan, perlu di dalamprint(...) panggilan Anda , sehingga string dapat dibangun sebelum dicetak.

print( "a=%d,b=%d" % (f(x,n), g(x,n)) )

Saya telah menambahkan beberapa ruang ekstra untuk membuatnya lebih jelas (meskipun mereka tidak perlu dan umumnya tidak dianggap gaya yang baik).

baik hati
sumber
2

Dengan kata lain printf absen dalam python ... Saya terkejut! Kode terbaik adalah

def printf(format, *args):
    sys.stdout.write(format % args)

Karena formulir ini memungkinkan untuk tidak mencetak \ n. Semua yang lain tidak. Itu sebabnya cetak adalah operator yang buruk. Dan Anda juga perlu menulis args dalam bentuk khusus. Tidak ada kerugian dalam fungsi di atas. Ini adalah bentuk fungsi printf standar yang biasa.

Anatoliy
sumber
1
Anda dapat dengan sepele menghindar \ n di media cetak. Cukup tambahkan "," setelah nilai yang akan dicetak.
Hejazzman
1
print("Name={}, balance={}".format(var-name, var-balance))
User707
sumber