Jak drukować jak printf w Pythonie3?

125

W Pythonie 2 użyłem:

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

Próbowałem:

print("a=%d,b=%d") % (f(x,n),g(x,n))
Mike L.
źródło
11
%zawsze był operatorem łańcuchowym, niezwiązanym z printinstrukcją. Możesz na przykład utworzyć ciąg za pomocą s="a=%d,b=%d"%(f(x,n),g(x,n)), a następnie wydrukować ten ciąg za pomocą print s.
chepner

Odpowiedzi:

207

W Pythonie2 printbyło słowo kluczowe, które wprowadzało instrukcję:

print "Hi"

W Pythonie3 printjest to funkcja, która może zostać wywołana:

print ("Hi")

W obu wersjach %jest operatorem, który wymaga łańcucha po lewej stronie i wartości lub krotki wartości lub obiektu mapującego (takiego jak dict) po prawej stronie.

Twoja linia powinna więc wyglądać następująco:

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

Ponadto zaleceniem dla Python3 i nowszych jest użycie {}formatowania -styl zamiast formatowania -styl %:

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

Python 3.6 wprowadza kolejny paradygmat formatowania ciągów : f-strings .

print(f'a={f(x,n):d}, b={g(x,n):d}')
Robᵩ
źródło
14
lub: print('a={first:4.2f}, b={second:03d}'.format(first=f(x,n),second=g(x,n))) gdzie ten przykład pokazuje, jak możesz użyć modyfikatorów w stylu printf i nadal używać słów kluczowych.
fbicknel
2
@rapt, ma kilka ogromnych zalet. Nie najmniej ważne jest to, że możesz odwoływać się do tego samego formatu tylko wielokrotnie lub w niewłaściwej kolejności: „{1}, {1}, {0} i {1}” .format („jaja”, „spam”) = = „spam, spam, jajka i spam”
Dr Xorile,
53

Najbardziej zalecanym sposobem jest użycie formatmetody. Przeczytaj więcej na ten temat tutaj

a, b = 1, 2

print("a={0},b={1}".format(a, b))
na czworo
źródło
28

Prosta funkcja printf () z książki O'Reilly's Python Cookbook .

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

Przykładowe dane wyjściowe:

i = 7
pi = 3.14159265359
printf("hi there, i=%d, pi=%.2f\n", i, pi)
# hi there, i=7, pi=3.14
stackoverflowuser2010
źródło
Heh ... PRINTi FORMAT...? Cofnij się w czasie 60+ lat do czasów
FORTRANA
1
Link do książki kucharskiej O'Reilly jest martwy.
Ideogram
22

Python 3.6 wprowadził f-stringi do interpolacji liniowej. Jeszcze ładniejsze jest to, że rozszerzył składnię, aby umożliwić również specyfikatory formatu z interpolacją. Coś, nad czym pracowałem, przeglądając to w Google (i natknąłem się na to stare pytanie!):

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

PEP 498 ma szczegóły. I ... posortował moje zdenerwowanie ze specyfikatorami formatu w innych językach - pozwala na specyfikatory, które same mogą być wyrażeniami! Yay! Zobacz: Specyfikatory formatu .

kva1966
źródło
2
Uwaga: jest to również najbardziej wydajny sposób wprowadzania zmiennych do łańcuchów.
Rotareti
17

Prosty przykład:

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

Donald Derek
źródło
11

Prostszy.

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

Następnie:

printf("Hello, this is my name %s and my age %d", "Martin", 20)
Famory Toure
źródło
2

Ponieważ twój %jest poza print(...)nawiasami, próbujesz wstawić zmienne w wyniku swojej printrozmowy. print(...)powraca None, więc to nie zadziała, i jest też drobna kwestia, że ​​już wydrukowałeś swój szablon do tego czasu, a podróże w czasie są zabronione przez prawa wszechświata, w którym zamieszkujemy.

Cała rzecz, którą chcesz wydrukować, łącznie z %operandem i jego operandem, musi znajdować się wewnątrz twojego print(...)wywołania, aby łańcuch mógł zostać zbudowany przed jego wydrukowaniem.

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

Dodałem kilka dodatkowych spacji, aby było wyraźniej (choć nie są one konieczne i generalnie nie są uważane za dobry styl).

kindall
źródło
2

Innymi słowy printf nieobecny w Pythonie ... Jestem zaskoczony! Najlepszy kod to

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

Dzięki temu formularzowi nie można drukować \ n. Wszyscy inni nie. Dlatego druk jest złym operatorem. A także potrzebujesz pisać argumenty w specjalnej formie. Powyżej nie ma żadnych wad w działaniu. Jest to standardowa zwykła forma funkcji printf.

Anatolij
źródło
1
Możesz w trywialny sposób uniknąć \ nw druku. Po prostu dodaj „,” po wartości do wydrukowania.
Hejazzman
1
print("Name={}, balance={}".format(var-name, var-balance))
Użytkownik707
źródło