ฉันทำสิ่งนี้ใน Python 2:
"(%d goals, $%d)" % (self.goals, self.penalties)
Python 3 เวอร์ชันนี้คืออะไร?
ฉันพยายามค้นหาตัวอย่างออนไลน์ แต่ฉันยังคงได้รับเวอร์ชัน Python 2
ฉันทำสิ่งนี้ใน Python 2:
"(%d goals, $%d)" % (self.goals, self.penalties)
Python 3 เวอร์ชันนี้คืออะไร?
ฉันพยายามค้นหาตัวอย่างออนไลน์ แต่ฉันยังคงได้รับเวอร์ชัน Python 2
คำตอบ:
นี่คือเอกสารเกี่ยวกับไวยากรณ์รูปแบบ "ใหม่" ตัวอย่างจะเป็น:
"({: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 รุ่นใหม่นั้นแสดงออกได้ชัดเจนกว่ารุ่นเก่ามากและควรใช้เมื่อใดก็ตามที่เขียนโค้ดใหม่ (เว้นแต่จะกำหนดเป้าหมายไปยังสภาพแวดล้อมที่เก่ากว่า)
"({0.goals} goals, ${0.penalties})".format(self)
"conversion rate: {:.2%}".format(self.goals / self.shots)
? ใช้งานได้ดีสำหรับฉันเหมือนเดิม ... (Python 3.4) โปรดทราบว่าไม่มีf
ในนั้นฉันขอให้จัดรูปแบบเป็นเปอร์เซ็นต์ไม่ใช่เลขทศนิยม
"{:.2f}%".format(float_num)
ใช้งานได้ดีสำหรับทั้งคู่
$
ไม่มีความหมายพิเศษที่นี่ไม่อยู่ในไวยากรณ์รูปแบบเก่าหรือในใหม่จึงควรจะอยู่ในสายที่สร้างขึ้นไม่เปลี่ยนแปลง
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'
บรรทัดนั้นทำงานตามที่เป็นอยู่ใน 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)'
ฉันชอบแนวทางนี้
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