φυβλαςのβλογ
บล็อกของ phyblas



ภาษา python เบื้องต้น บทที่ ๑๐: การแสดงผลตัวอักษร
เขียนเมื่อ 2016/03/05 11:29
แก้ไขล่าสุด 2024/02/22 11:01
 

บทนี้จะพูดถึงเกี่ยวกับการควบคุมรูปแบบการแสดงผลของของข้อมูล



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

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

สายอักขระจะสร้างขึ้นจากการใช้เครื่องหมายคำพูดแบบเดี่ยว ' หรือแบบคู่ " ล้อมข้อความ

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

วิธีที่ง่ายที่สุดคือการใช้อีกตัวแทน เช่น ถ้าต้องการข้อความที่มี ' อยู่ก็ต้องใช้ "" เป็นตัวครอบ
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 สามารถเปลี่ยนให้หลากหลายขึ้นได้


อ้างอิง




-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文