Python3'te printf gibi nasıl yazdırılır?


125

Python 2'de şunları kullandım:

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

Denedim:

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

11
%her zaman bir dize operatörü olmuştur, printifadeyle ilgili değildir . Örneğin, ile bir dizi oluşturabilir s="a=%d,b=%d"%(f(x,n),g(x,n))ve ardından bu dizeyi ile yazdırabilirsiniz print s.
chepner

Yanıtlar:


207

Python2'de, printbir ifadeyi tanıtan bir anahtar kelimeydi :

print "Hi"

Python3'te printçağrılabilen bir işlevdir:

print ("Hi")

Her iki versiyonda da, %sol tarafta bir dize ve sağ tarafta bir değer veya değerler demeti veya bir eşleme nesnesi (benzeri dict) gerektiren bir operatördür .

Öyleyse, çizginiz şöyle görünmeli:

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

Ayrıca, Python3 ve daha yeni sürümler için öneri, -stilli {}biçimlendirme yerine -stilli biçimlendirmeyi kullanmaktır %:

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

Python 3.6, başka bir dize biçimlendirme paradigması sunar: f dizeleri .

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

14
veya: print('a={first:4.2f}, b={second:03d}'.format(first=f(x,n),second=g(x,n))) Bu örnek, printf tarzı değiştiricileri nasıl kullanabileceğinizi ve yine de anahtar kelimeleri nasıl kullanabileceğinizi gösterir .
fbicknel

2
@rapt, bazı büyük avantajları var. En önemlisi, aynı biçime birden çok kez veya sıra dışı başvuruda bulunabilirsiniz: "{1}, {1}, {0} ve {1}" .format ("yumurta", "spam") = = "spam, spam, yumurta ve spam"
Dr Xorile

53

Bunu yapmanın en çok tavsiye edilen yolu formatyöntemi kullanmaktır . Buradan daha fazlasını okuyun

a, b = 1, 2

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

28

O'Reilly'nin Python Yemek Kitabından basit printf () işlevi .

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

Örnek çıktı:

i = 7
pi = 3.14159265359
printf("hi there, i=%d, pi=%.2f\n", i, pi)
# hi there, i=7, pi=3.14

Heh ... PRINTve FORMAT...? Zamanda geriye 60+ yıldan FORTRAN günlerine :)
Skeeve

1
O'Reilly'nin yemek kitabının bağlantısı kesildi.
Ideogram

22

Python 3.6, satır içi enterpolasyon için f dizelerini tanıttı. Daha da hoş olan, sözdizimini enterpolasyonlu format belirticilere de izin verecek şekilde genişletmesidir. Bunu Google'da araştırırken (ve bu eski soruyla karşılaşırken!) Üzerinde çalıştığım bir şey:

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

KEP 498 detaylara sahiptir. Ve ... evcil hayvanımı diğer dillerdeki format belirleyicileriyle sıraladı - kendilerinin de ifade olabileceği belirteçlere izin veriyor! Yaşasın! Bakınız: Biçim Tanımlayıcıları .


2
Not: Bu aynı zamanda değişkenleri dizelere enjekte etmenin en performanslı yoludur.
Rotareti


11

Daha basit olanı.

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

Sonra:

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

2

Senin Çünkü %dışında print(...)parantez, sen içine Değişken eklemek için çalışıyoruz sonucu sizin bir printçağrı. print(...)geri dönüyor None, bu yüzden bu işe yaramayacak ve ayrıca, bu zamana kadar şablonunuzu zaten yazdırmış olmanız ve yaşadığımız evrenin yasaları tarafından yasaklanan zaman yolculuğuna dair küçük bir mesele var.

İstediğiniz her şey dahil yazdırmak %olmak ve işlenen, ihtiyaçlarını içine senin print(...)yazdırıldığında önce dize inşa edilebilir böylece, çağrı.

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

Daha net hale getirmek için fazladan birkaç boşluk ekledim (ancak bunlar gerekli değil ve genellikle iyi bir stil olarak görülmüyor).


2

Python'da olmayan diğer kelimeler printf ... Şaşırdım! En iyi kod

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

Bu form nedeniyle \ n yazdırılamaz. Diğerleri hayır. Bu yüzden baskı kötü bir operatördür. Ayrıca özel formda argümanlar yazmanız gerekir. Yukarıdaki fonksiyonun herhangi bir dezavantajı yoktur. Bu, standart bir printf işlevi biçimidir.


1
Baskıda \ n önemsiz bir şekilde önleyebilirsiniz. Yazdırılacak değerin arkasına "," eklemeniz yeterlidir.
Hejazzman

1
print("Name={}, balance={}".format(var-name, var-balance))
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.