การจัดรูปแบบสตริงใน Python 3


114

ฉันทำสิ่งนี้ใน Python 2:

"(%d goals, $%d)" % (self.goals, self.penalties)

Python 3 เวอร์ชันนี้คืออะไร?

ฉันพยายามค้นหาตัวอย่างออนไลน์ แต่ฉันยังคงได้รับเวอร์ชัน Python 2


ไม่ได้เลิกใช้งาน รหัสของคุณใช้งานได้ดี อ่านเพิ่มเติมที่นี่
jackcogdill

32
หมายเหตุสำหรับผู้อ่านทั่วไป: เครื่องหมายดอลลาร์ไม่มีความหมายพิเศษ มันเป็นเพียงเครื่องหมายดอลลาร์ที่นี่ (ขอบคุณ Martijn Pieters)
kevinarpe

1
pyformat.infoและpython-course.eu/python3_formatted_output.php (ไม่ใช่ไซต์ของฉัน)
Christophe Roussy

1
เครื่องหมายดอลลาร์ทำให้สิ่งนี้สับสนมาก ..
cchamberlain

คำตอบ:


173

นี่คือเอกสารเกี่ยวกับไวยากรณ์รูปแบบ "ใหม่" ตัวอย่างจะเป็น:

"({:d} goals, ${:d})".format(self.goals, self.penalties)

หากทั้งคู่goalsและpenaltiesเป็นจำนวนเต็ม (กล่าวคือรูปแบบเริ่มต้นใช้ได้) สามารถย่อเป็น:

"({} goals, ${})".format(self.goals, self.penalties)

และเนื่องจากพารามิเตอร์เป็นเขตข้อมูลselfจึงมีวิธีดำเนินการโดยใช้อาร์กิวเมนต์เดียวสองครั้ง (ตามที่ @Burhan Khalid ระบุไว้ในความคิดเห็น):

"({0.goals} goals, ${0.penalties})".format(self)

อธิบายว่า:

  • {} หมายถึงอาร์กิวเมนต์ตำแหน่งถัดไปโดยมีรูปแบบเริ่มต้น
  • {0}หมายถึงอาร์กิวเมนต์ที่มีดัชนี0โดยมีรูปแบบเริ่มต้น
  • {:d} เป็นอาร์กิวเมนต์ตำแหน่งถัดไปที่มีรูปแบบจำนวนเต็มทศนิยม
  • {0:d}คืออาร์กิวเมนต์ที่มีดัชนีที่0มีรูปแบบจำนวนเต็มทศนิยม

มีสิ่งอื่น ๆ อีกมากมายที่คุณสามารถทำได้เมื่อเลือกอาร์กิวเมนต์ (โดยใช้อาร์กิวเมนต์ที่ตั้งชื่อแทนการกำหนดตำแหน่งการเข้าถึงฟิลด์ ฯลฯ ) และตัวเลือกรูปแบบมากมายเช่นกัน (การเติมตัวเลขโดยใช้ตัวคั่นหลายพันตัวแสดงเครื่องหมายหรือไม่ ฯลฯ ) ตัวอย่างอื่น ๆ :

"({goals} goals, ${penalties})".format(goals=2, penalties=4)
"({goals} goals, ${penalties})".format(**self.__dict__)

"first goal: {0.goal_list[0]}".format(self)
"second goal: {.goal_list[1]}".format(self)

"conversion rate: {:.2f}".format(self.goals / self.shots) # '0.20'
"conversion rate: {:.2%}".format(self.goals / self.shots) # '20.45%'
"conversion rate: {:.0%}".format(self.goals / self.shots) # '20%'

"self: {!s}".format(self) # 'Player: Bob'
"self: {!r}".format(self) # '<__main__.Player instance at 0x00BF7260>'

"games: {:>3}".format(player1.games)  # 'games: 123'
"games: {:>3}".format(player2.games)  # 'games:   4'
"games: {:0>3}".format(player2.games) # 'games: 004'

หมายเหตุ:ตามที่คนอื่น ๆ ชี้ให้เห็นรูปแบบใหม่ไม่ได้แทนที่รูปแบบเดิมทั้งสองอย่างมีให้ใช้งานทั้งใน Python 3 และ Python 2 เวอร์ชันที่ใหม่กว่าเช่นกัน บางคนอาจบอกว่าเป็นเรื่องของความชอบ แต่ IMHO รุ่นใหม่นั้นแสดงออกได้ชัดเจนกว่ารุ่นเก่ามากและควรใช้เมื่อใดก็ตามที่เขียนโค้ดใหม่ (เว้นแต่จะกำหนดเป้าหมายไปยังสภาพแวดล้อมที่เก่ากว่า)


9
คุณสามารถทำได้เช่นกัน"({0.goals} goals, ${0.penalties})".format(self)
Burhan Khalid

คุณต้องนำ "%" ออกจากวงเล็บปีกกาเช่น {: .2f%} -> {: .2f}%
SuperElectric

@SuperElectric คุณหมายถึงในบรรทัดนี้: "conversion rate: {:.2%}".format(self.goals / self.shots)? ใช้งานได้ดีสำหรับฉันเหมือนเดิม ... (Python 3.4) โปรดทราบว่าไม่มีfในนั้นฉันขอให้จัดรูปแบบเป็นเปอร์เซ็นต์ไม่ใช่เลขทศนิยม
mgibsonbr

คุณถูก; ดูเหมือนว่าจะใช้งานได้ใน Python 3.4 ดังนั้นก็ไม่เป็นไรเนื่องจาก OP ถามเกี่ยวกับ Python3 ฉันเพิ่งพบว่ามันใช้ไม่ได้กับ python 2.7.6 "{:.2f}%".format(float_num)ใช้งานได้ดีสำหรับทั้งคู่
SuperElectric

1
@JohnSchmitt ใช่ตัวอย่างนี้ควรจะให้ผลลัพธ์ที่แน่นอนเหมือนกับรหัสที่ระบุในคำถาม $ไม่มีความหมายพิเศษที่นี่ไม่อยู่ในไวยากรณ์รูปแบบเก่าหรือในใหม่จึงควรจะอยู่ในสายที่สร้างขึ้นไม่เปลี่ยนแปลง
mgibsonbr

67

Python 3.6 รองรับการแก้ไขสตริงตามตัวอักษรชวเลขด้วยPEP 498แล้ว สำหรับกรณีการใช้งานของคุณไวยากรณ์ใหม่คือ:

f"({self.goals} goals, ${self.penalties})"

สิ่งนี้คล้ายกับ.formatมาตรฐานก่อนหน้าแต่ช่วยให้คุณทำสิ่งต่างๆได้อย่างง่ายดายเช่น :

>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal('12.34567')
>>> f'result: {value:{width}.{precision}}'
'result:      12.35'

12

บรรทัดนั้นทำงานตามที่เป็นอยู่ใน Python 3

>>> sys.version
'3.2 (r32:88445, Oct 20 2012, 14:09:29) \n[GCC 4.5.2]'
>>> "(%d goals, $%d)" % (self.goals, self.penalties)
'(1 goals, $2)'

ตกลง. เย็น. หลังจากที่ฉันโพสต์คำถามฉันก็ค้นหาต่อไปและพบว่าเราต้องทำ {% d} แทนที่จะเป็น% d นั้นถูกต้องด้วยหรือไม่ หรือวิธี Python2 เป็นวิธีเดียวที่จะทำได้?
JoseBazBaz

2
Python 3 แนะนำไวยากรณ์ใหม่นั่นคือวงเล็บปีกกา แต่คุณไม่จำเป็นต้องใช้ คุณสามารถใช้ได้ทั้งแบบเก่าหรือแบบใหม่ แต่มันแตกต่างกัน หากคุณใช้ curlies คุณจะไม่ใช้เครื่องหมายเปอร์เซ็นต์
Mark Reed

2

ฉันชอบแนวทางนี้

my_hash = {}
my_hash["goals"] = 3 #to show number
my_hash["penalties"] = "5" #to show string
print("I scored %(goals)d goals and took %(penalties)s penalties" % my_hash)

จด d และ s ที่ต่อท้ายไว้ในวงเล็บตามลำดับ

ผลลัพธ์จะเป็น:

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