Data Warehouse

การแสดงผลตัวอักษร

การใช้อักษรพิเศษที่มีหน้าที่เฉพาะ

ปกติแล้วข้อความที่พิมพ์ป้อนให้สายอักขระมักจะแสดงผลตามที่ป้อนเข้าไปทั้งหมด แต่ก็มีอักษรบางตัวที่มีหน้าที่พิเศษภายในสายอักขระ ได้แก่ ' " \ % เวลาต้องการใส่อักษรเหล่านี้ ลงในสายอักขระจึงอาจต้องระวัง สายอักขระจะสร้างขึ้นจากการใช้เครื่องหมายคำพูดแบบเดี่ยว ' หรือแบบคู่ " ล้อมข้อความ แต่ว่าหากต้องการให้มี ' หรือ " อยู่ในสายอักขระแล้วละก็ ต้องระวังเพราะอาจทำให้โปรแกรมตีความผิดเข้าใจว่า ตัดจบหรือเริ่มสายอักขระใหม่ได้ ดังนั้นจึงต้องหาวิธีเลี่ยง วิธีที่ง่ายที่สุดคือการใช้อีกตัวแทน เช่น ถ้าต้องการข้อความที่มี ' อยู่ก็ต้องใช้ "” เป็นตัวครอบ

print("คำว่า 'รัก' มันยากจะอธิบาย")

ในทางกลับกันถ้าต้องการข้อความที่มี " อยู่ก็ต้องใช้ ' ' เป็นตัวครอบ แต่ถ้าต้องการ ใช้ทั้งสองตัวทีเดียวเลี่ยงไม่ได้จริงๆก็ต้องใช้แบ็กสแลช \ ช่วย

print("เครื่องหมายคำพูดมีแบบเดี่ยว ' ' และแบบคู่ \" \"")

ผลที่แสดงออกมา

เครื่องหมายคำพูดมีแบบเดี่ยว ' ' และแบบคู่ " "

เอสเคปคาแร็กเตอร์

นอกจากแบ็กสแลชจะทำหน้าที่นำหน้าอักษรที่มีหน้าที่เฉพาะเพื่อให้ปรากฏตามที่เห็นโดยไม่ถูกตีความแล้ว มีอักษรหลายตัวที่นำหน้าด้วยแบ็กสแลช \ แล้วมีความหมายพิเศษ ซึ่งเรียกว่า เอสเคปคาแร็กเตอร์ (escape character)

\n คือ ขึ้นบรรทัดใหม่  
\t คือ เคาะเว้นย่อหน้า  
\b คือ แบ็กสเปซ (ลบตัวอักษร)  
\a คือ ส่งเสียงเตือน  

ตัวอย่าง

print('ma\bc')  # ได้ mc (เพราะ a ถูกลบ)  
print('a\ta')  # ได้ a a  
print('\a')  # จะได้ยินเสียงเตือนดังขึ้นมา

หาก \ ตามด้วยตัวอักษรที่รวมแล้วไม่ได้มีความหมายพิเศษก็จะปรากฏตามที่พิมพ์ไป

print('\s')  # ได้ \s

แต่หาก \ ตามด้วยอักษรที่รวมแล้วมีความหมายพิเศษ เช่น n t b a ก็จะเกิดการตีความแล้วให้ผลที่ต่างออกจากที่พิมพ์ ในกรณีที่ต้องการหลีกเลี่ยงไม่ให้เป็นเช่นนั้นสามารถทำได้โดยเขียน \ ติดกัน ๒ ขีด เป็น \ เช่น

print('\\n')  # ได้ \n

จะเห็นว่ามี \ ปรากฏขึ้นแค่ตัวเดียว เพราะ \ ถูกตีความเป็น \ ตัวเดียว หากต้องการ ๒ ตัวก็พิมพ์ ๔ ตัว

print('\\\\')  # ได้ \\

หากไม่ต้องการให้เอสเคปคาแร็กเตอร์ทำงานเลยก็สามารถทำได้โดยใส่ r ลงไปหน้าเครื่องหมายคำพูด แล้วสายอักขระนั้นจะถูกมองเป็นตัวอักษรตามที่พิมพ์ลงไปทั้งหมด

print(r'\n\t\b\a')  # ได้ \n\t\b\a

ยูนิโค้ด

ในสายอักขระสามารถใช้โค้ดในระบบยูนิโค้ดเพื่อแทนตัวอักษรได้ โค้ดจะถูกแปลงเป็นตัวอักษร วิธีการใช้ทำได้โดยใช้ \u \U และ \X

  • \uคคคค ระบุอักษรด้วยรหัสยูนิโค้ดแบบ utf-16 (ค แทนเลขฐาน 16 ทั้งหมด 4 ตัว)
  • \Uคคคคคคคค ระบุอักษรด้วยรหัสยูนิโค้ดแบบ utf-32 (ค แทนเลขฐาน 16 ทั้งหมด 8 ตัว)
  • \N{ชื่ออักษร} คือ ระบุอักษรด้วยชื่อที่ถูกเก็บในฐานข้อมูลของยูนิโค้ด

ตัวอย่าง

print('\u0e2e')  # ได้ ฮ  
print('\U00000e0e')  # ได้ ฎ  
print("\N{Thai Character Pho Phan}")  # ได้ พ

ในไพธอน 2 จะได้ผลต่างออกไป จำเป็นต้องเติม u นำหน้า อ่านรายละเอียดได้ที่

การเปลี่ยนรูปแบบการแสดงผลของข้อความ

ในการแสดงผลข้อมูลที่เป็นตัวเลขนั้นจะเห็นว่าหากสั่ง print ค่าตัวเลขนั้นโดยตรง จะได้ลักษณะที่มีค่าตายตัวแบบหนึ่ง เช่น จำนวนจริงที่เป็นจำนวนเต็ม จะมีศูนย์หลังจุดแค่ตัวเดียวเสมอ หรือเลขทศนิยมที่เล็กมากหรือใหญ่มากจะถูกเขียนในรูป e เช่น

print(3.000000000)  # ได้ 3.0  
print(0.00000000003)  # ได้ 3e-11  
print(300000000000000000.)  # ได้ 3e+17

แต่ก็มีวิธีที่จะเปลี่ยนการแสดงผลเมื่อใช้คำสั่ง print หรือเมื่อแปลงเป็นสายอักขระได้ ซึ่งทำได้โดยเขียนให้อยู่ในรูปของ %d, %e, %f, ฯลฯ

การแสดงจำนวนเต็ม

%d ใช้แทนจำนวนเต็มที่แทรกอยู่ภายในสายอักขระ โดยค่าของจำนวนเต็ม ที่จะคำนวณนั้นต้องใส่ไว้ด้านหลังเครื่องหมายคำพูด

i = 20  
print('==%d=='%i)  # ได้ ==20==

จากตัวอย่างจะเห็นว่าค่าของ i เข้าไปแทนที่ %d สิ่งที่อาจชวนสับสนก็คือ รูปแบบการเขียนแบบนี้มีการใช้เครื่องหมาย % ถึง ๒ ครั้ง แต่ว่า % ทั้ง ๒ นี้เป็นคนละความหมายกัน % ตัวแรกอยู่ภายในเครื่องหมายคำพูด วางอยู่ในตำแหน่งที่ต้องการให้ค่าตัวเลขไปอยู่ แล้วก็ตามด้วยชนิดของข้อมูลที่ต้องการแทน ในที่นี้เป็นจำนวนเต็มใช้ d ส่วน % ตัวหลังอยู่หลังเครื่องหมายคำพูด โดยตามหลังด้วยค่าที่ต้องการนำไปแทน โดยอาจเป็นตัวเลขหรือเป็นตัวแปรก็ได้ การเปลี่ยนการแสดงผลทำได้โดยใส่ส่วนแต่งเติมลงหลัง % ตัวหน้า

print('==%4d=='%19)  # ได้ == 19== ให้เพิ่มช่องว่างจนครบ 4 ตำแหน่ง  
print('==%4d=='%19000)  # ==19000== ถ้าเลขเกิน 4 อยู่แล้วไม่มีผล  
print('==%04d=='%19)  # ได้ ==0019== ให้ใส่เลข 0 จนถึง 4 ตำแหน่ง  
print('==%04d=='%19000)  # ==19000== ถ้าเลขเกิน 4 อยู่แล้วไม่มีผล  
print('==%+d=='%19)  # ได้ ==+19== ให้ใส่เครื่องหมาย + เมื่อเป็นค่าบวก  
print('==%+d=='%-19)  # ได้ ==-19== ถ้าเป็นลบอยู่แล้วไม่มีผล  
print('==%+04d=='%19)  # ได้ ==+019== 4 ตำแหน่งนี้นับรวมเครื่องหมายด้วย

ตัวอย่าง ไล่เรียงหมายเลขโดยขึ้นเป็น ๒ หลัก

s = ['no.%02d'%i  for  i  in  range(1,21)]  
print(s)  # ได้ ['no.01', 'no.02', 'no.03', 'no.04', 'no.05', 'no.06', 'no.07', 'no.08', 'no.09', 'no.10', 'no.11', 'no.12', 'no.13', 'no.14', 'no.15', 'no.16', 'no.17', 'no.18', 'no.19', 'no.20']

หากมีส่วนที่ต้องการแทรกอยู่หลายตัวก็ให้ใส่ตัวแปรตามจำนวนนั้นโดยใส่วงเล็บแล้วคั่นด้วยจุลภาค ,ตัวอย่าง แสดงวันเดือนปี

print('%02d / %02d / %04d'%(9,2,2016)) # ได้ 09 / 02 / 2016

แปลงเลขเป็นฐาน 16

นอกจาก %d ที่ให้แสดงเลขตามปกติเป็นฐาน 10 ที่เราคุ้นเคยกันดีแล้ว หากแทนด้วย %x ก็จะได้ค่าเป็นเลขฐาน 16 แทน

print('%x'%(2**16-1))  # ได้ ffff  
print('%x'%(27365824924))  # ได้ 65f21599c  
print('%09x'%1000)  # ได้ 0000003e8

เลขฐาน 16 มีประโยชน์ เพราะใช้แทนค่ารหัสสีซึ่งมักประกอบไปด้วยค่าของเลขฐาน 16 ของค่าแม่สีทั้งสาม

print('#%02x%02x%02x'%(10,252,90))  # ได้#0afc5a

การแสดงเลขจำนวนจริง

จำนวนจริงใช้ %f ในการแสดง สามารถปรับตำแหน่งหลักและตำแหน่งเลขทศนิยมได้

print('==%12f=='%129.3)  # ได้ == 129.300000== เติมช่องว่างจนครบ 12 ตำแหน่ง  
print('==%012f=='%129.3)  # ได้ ==00129.300000== เติม 0 จนครบ 12 ตำแหน่ง  
print('==%.3f=='%129.3)  # ได้ ==129.300== ทศนิยม 3 ตำแหน่ง  
print('==%.0f=='%129.3)  # ได้ ==129== เศษถูกปัดทิ้ง  
print('==%12.3f=='%129.3)  # ได้ == 129.300==  
print('==%012.3f=='%129.3)  # ได้ ==00000129.300==

อีกวิธีในการแสดงผลก็คือใช้ %e ซึ่งจะแสดงเป็นตัวเลขในรูปแบบ e

pi = 3.14159  
print('==%e=='%pi)  # ได้ ==3.141590e+00==  
print('==%15e=='%pi)  # ได้ == 3.141590e+00==  
print('==%015e=='%pi)  # ได้ ==0003.141590e+00==  
print('==%.8e=='%pi)  # ได้ ==3.14159000e+00==  
print('==%.2e=='%pi)  # ได้ ==3.14e+00==  
print('==%015.8e=='%pi)  # ได้ ==3.14e+00==

นอกจากนี้ยังมี %s ซึ่งแสดงผลสายอักขระเอง

print('==%s=='%'asa')  # ได้ ==asa==  
print('==%5s=='%'asa')  # ได้ == asa6==

โดย %s นี้ยังใช้กับข้อมูลชนิดกลุ่มเช่นลิสต์หรือทูเพิลได้ด้วย ผลที่ได้จะเหมือนกับเวลาที่ print ลิสต์หรือทูเพิลนั้นออกมาโดดๆ

print('==%s=='%[1,2])  # ได้ ==[1, 2]==  
print('==%25s=='%['a','s','a'])  # ได้ == ['a', 's', 'a']==

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

print('==%s=='%('a','s','a'))  # ได้ TypeError: not all arguments converted during string formatting  
print('==%s %s %s=='%('a','s','a'))  # ได้ ==a s a==  
print('==%s=='%(('a','s','a'),))  # ได้ ==('a', 's', 'a')==

กรณีที่มีข้อมูลมาแทนเป็นจำนวนไม่เท่ากันกับจำนวน % ที่อยู่ด้านหน้า หรือชนิดผิด ก็จะขัดข้องทันที

print('==%s,%s=='%'asa')  # ได้ TypeError: not enough arguments for format string  
print('==%f=='%'asa')  # ได้ TypeError: a float is required

กรณีมี % ตัวอื่นอยู่ในสายอักขระและไม่ได้ต้องการให้แสดงผลด้วยเลยให้ใส่ % นำหน้าอีกตัว

print('==%.2f%%formaldehyde=='%70)  # ได้ ==70%formaldehyde==

สรุปเนื้อหา

  • ในบทนี้ได้เข้าใจรูปแบบการแสดงผลของสายอักขระแล้ว เมื่อเข้าใจแล้ว ก็จะสามารถเปลี่ยนผลให้ออกมาได้ตามที่ต้องการ
  • ต้องระวังการใช้เอสเคปคาแร็กเตอร์ \n \t \b \a ' " \ ให้ดี
  • เวลาที่แปลงตัวเลขเป็นสายอักขระมักถูกตีความในรูปแบบที่ถูกกำหนดมาแล้ว แต่ด้วย %d %x %f %e สามารถเปลี่ยนให้หลากหลายขึ้นได้

อ้างอิง

Reference : https://phyblas.hinaboshi.com/tsuchinoko10