พิมพ์เหมือน printf ใน Python3 ยังไง?


125

ใน Python 2 ฉันใช้:

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

ฉันพยายามแล้ว:

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

11
%เป็นตัวดำเนินการสตริงมาโดยตลอดไม่เกี่ยวข้องกับprintคำสั่ง คุณสามารถยกตัวอย่างเช่นการสร้างสตริงด้วยแล้วพิมพ์สตริงที่มีs="a=%d,b=%d"%(f(x,n),g(x,n)) print s
chepner

คำตอบ:


207

ใน Python2 printเป็นคำหลักที่แนะนำคำสั่ง:

print "Hi"

ใน Python3 printเป็นฟังก์ชันที่อาจเรียกใช้:

print ("Hi")

ในทั้งสองเวอร์ชัน%คือโอเปอเรเตอร์ที่ต้องใช้สตริงทางด้านซ้ายมือและค่าหรือทูเพิลของค่าหรืออ็อบเจ็กต์การแมป (เช่นdict) ทางด้านขวามือ

ดังนั้นเส้นของคุณควรมีลักษณะดังนี้:

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

นอกจากนี้คำแนะนำสำหรับ Python3 และใหม่กว่าคือการใช้{}การจัดรูปแบบ-style แทนการ%จัดรูปแบบสไตล์:

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

งูหลาม 3.6 เปิดตัวอีกหนึ่งรูปแบบสตริงกระบวนทัศน์: F-สตริง

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

14
หรือ: print('a={first:4.2f}, b={second:03d}'.format(first=f(x,n),second=g(x,n))) โดยที่ตัวอย่างนี้จะแสดงวิธีที่คุณสามารถใช้ตัวปรับแต่งสไตล์ printf และยังคงใช้คำหลักได้
fbicknel

2
@rapt มีข้อดีบางอย่าง ไม่ใช่อย่างน้อยที่สุดคุณสามารถอ้างอิงรูปแบบเดียวกันได้หลายครั้งหรือไม่เรียงลำดับ: "{1}, {1}, {0} และ {1}" .format ("eggs", "spam") = = "สแปมสแปมไข่และสแปม"
Dr Xorile


28

printf ง่าย () ฟังก์ชั่นจากโอเรลลีหลามตำรา

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

ตัวอย่างผลลัพธ์:

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

หึ ... PRINTและFORMAT... ? ย้อนกลับไปในช่วงเวลา 60 ปีที่ผ่านมาของวัน FORTRAN :) ความ
Skeeve

1
ลิงก์ไปยังตำราอาหารของ O'Reilly ตายแล้ว
Ideogram

22

Python 3.6 แนะนำ f-strings สำหรับการแก้ไขแบบอินไลน์ สิ่งที่ดีกว่าคือการขยายไวยากรณ์เพื่ออนุญาตตัวระบุรูปแบบที่มีการแก้ไข บางสิ่งที่ฉันได้ดำเนินการในขณะที่ใช้ googled นี้ (และเจอคำถามเก่านี้!)

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

PEP 498มีรายละเอียด และ ... มันจัดเรียงสัตว์เลี้ยงของฉันด้วยตัวระบุรูปแบบในภาษาอื่น ๆ - อนุญาตให้ระบุตัวระบุว่าตัวเองสามารถแสดงออกได้! เย้! ดู: ตัวระบุรูปแบบ


2
หมายเหตุ: นี่เป็นวิธีที่มีประสิทธิภาพมากที่สุดในการแทรกตัวแปรลงในสตริง
Rotareti



2

เนื่องจากคุณ%อยู่นอกprint(...)วงเล็บคุณจึงพยายามแทรกตัวแปรลงในผลลัพธ์ของการprintโทร print(...)ผลตอบแทนNoneดังนั้นสิ่งนี้จะไม่ได้ผลและยังมีเรื่องเล็กน้อยที่คุณได้พิมพ์แม่แบบของคุณแล้วในช่วงเวลานี้และการเดินทางข้ามเวลาซึ่งถูกห้ามโดยกฎของจักรวาลที่เราอาศัยอยู่

สิ่งที่คุณต้องการพิมพ์ทั้งหมดรวมถึง%และตัวถูกดำเนินการต้องอยู่ในการprint(...)โทรของคุณเพื่อให้สามารถสร้างสตริงได้ก่อนที่จะพิมพ์

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

ฉันได้เพิ่มช่องว่างบางส่วนเพื่อให้ชัดเจนขึ้น (แม้ว่าจะไม่จำเป็นและโดยทั่วไปไม่ถือว่าเป็นรูปแบบที่ดี)


2

คำอื่น ๆ printf ไม่มีใน python ... ฉันประหลาดใจ! รหัสที่ดีที่สุดคือ

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

เนื่องจากแบบฟอร์มนี้ไม่อนุญาตให้พิมพ์ \ n อื่น ๆ ทั้งหมดไม่ นั่นเป็นสาเหตุที่การพิมพ์เป็นตัวดำเนินการที่ไม่ดี และคุณต้องเขียน args ในรูปแบบพิเศษ ไม่มีข้อเสียในฟังก์ชันข้างต้น เป็นฟังก์ชัน printf รูปแบบปกติมาตรฐาน


1
คุณสามารถหลีกเลี่ยง \ n ในการพิมพ์ได้เล็กน้อย เพียงแค่เพิ่ม "," หลังค่าที่จะพิมพ์
Hejazzman

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.