การแสดงข้อความของภาษา Python
สำหรับบทความนี้ ก็จะมาพูดถึงเรื่องรูปแบบการแสดงข้อความ(string format) ของภาษา Python ซึ่งได้มีการพัฒนาปรับปรุงให้สามารถใช้งานได้ง่ายมากขึ้นเรื่อย ๆ
โดยจะทำการประกาศตัวแปร string , integer , dictionary เป็นค่าตั้งต้นก่อนดังนี้
# ตัวแปร type : str
f_name = ‘Kritchai’
l_name = ‘Tadbhusinwat’# ตัวแปร type : int
hight = 175# ตัวแปร type : dict
profile = {‘fname’:’Kritchai’,
‘lname’:’Tadbhusinwat’,
‘hight’:175}
- string concatenation
my_1 = ‘My name is ‘ + f_name + ‘ ‘ + l_name + ‘, hight : ‘ + str(hight)my_2 = ‘My name is ‘ + profile[‘fname’]+ ‘ ‘ + profile[‘lname’] + ‘, hight : ‘ + str(profile[‘hight’])
วิธีนี้จะนำเอา ข้อความหรือตัวแปรที่ต้องการมาต่อกันโดยใช้เครื่องหมาย +
2. % formatting
my_3 = ‘My name is %s %s, hight : %s’ %(f_name,l_name,hight)my_4 = ‘My name is %s %s, hight : %s’ %(profile[‘fname’],profile[‘lname’],profile[‘hight’])
โดยจะใช้
%s แทนตัวแปร string
%d แทนตัวแปร integer
%f แทนตัวแปร floating แบบปัดทศนิยมด้วย
%. จำนวนทศนิยม เช่น %.2f จะแสดงทศนิยม 2 ตำแหน่ง แบบปัดโดยดูจากทศนิยมตำแหน่งที่ 3
%x หรือ %X แทน integer ที่เป็น Hex (เลขฐาน 16)
แต่จะใช้ %s แทนตัวแปรทุกประเภทเลยก็ได้ (ตัวแปร floating จะไม่ปัด เท่าไรก็เท่านั้นเลย)
3. string.format()
# ตามลำดับก่อนหลัง
my_5 = ‘My name is {} {}, hight : {}’.format(f_name,l_name,hight)# ตามลำดับ index
my_6 = ‘My name is {1} {0}, hight : {2}’.format(l_name,f_name,hight)my_7 = ‘My name is {fname} {lname}, hight : {hight}’.format(**profile)
วิธีนี้ เริ่มมีใช้ตั้งแต่ version 2.6 จะใช้ {}.format() แสดงค่าตัวแปรที่ต้องการ ตามลำดับตัวแปรใน .format() หรือจะอ้างอิงเป็น index ก็ได้
กรณีเป็นค่าในตัวแปร dictionary จะใช้ {key}
4. f-string
my_8 = f’My name is {f_name} {l_name}, hight : {hight}’my_9 = f’My name is {profile[“fname”]} {profile[“lname”]}, hight : {profile[“hight”]}’
วิธีนี้ เริ่มมีใช้ตั้งแต่ version 3.6 โดยต้องมีตัว f (จะใช้ F ก็ได้) อยู่หน้าข้อความที่ต้องการ และระบุชื่อตัวแปรที่ต้องการใน {}
กรณีเป็นค่าในตัวแปร dictionary ให้สังเกตการใช้ single qoute และ double qoute ด้วย ว่าครอบ string หรือ key ของ dict
โดยตัวแปร my_1 ถึง my_9 จะให้ผลลัพธ์แบบเดียวกัน คือ
My name is Kritchai Tadbhusinwat, hight : 175
หมายเหตุ 1
ทั้ง string.format() และ f-string หากต้องการให้ แสดง { หรือ }
ให้ระบุเป็น
{{ เพื่อแสดง {
}} เพื่อแสดง }
print(f’{f_name}{{แสดงวงเล็บปีกกา}}’)
# Kritchai{แสดงวงเล็บปีกกา}
หมายเหตุ 2
ทั้ง string.format() และ f-string สามารถ ระบุ method หรือจะใช้ slicing ด้วยก็ได้
print(f’{f_name.upper()}’)
# KRITCHAI
print(f’{f_name[2:5]}’)
# itc
จากทั้ง 4 วิธีที่กล่าวมาข้างต้น เราจะมาวัดประสิทธิภาพกันตาม code ด้านล่างนี้
จากผลการ run code จะเห็นว่าวิธี f-string นั้นให้ประสิทธิภาพที่ดีกว่าวิธีอื่น ๆ
ทั้งนี้ยังมีเรื่องการจัดการ การแสดงข้อความในรูปแบบต่าง ๆ อีก เช่น
x = 10/3
y = 5
z = 10_000_000 # ใช้ _ แทน comma ได้print(x) # 3.3333333333333335
print(y) # 5
print(z) # 10000000# 0 คือ index ของ (x,y) คือ x; 10=width; .2f = ทศนิยม 2 ตำแหน่ง
print('{0:10.2f}'.format(x,y))
# ' 3.33'# < คือ ชิดซ้าย; 10=width; .3f = ทศนิยม 3 ตำแหน่ง
print(f'{x:<10.3f}')
# '3.333 '# ^ คือ ตรงกลาง; 20=width; ,.2f = มีเครื่องหมาย comma ทศนิยม 2 ตำแหน่ง
print(f'{z:^20,.2f}')
# ' 10,000,000.00 '
code ด้านบนนี้เป็นเพียงบางส่วนของการจัดการ การแสดงผลข้อความ ยังมีการจัดรูปแบบอื่น ๆ อีกแต่จะไม่ขอกล่าวในที่นี้
เพิ่มเติม
บางคนอาจจะเคยเห็นตัวอักษร r (มาจาก raw) วางอยู่หน้า string ซึ่งจะเป็นการกำหนดว่า special/escape character ในข้อความนั้น ๆ ไม่ต้องแปลง เช่น
s = r’new line \n , double qoute \”’
print(s)
# new line \n , double qoute \”