Làm thế nào để in như printf trong Python3?


125

Trong Python 2 tôi đã sử dụng:

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

Tôi đã thử:

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

11
%luôn luôn là một toán tử chuỗi, không liên quan đến printcâu lệnh. Ví dụ, bạn có thể tạo một chuỗi bằng s="a=%d,b=%d"%(f(x,n),g(x,n)), sau đó in chuỗi đó bằng print s.
chepner

Câu trả lời:


206

Trong Python2, printlà một từ khóa giới thiệu một tuyên bố:

print "Hi"

Trong Python3, printlà một hàm có thể được gọi:

print ("Hi")

Trong cả hai phiên bản, %là một toán tử yêu cầu một chuỗi ở phía bên trái và một giá trị hoặc một bộ giá trị hoặc một đối tượng ánh xạ (như dict) ở phía bên phải.

Vì vậy, dòng của bạn phải trông như thế này:

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

Ngoài ra, khuyến nghị cho Python3 và mới hơn là sử dụng {}định dạng kiểu thay vì %định dạng kiểu:

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

Python 3.6 giới thiệu một mô hình định dạng chuỗi khác: chuỗi f .

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

14
hoặc: print('a={first:4.2f}, b={second:03d}'.format(first=f(x,n),second=g(x,n))) nơi ví dụ này cho thấy cách bạn có thể sử dụng công cụ sửa đổi kiểu printf vẫn sử dụng từ khóa.
fbicknel

2
@rapt, nó có một số lợi thế rất lớn. Không phải là ít nhất trong số đó bạn chỉ có thể tham chiếu cùng định dạng nhiều lần hoặc không theo thứ tự: "{1}, {1}, {0} và {1}" .format ("trứng", "spam") = = "thư rác, thư rác, trứng và thư rác"
Tiến sĩ Xorile

53

Cách tốt nhất để làm là sử dụng formatphương pháp. Tìm hiểu thêm về nó ở đây

a, b = 1, 2

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

28

Hàm printf () đơn giản từ Python Cookbook của O'Reilly .

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

Ví dụ đầu ra:

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

Hơ ... PRINTFORMAT...? Quay ngược thời gian 60 năm trở lại thời của FORTRAN :)
Skeeve

1
Liên kết đến sách dạy nấu ăn của O'Reilly đã chết.
Ideogram

22

Python 3.6 đã giới thiệu chuỗi f cho phép nội suy nội tuyến. Điều thậm chí còn đẹp hơn là nó đã mở rộng cú pháp để cũng cho phép các bộ định dạng định dạng với phép nội suy. Một cái gì đó tôi đã làm việc trong khi tôi googled này (và đã gặp câu hỏi cũ này!):

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

PEP 498 có các chi tiết. Và ... nó đã sắp xếp peeve thú cưng của tôi với các công cụ định dạng trong các lang khác - cho phép các công cụ xác định có thể là biểu thức! Yay! Xem: Định dạng định dạng .


2
Lưu ý: Đây cũng là cách hiệu quả nhất để đưa các biến vào chuỗi.
Rotareti


11

Một cái đơn giản hơn.

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

Sau đó:

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

2

Vì bạn %ở ngoài print(...)dấu ngoặc đơn, nên bạn đang cố gắng chèn các biến của mình vào kết quảprint cuộc gọi của mình . print(...)trả lại None, vì vậy điều này sẽ không hoạt động, và cũng có một vấn đề nhỏ là bạn đã in mẫu của mình vào thời gian này và du hành thời gian bị cấm bởi luật của vũ trụ chúng ta sinh sống.

Toàn bộ điều bạn muốn in, bao gồm cả %toán hạng của nó, cần phải nằm trongprint(...) cuộc gọi của bạn , để chuỗi có thể được xây dựng trước khi được in.

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

Tôi đã thêm một vài khoảng trắng để làm cho nó rõ ràng hơn (mặc dù chúng không cần thiết và thường không được coi là phong cách tốt).


2

Những từ khác printf vắng mặt trong python ... Tôi ngạc nhiên! Mã tốt nhất là

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

Do hình thức này cho phép không in \ n. Tất cả những người khác không. Đó là lý do tại sao in là toán tử xấu. Và bạn cũng cần viết args ở dạng đặc biệt. Không có bất lợi trong chức năng trên. Đây là một dạng chuẩn của hàm printf.


1
Bạn có thể tránh tầm thường trong in ấn. Chỉ cần thêm "," sau khi giá trị được in.
Hejazzman

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.