ข้ามไปยังเนื้อหาหลัก
Editor

การแปลงชนิดข้อมูลใน Python: แปลงข้อมูลระหว่างชนิดต่าง ๆ

เริ่มต้น20 นาที5 แบบฝึกหัด85 XP

บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล

0/5 แบบฝึกหัด

ลองนึกภาพว่าคุณถามอายุใครสักคน แล้วเขาเขียนตอบไว้บนกระดาษโน้ต ตอนนี้คุณได้ข้อความ "25" มา แต่เอากระดาษโน้ตมาคำนวณไม่ได้ ต้องอ่านข้อความนั้นแล้วแปลงเป็นตัวเลขจริง ๆ ในหัวก่อน

Python ก็ทำงานแบบเดียวกัน ข้อมูลมักเข้ามาเป็นชนิดหนึ่ง แต่เราต้องใช้เป็นอีกชนิดหนึ่ง เมื่อผู้ใช้พิมพ์ "42" ลงในฟอร์ม ข้อมูลนั้นเป็นสตริง ไม่ใช่ตัวเลข ก่อนจะนำไปบวก ลบ หรือเปรียบเทียบได้ คุณต้อง แปลง มันก่อน

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

การแปลงชนิดข้อมูลใน Python คืออะไร

การแปลงชนิดข้อมูล (type conversion) คือการเปลี่ยนค่าจากชนิดข้อมูลหนึ่งไปเป็นอีกชนิดหนึ่ง เช่น เปลี่ยนสตริง "42" เป็นจำนวนเต็ม 42 หรือเปลี่ยนจำนวนเต็ม 10 เป็นทศนิยม 10.0

Python มีการแปลงชนิดข้อมูลสองแบบ การแปลงโดยปริยาย (implicit conversion) เกิดขึ้นเองโดยอัตโนมัติ Python จัดการให้อยู่เบื้องหลัง ส่วน การแปลงโดยชัดแจ้ง (explicit conversion) คือการที่คุณใช้ฟังก์ชันอย่าง int() หรือ str() แปลงค่าด้วยตัวเอง

การแปลงโดยปริยายเหมือนโทรศัพท์ที่แก้คำผิดให้อัตโนมัติ ส่วนการแปลงโดยชัดแจ้งเหมือนการแก้คำนั้นด้วยตัวเอง ทั้งสองแบบได้งานเหมือนกัน แต่การทำเองทำให้คุณควบคุมได้มากกว่า

การแปลงโดยปริยายกับโดยชัดแจ้ง
# Implicit conversion - Python does it automatically
result = 5 + 2.0
print(result) # 7.0
print(type(result)) # <class 'float'>
# Explicit conversion - you do it with a function
age_text = "25"
age = int(age_text)
print(age + 5) # 30
ผลลัพธ์
7.0
<class 'float'>
30

การแปลงชนิดข้อมูลโดยปริยายใน Python ทำงานอย่างไร

เมื่อใช้จำนวนเต็มกับทศนิยมร่วมกันในการคำนวณ Python จะแปลงจำนวนเต็มเป็นทศนิยมให้โดยอัตโนมัติ เรียกว่า การแปลงโดยปริยาย (หรือ type coercion) Python จะแปลงไปเป็นชนิดที่ "กว้างกว่า" เสมอ เพื่อไม่ให้ข้อมูลสูญหาย

เหมือนเทน้ำจากแก้วใบเล็กลงถังใบใหญ่ น้ำ (ข้อมูลของคุณ) ยังเท่าเดิม เพียงแต่อยู่ในภาชนะที่ใหญ่ขึ้น การแปลงจาก int เป็น float ปลอดภัยสำหรับตัวเลขที่ใช้ในชีวิตประจำวัน เพราะ float เก็บจำนวนเต็มทุกตัวได้อย่างแม่นยำไปจนถึงประมาณ 9 พันล้านล้าน

ตัวอย่างการแปลงโดยปริยาย
# int + float → float (automatic)
print(5 + 2.0) # 7.0 (not 7)
print(10 * 1.5) # 15.0
print(8 - 3.0) # 5.0
# bool + int → int (True = 1, False = 0)
print(True + 5) # 6
print(False + 10) # 10
# bool + float → float
print(True + 2.5) # 3.5
ผลลัพธ์
7.0
15.0
5.0
6
10
3.5
Python ไม่ยอมเดาเมื่อเป็นสตริง
# This works - both are numbers
print(5 + 2.0) # 7.0
# This CRASHES - string + int is not allowed
try:
print("5" + 3)
except TypeError as e:
print(f"Error: {e}")
ผลลัพธ์
7.0
Error: can only concatenate str (not "int") to str

วิธีแปลงเป็นจำนวนเต็มด้วย int()

ฟังก์ชัน int() แปลงค่าเป็นจำนวนเต็ม แปลงได้ทั้งทศนิยม สตริง และค่าความจริง แต่ละชนิดมีพฤติกรรมต่างกันเล็กน้อย

แปลงทศนิยมเป็นจำนวนเต็ม

เมื่อแปลงทศนิยมเป็นจำนวนเต็ม Python จะ ตัดทิ้ง (truncate) ทุกอย่างหลังจุดทศนิยม โดยไม่ปัดเศษ ลองนึกถึงการตัดเชือก ส่วนที่ยื่นเลยรอยขีดออกไปก็หลุดทิ้งไปเลย

ทศนิยมเป็น int: ตัดทิ้ง ไม่ใช่ปัดเศษ
# int() truncates - it does NOT round
print(int(3.9)) # 3 - not 4!
print(int(3.1)) # 3
print(int(-2.7)) # -2 - truncates toward zero
print(int(99.999)) # 99
# If you want rounding, use round() instead
print(round(3.9)) # 4
print(round(3.1)) # 3
ผลลัพธ์
3
3
-2
99
4
3

แปลงสตริงเป็นจำนวนเต็ม

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

แปลงสตริงและ bool เป็น int
# Valid string-to-int conversions
print(int("42")) # 42
print(int("-7")) # -7
print(int(" 100 ")) # 100 - spaces are stripped
# Booleans to int
print(int(True)) # 1
print(int(False)) # 0
ผลลัพธ์
42
-7
100
1
0

วิธีแปลงเป็นทศนิยมด้วย float()

ฟังก์ชัน float() แปลงค่าเป็นจำนวนทศนิยม (floating-point) ใช้ได้กับจำนวนเต็ม สตริง และค่าความจริง

การแปลงจำนวนเต็มทั่วไปเป็นทศนิยมไม่ทำให้อะไรหายไป ตัวเลขแค่มี .0 ต่อท้ายเพิ่มเข้ามา เหมือนราคา 5 บาทที่เขียนเป็น 5.00 บาท มีเพียงจำนวนเต็มที่เกินขีดจำกัดข้างต้น (2 ** 53) เท่านั้นที่อาจสูญเสียตัวเลขหลักท้าย ๆ ไป

แปลงเป็น float
# int to float
print(float(42)) # 42.0
print(float(-7)) # -7.0
print(float(0)) # 0.0
# string to float
print(float("3.14")) # 3.14
print(float("7")) # 7.0
print(float("-2.5")) # -2.5
# bool to float
print(float(True)) # 1.0
print(float(False)) # 0.0
ผลลัพธ์
42.0
-7.0
0.0
3.14
7.0
-2.5
1.0
0.0

วิธีแปลงเป็นสตริงด้วย str()

ฟังก์ชัน str() แปลงค่าใดก็ได้ให้เป็นสตริงที่แทนค่านั้น นี่คือฟังก์ชันแปลงชนิดข้อมูลที่ยืดหยุ่นที่สุด ใช้ได้กับแทบทุกอย่าง

คุณจะใช้ str() บ่อยที่สุดตอนสร้างข้อความที่มีทั้งตัวอักษรและตัวเลข Python ไม่ยอมให้ใช้ + ต่อสตริงกับตัวเลขเข้าด้วยกัน จึงต้องแปลงตัวเลขเป็นสตริงก่อน

แปลงเป็นสตริง
# Numbers to string
print(str(42)) # "42"
print(str(3.14)) # "3.14"
print(str(-7)) # "-7"
# Booleans to string
print(str(True)) # "True"
print(str(False)) # "False"
# None to string
print(str(None)) # "None"
# Now you can concatenate
age = 25
print("I am " + str(age) + " years old") # I am 25 years old
ผลลัพธ์
42
3.14
-7
True
False
None
I am 25 years old
ใช้ str() และการต่อสตริง
name = "Alice"
age = 25
print("Name: " + name + ", Age: " + str(age))
ใช้ f-string (อ่านง่ายกว่า)
name = "Alice"
age = 25
print(f"Name: {name}, Age: {age}")

วิธีแปลงเป็นค่าความจริงด้วย bool()

ฟังก์ชัน bool() แปลงค่าเป็น True หรือ False กฎนั้นง่ายมาก: ค่าว่างและค่าศูนย์เป็น False นอกนั้นเป็น True ทั้งหมด

ลองคิดเหมือนการถามว่า "ข้างในมีอะไรอยู่ไหม" กล่องเปล่าคือ False ส่วนกล่องที่มีของอยู่ข้างใน แม้จะเป็นแค่เศษกระดาษยับ ๆ หนึ่งแผ่น ก็คือ True

ค่าที่ถือเป็นจริง (truthy) และเป็นเท็จ (falsy)
# Falsy values - these all become False
print(bool(0)) # False
print(bool(0.0)) # False
print(bool("")) # False - empty string
print(bool(None)) # False
print("---")
# Truthy values - these all become True
print(bool(1)) # True
print(bool(-5)) # True - any non-zero number
print(bool(3.14)) # True
print(bool("hello")) # True - any non-empty string
print(bool(" ")) # True - a space is still a character!
ผลลัพธ์
False
False
False
False
---
True
True
True
True
True
การแปลงด้วย bool() ที่ชวนพลาด
# Tricky cases - don't get fooled!
print(bool("0")) # True - non-empty string
print(bool("False")) # True - non-empty string
print(bool("None")) # True - non-empty string
print(bool(" ")) # True - space is a character
# Only the ACTUAL empty string is falsy
print(bool("")) # False
ผลลัพธ์
True
True
True
True
False

ข้อผิดพลาดที่พบบ่อยในการแปลงชนิดข้อมูลใน Python

ไม่ใช่ทุกการแปลงจะทำได้ เมื่อ Python แปลงค่าไม่ได้ จะแจ้งข้อผิดพลาด ValueError นี่คือข้อผิดพลาดที่มือใหม่เจอบ่อยที่สุดเมื่อแปลงชนิดข้อมูล

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

ตัวอย่าง ValueError ที่พบบ่อย
# These conversions CRASH with ValueError
# Can't convert words to numbers
try:
print(int("hello"))
except ValueError as e:
print(f"Error 1: {e}")
# int() can't handle decimal strings
try:
print(int("3.14"))
except ValueError as e:
print(f"Error 2: {e}")
# float() can't handle words either
try:
print(float("abc"))
except ValueError as e:
print(f"Error 3: {e}")
ผลลัพธ์
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 ถ้าทุกตัวอักษรในสตริงเป็นตัวเลข เป็นวิธีตรวจสตริงอย่างรวดเร็วก่อนแปลงเป็นจำนวนเต็ม

ตรวจด้วย .isdigit() ก่อนแปลง
# .isdigit() checks if a string contains only digits
print("42".isdigit()) # True
print("3.14".isdigit()) # False - has a dot
print("-7".isdigit()) # False - has a minus sign
print("hello".isdigit()) # False
print("".isdigit()) # False - empty string
# Check before converting
user_input = "42"
if user_input.isdigit():
number = int(user_input)
print(f"Converted: {number}")
else:
print(f"Cannot convert: {user_input}")
ผลลัพธ์
True
False
False
False
False
Converted: 42

ใช้ try/except เพื่อแปลงอย่างปลอดภัย

รูปแบบ try/except เป็นวิธีที่ยืดหยุ่นที่สุดในการจัดการการแปลง คุณลองแปลงดูก่อน ถ้าไม่สำเร็จก็ดักจับข้อผิดพลาดแล้วทำอย่างอื่นแทน คุณจะได้เรียน try/except อย่างละเอียดในภายหลัง ตอนนี้มาดูรูปแบบพื้นฐานกันก่อน

แปลงอย่างปลอดภัยด้วย try/except
# try/except - the safest approach
def safe_int(value):
try:
return int(value)
except ValueError:
return None
# Works with valid input
print(safe_int("42")) # 42
print(safe_int("100")) # 100
# Returns None for bad input instead of crashing
print(safe_int("hello")) # None
print(safe_int("3.14")) # None
print(safe_int("")) # None
ผลลัพธ์
42
100
None
None
None

แบบฝึกหัด

ได้เวลาทดสอบทักษะการแปลงชนิดข้อมูลของคุณแล้ว แบบฝึกหัดเริ่มจากข้อง่ายแล้วค่อย ๆ ยากขึ้น ลองทำแต่ละข้อก่อนเปิดดูคำใบ้

แบบฝึกหัดที่ 1: แปลงสตริงเป็น int แล้วคูณ
เขียนโค้ด

มีตัวแปรสตริง text ที่เก็บค่า "42" ให้แปลงเป็นจำนวนเต็มแล้วคูณด้วย 2 จากนั้นแสดงผลลัพธ์

ผลลัพธ์ที่ต้องได้:

84
text = "42"
# Convert text to an integer and multiply by 2
# Print the result
แบบฝึกหัดที่ 2: แปลงทศนิยมเป็น int: อะไรหายไปบ้าง
เขียนโค้ด

มีทศนิยม price = 9.99 ให้แปลงเป็นจำนวนเต็ม แล้วแสดงทั้งค่าเดิมและค่าที่แปลงแล้ว เพื่อให้เห็นว่าอะไรหายไป

ผลลัพธ์ที่ต้องได้:

Original: 9.99
Converted: 9
Lost: 0.99

คำใบ้: หาส่วนที่หายไปด้วยการลบ แล้วใช้ round() กับส่วนที่หายไป เพื่อเลี่ยงความแปลกของเลขทศนิยม

price = 9.99
# Convert to int
# Calculate what was lost
# Print all three values
แบบฝึกหัดที่ 3: ทายผลลัพธ์: การแปลงชนิดข้อมูล
ทายผลลัพธ์

ทายว่าแต่ละบรรทัดจะแสดงผลอะไรโดยไม่ต้องรันโค้ด เขียนคำทายเป็นคอมเมนต์ไว้ แล้วรันเพื่อตรวจคำตอบ

คิดให้ดีเรื่องการตัดเศษ การแปลงเป็นสตริง และกฎของค่า truthy/falsy

print(int(3.9)) # Your prediction:
print(float("7")) # Your prediction:
print(str(True)) # Your prediction:
print(bool(0)) # Your prediction:
แบบฝึกหัดที่ 4: แก้บั๊ก: ต่อสตริงกับ int
แก้บั๊ก

โค้ดนี้พยายามสร้างข้อความ แต่หยุดทำงานด้วย TypeError แก้ให้แสดงผล:

You have 3 new messages

จะแก้ด้วยวิธีไหนก็ได้ (str(), f-string ฯลฯ)

count = 3
message = "You have " + count + " new messages"
print(message)
แบบฝึกหัดที่ 5: แปลงเฉพาะตัวเลข
เขียนโค้ด

เขียนโค้ดตรวจสตริงสามตัวด้วย .isdigit() และแปลงเป็นจำนวนเต็มเฉพาะสตริงที่ประกอบด้วยตัวเลขล้วน สำหรับแต่ละสตริง ให้แสดงตัวเลขที่แปลงแล้ว หรือแสดง "Not a number"

ข้อมูลที่ให้มา:

values = ["42", "hello", "100"]

ผลลัพธ์ที่ต้องได้:

42
Not a number
100
values = ["42", "hello", "100"]
# Loop through values
# If the value is a digit, convert and print the integer
# Otherwise print "Not a number"

สรุป: การแปลงชนิดข้อมูลใน 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"))
  • ค่าว่างและค่าศูนย์เป็น falsy นอกนั้นเป็น truthy ทั้งหมด
  • ใช้ try/except เพื่อแปลงอินพุตอย่างปลอดภัย ส่วน .isdigit() เป็นการตรวจเบื้องต้นแบบรวดเร็วสำหรับจำนวนเต็มที่เขียนด้วยตัวเลขล้วน
  • บทเรียนถัดไป

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

    บทเรียนที่เกี่ยวข้อง

    บทเรียนนี้มีประโยชน์หรือไม่