การแปลงชนิดข้อมูลใน Python: แปลงข้อมูลระหว่างชนิดต่าง ๆ
บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล
ลองนึกภาพว่าคุณถามอายุใครสักคน แล้วเขาเขียนตอบไว้บนกระดาษโน้ต ตอนนี้คุณได้ข้อความ "25" มา แต่เอากระดาษโน้ตมาคำนวณไม่ได้ ต้องอ่านข้อความนั้นแล้วแปลงเป็นตัวเลขจริง ๆ ในหัวก่อน
Python ก็ทำงานแบบเดียวกัน ข้อมูลมักเข้ามาเป็นชนิดหนึ่ง แต่เราต้องใช้เป็นอีกชนิดหนึ่ง เมื่อผู้ใช้พิมพ์ "42" ลงในฟอร์ม ข้อมูลนั้นเป็นสตริง ไม่ใช่ตัวเลข ก่อนจะนำไปบวก ลบ หรือเปรียบเทียบได้ คุณต้อง แปลง มันก่อน
บทเรียนนี้สอนวิธีแปลงชนิดข้อมูลใน Python อย่างปลอดภัยและมั่นใจ คุณจะได้รู้ว่าการแปลงแบบไหนเกิดขึ้นเองโดยอัตโนมัติ แบบไหนต้องทำเอง และจะหลีกเลี่ยงข้อผิดพลาดที่มือใหม่มักเจอได้อย่างไร
การแปลงชนิดข้อมูลใน Python คืออะไร
การแปลงชนิดข้อมูล (type conversion) คือการเปลี่ยนค่าจากชนิดข้อมูลหนึ่งไปเป็นอีกชนิดหนึ่ง เช่น เปลี่ยนสตริง "42" เป็นจำนวนเต็ม 42 หรือเปลี่ยนจำนวนเต็ม 10 เป็นทศนิยม 10.0
Python มีการแปลงชนิดข้อมูลสองแบบ การแปลงโดยปริยาย (implicit conversion) เกิดขึ้นเองโดยอัตโนมัติ Python จัดการให้อยู่เบื้องหลัง ส่วน การแปลงโดยชัดแจ้ง (explicit conversion) คือการที่คุณใช้ฟังก์ชันอย่าง int() หรือ str() แปลงค่าด้วยตัวเอง
การแปลงโดยปริยายเหมือนโทรศัพท์ที่แก้คำผิดให้อัตโนมัติ ส่วนการแปลงโดยชัดแจ้งเหมือนการแก้คำนั้นด้วยตัวเอง ทั้งสองแบบได้งานเหมือนกัน แต่การทำเองทำให้คุณควบคุมได้มากกว่า
7.0 <class 'float'> 30
การแปลงชนิดข้อมูลโดยปริยายใน Python ทำงานอย่างไร
เมื่อใช้จำนวนเต็มกับทศนิยมร่วมกันในการคำนวณ Python จะแปลงจำนวนเต็มเป็นทศนิยมให้โดยอัตโนมัติ เรียกว่า การแปลงโดยปริยาย (หรือ type coercion) Python จะแปลงไปเป็นชนิดที่ "กว้างกว่า" เสมอ เพื่อไม่ให้ข้อมูลสูญหาย
เหมือนเทน้ำจากแก้วใบเล็กลงถังใบใหญ่ น้ำ (ข้อมูลของคุณ) ยังเท่าเดิม เพียงแต่อยู่ในภาชนะที่ใหญ่ขึ้น การแปลงจาก int เป็น float ปลอดภัยสำหรับตัวเลขที่ใช้ในชีวิตประจำวัน เพราะ float เก็บจำนวนเต็มทุกตัวได้อย่างแม่นยำไปจนถึงประมาณ 9 พันล้านล้าน
7.0 15.0 5.0 6 10 3.5
7.0 Error: can only concatenate str (not "int") to str
วิธีแปลงเป็นจำนวนเต็มด้วย int()
ฟังก์ชัน int() แปลงค่าเป็นจำนวนเต็ม แปลงได้ทั้งทศนิยม สตริง และค่าความจริง แต่ละชนิดมีพฤติกรรมต่างกันเล็กน้อย
แปลงทศนิยมเป็นจำนวนเต็ม
เมื่อแปลงทศนิยมเป็นจำนวนเต็ม Python จะ ตัดทิ้ง (truncate) ทุกอย่างหลังจุดทศนิยม โดยไม่ปัดเศษ ลองนึกถึงการตัดเชือก ส่วนที่ยื่นเลยรอยขีดออกไปก็หลุดทิ้งไปเลย
3 3 -2 99 4 3
แปลงสตริงเป็นจำนวนเต็ม
แปลงสตริงเป็นจำนวนเต็มได้ก็ต่อเมื่อสตริงนั้นเป็นจำนวนเต็มที่ถูกต้อง ช่องว่างรอบตัวเลขไม่เป็นปัญหา แต่ถ้ามีจุดทศนิยมหรือตัวอักษรจะเกิดข้อผิดพลาด
42 -7 100 1 0
วิธีแปลงเป็นทศนิยมด้วย float()
ฟังก์ชัน float() แปลงค่าเป็นจำนวนทศนิยม (floating-point) ใช้ได้กับจำนวนเต็ม สตริง และค่าความจริง
การแปลงจำนวนเต็มทั่วไปเป็นทศนิยมไม่ทำให้อะไรหายไป ตัวเลขแค่มี .0 ต่อท้ายเพิ่มเข้ามา เหมือนราคา 5 บาทที่เขียนเป็น 5.00 บาท มีเพียงจำนวนเต็มที่เกินขีดจำกัดข้างต้น (2 ** 53) เท่านั้นที่อาจสูญเสียตัวเลขหลักท้าย ๆ ไป
42.0 -7.0 0.0 3.14 7.0 -2.5 1.0 0.0
วิธีแปลงเป็นสตริงด้วย str()
ฟังก์ชัน str() แปลงค่าใดก็ได้ให้เป็นสตริงที่แทนค่านั้น นี่คือฟังก์ชันแปลงชนิดข้อมูลที่ยืดหยุ่นที่สุด ใช้ได้กับแทบทุกอย่าง
คุณจะใช้ str() บ่อยที่สุดตอนสร้างข้อความที่มีทั้งตัวอักษรและตัวเลข Python ไม่ยอมให้ใช้ + ต่อสตริงกับตัวเลขเข้าด้วยกัน จึงต้องแปลงตัวเลขเป็นสตริงก่อน
42 3.14 -7 True False None I am 25 years old
name = "Alice"
age = 25
print("Name: " + name + ", Age: " + str(age))name = "Alice"
age = 25
print(f"Name: {name}, Age: {age}")วิธีแปลงเป็นค่าความจริงด้วย bool()
ฟังก์ชัน bool() แปลงค่าเป็น True หรือ False กฎนั้นง่ายมาก: ค่าว่างและค่าศูนย์เป็น False นอกนั้นเป็น True ทั้งหมด
ลองคิดเหมือนการถามว่า "ข้างในมีอะไรอยู่ไหม" กล่องเปล่าคือ False ส่วนกล่องที่มีของอยู่ข้างใน แม้จะเป็นแค่เศษกระดาษยับ ๆ หนึ่งแผ่น ก็คือ True
False False False False --- True True True True True
True True True True False
ข้อผิดพลาดที่พบบ่อยในการแปลงชนิดข้อมูลใน Python
ไม่ใช่ทุกการแปลงจะทำได้ เมื่อ Python แปลงค่าไม่ได้ จะแจ้งข้อผิดพลาด ValueError นี่คือข้อผิดพลาดที่มือใหม่เจอบ่อยที่สุดเมื่อแปลงชนิดข้อมูล
เหมือนการพยายามแปลคำที่ไม่มีอยู่ในอีกภาษาหนึ่ง Python ดูค่านั้น พยายามแปลง แล้วบอกว่า "ไม่รู้เลยว่าจะเปลี่ยนสิ่งนี้เป็นตัวเลขได้อย่างไร"
Error 1: invalid literal for int() with base 10: 'hello' Error 2: invalid literal for int() with base 10: '3.14' Error 3: could not convert string to float: 'abc'
ตารางสรุปสั้น ๆ ว่าอะไรใช้ได้และอะไรใช้ไม่ได้:
| การแปลง | ตัวอย่าง | ผลลัพธ์ |
|---|---|---|
int("42") | สตริงที่เป็นตัวเลขล้วน | 42 |
int("3.14") | สตริงที่มีจุดทศนิยม | ValueError |
int("hello") | สตริงที่ไม่ใช่ตัวเลข | ValueError |
float("3.14") | สตริงที่มีจุดทศนิยม | 3.14 |
float("abc") | สตริงที่ไม่ใช่ตัวเลข | ValueError |
int(float("3.14")) | แปลงสองขั้นตอน | 3 |
วิธีแปลงชนิดข้อมูลใน Python อย่างปลอดภัย
ในโปรแกรมจริง ข้อมูลมักมาจากผู้ใช้หรือจากไฟล์ คุณไม่อาจเชื่อได้เสมอว่าข้อมูลนั้นเป็นตัวเลขที่ถูกต้อง ถ้าเรียก int() กับอินพุตที่ไม่ถูกต้องโดยไม่ตรวจก่อน โปรแกรมจะหยุดทำงาน
Python มีสองวิธีให้จัดการเรื่องนี้ คุณจะ ตรวจก่อนแปลง ด้วยเมธอดอย่าง .isdigit() หรือจะ ลองแปลงแล้วดักจับข้อผิดพลาด ด้วย try/except ก็ได้ ซึ่งวิธีหลังปลอดภัยกว่า
ตรวจก่อนด้วย .isdigit()
เมธอด .isdigit() คืนค่า True ถ้าทุกตัวอักษรในสตริงเป็นตัวเลข เป็นวิธีตรวจสตริงอย่างรวดเร็วก่อนแปลงเป็นจำนวนเต็ม
True False False False False Converted: 42
ใช้ try/except เพื่อแปลงอย่างปลอดภัย
รูปแบบ try/except เป็นวิธีที่ยืดหยุ่นที่สุดในการจัดการการแปลง คุณลองแปลงดูก่อน ถ้าไม่สำเร็จก็ดักจับข้อผิดพลาดแล้วทำอย่างอื่นแทน คุณจะได้เรียน try/except อย่างละเอียดในภายหลัง ตอนนี้มาดูรูปแบบพื้นฐานกันก่อน
42 100 None None None
แบบฝึกหัด
ได้เวลาทดสอบทักษะการแปลงชนิดข้อมูลของคุณแล้ว แบบฝึกหัดเริ่มจากข้อง่ายแล้วค่อย ๆ ยากขึ้น ลองทำแต่ละข้อก่อนเปิดดูคำใบ้
มีตัวแปรสตริง text ที่เก็บค่า "42" ให้แปลงเป็นจำนวนเต็มแล้วคูณด้วย 2 จากนั้นแสดงผลลัพธ์
ผลลัพธ์ที่ต้องได้:
84มีทศนิยม price = 9.99 ให้แปลงเป็นจำนวนเต็ม แล้วแสดงทั้งค่าเดิมและค่าที่แปลงแล้ว เพื่อให้เห็นว่าอะไรหายไป
ผลลัพธ์ที่ต้องได้:
Original: 9.99
Converted: 9
Lost: 0.99คำใบ้: หาส่วนที่หายไปด้วยการลบ แล้วใช้ round() กับส่วนที่หายไป เพื่อเลี่ยงความแปลกของเลขทศนิยม
ทายว่าแต่ละบรรทัดจะแสดงผลอะไรโดยไม่ต้องรันโค้ด เขียนคำทายเป็นคอมเมนต์ไว้ แล้วรันเพื่อตรวจคำตอบ
คิดให้ดีเรื่องการตัดเศษ การแปลงเป็นสตริง และกฎของค่า truthy/falsy
โค้ดนี้พยายามสร้างข้อความ แต่หยุดทำงานด้วย TypeError แก้ให้แสดงผล:
You have 3 new messagesจะแก้ด้วยวิธีไหนก็ได้ (str(), f-string ฯลฯ)
เขียนโค้ดตรวจสตริงสามตัวด้วย .isdigit() และแปลงเป็นจำนวนเต็มเฉพาะสตริงที่ประกอบด้วยตัวเลขล้วน สำหรับแต่ละสตริง ให้แสดงตัวเลขที่แปลงแล้ว หรือแสดง "Not a number"
ข้อมูลที่ให้มา:
values = ["42", "hello", "100"]ผลลัพธ์ที่ต้องได้:
42
Not a number
100สรุป: การแปลงชนิดข้อมูลใน Python
สรุปทุกอย่างที่ได้เรียนเกี่ยวกับการแปลงชนิดข้อมูล:
| ฟังก์ชัน | ทำอะไร | ตัวอย่าง |
|---|---|---|
int() | แปลงเป็นจำนวนเต็ม (ตัดเศษของทศนิยมทิ้ง) | int("42") → 42 |
float() | แปลงเป็นทศนิยม | float("3.14") → 3.14 |
str() | แปลงเป็นสตริง | str(42) → "42" |
bool() | แปลงเป็นค่าความจริง | bool(0) → False |
กฎสำคัญที่ควรจำ:
bool → int → float)int() ตัดเศษทิ้ง ไม่ได้ปัดเศษ ถ้าต้องการปัดเศษให้ใช้ round()int("3.14") เกิดข้อผิดพลาด ให้แปลงผ่าน float() ก่อน: int(float("3.14"))try/except เพื่อแปลงอินพุตอย่างปลอดภัย ส่วน .isdigit() เป็นการตรวจเบื้องต้นแบบรวดเร็วสำหรับจำนวนเต็มที่เขียนด้วยตัวเลขล้วนบทเรียนถัดไป
ตอนนี้คุณแปลงชนิดข้อมูลได้แล้ว ซึ่งเป็นทักษะสำคัญสำหรับการประมวลผลอินพุตจากผู้ใช้และการสร้างโปรแกรมจริง ในบทเรียนถัดไป คุณจะได้เรียนวิธีเขียน โค้ด Python ที่สะอาดและอ่านง่าย ที่นักพัฒนาคนอื่น (และตัวคุณในอนาคต) จะต้องขอบคุณ