ตัวแปรและชนิดข้อมูลใน Python: บทนำแบบลงมือทำ
บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล
ลองนึกภาพว่าคุณกำลังส่งพัสดุ คุณกรอกฉลากที่ถามน้ำหนัก แต่กลับเขียนว่า "หนัก" แทนที่จะเป็นตัวเลข ระบบขนส่งพังทันที เพราะคำนวณราคาจากคำว่า "หนัก" ไม่ได้
นี่คือปัญหาที่ ชนิดข้อมูล (data type) เข้ามาแก้ในการเขียนโปรแกรม ชนิดข้อมูลบอก Python ว่าค่าหนึ่งเป็นตัวเลข ข้อความ คำตอบจริง/เท็จ หรือไม่มีค่าอะไรเลย การกำหนดชนิดให้ถูกคือความต่างระหว่างโค้ดที่ทำงานได้กับโค้ดที่พังไม่เป็นท่า
ในบทเรียนก่อนหน้า คุณได้เรียนวิธีสร้างตัวแปรและใช้งานสตริงกับตัวเลขแล้ว คราวนี้เราจะลงลึกขึ้น คุณจะได้รู้จักชนิดข้อมูลหลักทุกชนิดใน Python เรียนวิธีตรวจและแปลงชนิดข้อมูล และหลีกเลี่ยงบั๊กเรื่องชนิดข้อมูลที่พบบ่อยที่สุด
ชนิดข้อมูลใน Python คืออะไร
ชนิดข้อมูล คือป้ายที่บอก Python ว่าค่าหนึ่งเป็นค่าประเภทไหน และเป็นตัวกำหนดว่าคุณทำอะไรกับค่านั้นได้บ้าง
ลองนึกถึงอุปกรณ์ในครัว ถ้วยตวงใช้ตวงของเหลว ตาชั่งใช้ชั่งของแข็ง คุณคงไม่เทแป้งลงถ้วยตวงแล้วหวังว่าจะได้น้ำหนักที่แม่นยำ อุปกรณ์แต่ละอย่างออกแบบมาสำหรับของแต่ละประเภท
Python มีชนิดข้อมูลหลัก 5 ชนิดที่คุณจะได้ใช้ทุกวัน:
<class 'int'> <class 'float'> <class 'str'> <class 'bool'> <class 'NoneType'>
ฟังก์ชัน type() คือเพื่อนที่ดีที่สุดของคุณเวลาทำงานกับชนิดข้อมูล มันบอกได้ชัดเจนว่าค่าที่คุณกำลังจัดการเป็นชนิดอะไร เมื่อโค้ดไม่ทำงาน การตรวจชนิดข้อมูลมักเป็นวิธีที่เร็วที่สุดในการหาต้นเหตุ
จำนวนเต็มและทศนิยมใน Python ทำงานอย่างไร
Python มีตัวเลขสองชนิด: จำนวนเต็ม (int) สำหรับตัวเลขที่ไม่มีเศษ และ ทศนิยม (float) สำหรับตัวเลขที่มีจุดทศนิยม ส่วนใหญ่คุณไม่ต้องคิดถึงความต่างนี้ แต่บางครั้งมันสำคัญมาก
เมื่อไรควรใช้จำนวนเต็ม เมื่อไรควรใช้ทศนิยม
ใช้ จำนวนเต็ม เมื่อค่านั้นเป็นจำนวนเต็มเสมอ เช่น การนับคน การเก็บคะแนน หรือการระบุดัชนีในลิสต์ ใช้ ทศนิยม กับตัวเลขที่อาจมีส่วนทศนิยม เช่น การวัดอุณหภูมิ การคำนวณเปอร์เซ็นต์ หรือการทำงานกับเงิน
<class 'int'> <class 'float'>
ทำให้ตัวเลขใหญ่ๆ อ่านง่ายด้วยขีดล่าง
ตัวเลขใหญ่ๆ อ่านยาก 1000000 คือหนึ่งล้านหรือสิบล้านกันแน่ Python ให้คุณใช้ขีดล่าง (underscore) เป็นตัวคั่นเพื่อให้อ่านง่าย Python ไม่สนใจขีดล่างเหล่านี้เลย มันมีไว้ให้คนอ่านเท่านั้น
8000000000 <class 'int'> 1250000.75
ปัญหา 0.1 + 0.2 ใน Python
นี่คือเรื่องที่ทำให้แทบทุกคนประหลาดใจเมื่อเห็นครั้งแรก ลองรันโค้ดนี้:
0.30000000000000004
คุณคาดว่าจะได้ 0.3 แต่กลับได้ 0.30000000000000004 นี่ไม่ใช่บั๊กของ Python ภาษาโปรแกรมส่วนใหญ่ก็ให้คำตอบเดียวกัน เพราะเก็บเลขทศนิยมด้วยวิธีเดียวกัน
คอมพิวเตอร์เก็บตัวเลขในรูปเลขฐานสอง (1 กับ 0) เลขทศนิยมบางตัว เช่น 0.1 แทนในฐานสองได้ไม่ตรงเป๊ะ เหมือนกับที่ 1/3 เขียนเป็นทศนิยมได้ไม่ลงตัว (0.333333... ไปเรื่อยๆ ไม่มีที่สิ้นสุด)
False 0.3 True
อีกรายละเอียดหนึ่งที่สำคัญ: การหารปกติ (/) ให้ผลเป็นทศนิยมเสมอ แม้ตัวเลขทั้งสองจะเป็นจำนวนเต็มและหารลงตัวก็ตาม
5.0 <class 'float'> 5 <class 'int'>
บูลีนใน Python ทำงานอย่างไร (True และ False)
บูลีน (boolean) คือชนิดข้อมูลที่ง่ายที่สุดใน Python มีได้แค่สองค่าเท่านั้น: True หรือ False แค่นั้นเอง
บูลีนเหมือนสวิตช์ไฟ เปิดหรือปิด ใช่หรือไม่ใช่ มันเป็นรากฐานของทุกการตัดสินใจในโค้ดของคุณ ทุกคำสั่ง if ทุกลูป while และทุกการเปรียบเทียบ ล้วนลงเอยที่ค่าบูลีน
True <class 'bool'> True False True False
ค่า truthy และ falsy ใน Python คืออะไร
ทุกค่าใน Python ใช้เป็นบูลีนได้ บางค่านับเป็น True (เรียกว่า "truthy") และบางค่านับเป็น False (เรียกว่า "falsy") คุณตรวจค่าใดก็ได้ด้วยการส่งค่านั้นให้ bool()
False False False False False --- True True True True True
นี่คือค่า falsy ที่คุณจะเจอบ่อยที่สุด หลักการคือ False, None, ศูนย์ของตัวเลขทุกชนิด และทุกอย่างที่ว่างเปล่า ค่าอื่นนอกจากนี้เป็น truthy ทั้งหมด:
| ค่า falsy | ชนิด | ทำไมจึงเป็น falsy |
|---|---|---|
False | bool | มันคือ False อยู่แล้ว |
0 | int | ศูนย์ |
0.0 | float | ศูนย์ |
"" | str | สตริงว่าง |
None | NoneType | ไม่มีค่า |
[] | list | ลิสต์ว่าง |
{} | dict | ดิกชันนารีว่าง |
() | tuple | ทูเพิลว่าง |
set() | set | เซตว่าง |
None ใน Python คืออะไร
None คือวิธีที่ Python ใช้บอกว่า "ไม่มีอะไรตรงนี้" มันไม่ใช่ศูนย์ ไม่ใช่สตริงว่าง แต่คือการไม่มีค่าใดๆ เลย
ลองนึกถึงแบบฟอร์มที่มีช่อง "ชื่อกลาง" (middle name) ถ้าใครเว้นว่างไว้ นั่นต่างจากการเขียนเลข 0 หรือสตริงว่าง "" เขาแค่ไม่มีชื่อกลาง ช่องที่เว้นว่างนั้นคือ None
None <class 'NoneType'> False False False
วิธีตรวจค่า None ใน Python
ใช้ is None หรือ is not None ทุกครั้งที่ตรวจค่า None อย่าใช้ == นี่เป็นธรรมเนียมของ Python ที่มีเหตุผลทางเทคนิครองรับจริงๆ
value = None
if value == None:
print("No value")value = None
if value is None:
print("No value")Hello, stranger! Hello, Alice!
คุณจะเห็น None ถูกใช้เป็นค่าเริ่มต้นในฟังก์ชันอยู่บ่อยๆ เป็นวิธีที่เรียบร้อยในการบอกว่า "อาร์กิวเมนต์นี้จะใส่หรือไม่ใส่ก็ได้"
วิธีตรวจชนิดของตัวแปรใน Python
Python มีเครื่องมือตรวจชนิดข้อมูลให้สองตัว คือ type() และ isinstance() ทั้งสองดูคล้ายกันแต่ใช้ต่างจุดประสงค์กัน
ใช้ type() เพื่อดูชนิดของค่า
type() บอกชนิดที่แท้จริงของค่า มีประโยชน์มากเวลาดีบัก เมื่อมีอะไรไม่ทำงาน การดูชนิดข้อมูลมักเผยให้เห็นปัญหาได้ทันที
<class 'int'> <class 'float'> <class 'str'> <class 'bool'> <class 'NoneType'> True False
ใช้ isinstance() ตรวจชนิดข้อมูล
isinstance() ตรวจว่าค่าหนึ่งเป็นชนิดที่กำหนดหรือไม่ (หรือเป็นชนิดใดชนิดหนึ่งในหลายชนิด) เป็นวิธีที่นิยมใช้ตรวจชนิดข้อมูลในโค้ดจริง เพราะใช้ได้กับการสืบทอด (inheritance) และอ่านเข้าใจง่ายกว่า
True True False True True False
เกร็ดน่ารู้: ใน Python บูลีนเป็นคลาสย่อย (subclass) ของจำนวนเต็ม เบื้องหลังแล้ว True ก็คือ 1 และ False ก็คือ 0
True True 2 10 42
วิธีแปลงชนิดข้อมูลใน Python
บางครั้งคุณมีค่าเป็นชนิดหนึ่ง แต่ต้องการใช้เป็นอีกชนิดหนึ่ง เช่น ผู้ใช้พิมพ์อายุลงในฟอร์ม ค่านั้นมาถึงในรูปสตริง "25" แต่คุณต้องใช้จำนวนเต็ม 25 เพื่อคำนวณ Python มีฟังก์ชันในตัว (built-in) สำหรับแปลงชนิดข้อมูลไว้ให้
แปลงด้วย int(), float(), str() และ bool()
30 19.98 Your score: 100 42.0 3
ข้อควรระวังในการแปลงชนิดข้อมูล
ไม่ใช่ทุกการแปลงจะทำได้ Python จะหยุดทำงานพร้อม ValueError ถ้าคุณพยายามแปลงสิ่งที่ไม่สมเหตุสมผล
42 3.14 100 Error: invalid literal for int() with base 10: 'hello' Error: invalid literal for int() with base 10: '3.14' 3
การแปลงเป็น bool() เป็นไปตามกฎ truthy/falsy ที่เราเรียนไปแล้ว:
True False True False False True
การกำหนดค่าตัวแปรใน Python: กำหนดหลายตัวพร้อมกันและการสลับค่า
Python มีทางลัดที่สะดวกสำหรับทำงานกับตัวแปร ซึ่งภาษาอื่นส่วนใหญ่ไม่มี และไม่ใช่แค่ลูกเล่น นักพัฒนามืออาชีพใช้กันทุกวัน
กำหนดค่าหลายตัวแปรในบรรทัดเดียว
คุณกำหนดค่าให้หลายตัวแปรได้ในบรรทัดเดียว ซึ่งสะดวกมากเมื่อมีกลุ่มค่าที่เกี่ยวข้องกัน
10 20 30 Alice Smith, age 25 0 0 0
สลับค่าตัวแปรโดยไม่ต้องใช้ตัวแปรชั่วคราว
ในภาษาส่วนใหญ่ การสลับค่าตัวแปรสองตัวต้องใช้ตัวแปรชั่วคราว แต่ Python มีวิธีที่สะอาดกว่า
a = 1
b = 2
# Need a third variable to hold the value
temp = a
a = b
b = temp
print(a, b) # 2 1a = 1
b = 2
# Python handles the swap in one step
a, b = b, a
print(a, b) # 2 1บรรทัด a, b = b, a ทำงานได้เพราะ Python ประเมินค่าฝั่งขวาทั้งหมดก่อน (b, a กลายเป็น 2, 1) แล้วจึงกำหนดค่าเหล่านั้นให้ฝั่งซ้าย ไม่ต้องใช้ตัวแปรชั่วคราว
แบบฝึกหัด
ได้เวลาทดสอบความรู้แล้ว แบบฝึกหัดเหล่านี้ครอบคลุมทุกอย่างในบทเรียนนี้ เรียงจากง่ายไปยาก
จำไว้ว่า การติดขัดคือส่วนหนึ่งของการเรียนรู้ ลองทำแต่ละข้อด้วยตัวเองก่อนแอบดูคำใบ้ และอ่านข้อความแจ้งข้อผิดพลาดให้ดี เพราะมักบอกได้ตรงจุดว่าผิดตรงไหน
สร้างตัวแปรหนึ่งตัวสำหรับชนิดข้อมูลหลักแต่ละชนิดของ Python แล้วแสดงชนิดของมัน ผลลัพธ์ต้องตรงกับนี้ทุกตัวอักษร:
<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>
<class 'NoneType'>ตั้งชื่อตัวแปรและกำหนดค่าอะไรก็ได้ ขอแค่ชนิดข้อมูลตรงกัน
แปลงอุณหภูมิจากองศาฟาเรนไฮต์เป็นองศาเซลเซียส
สูตรคือ: **เซลเซียส = (ฟาเรนไฮต์ - 32) * 5 / 9**
มีตัวแปร fahrenheit ที่มีค่า 98.6 ให้มา คำนวณค่าองศาเซลเซียสที่เท่ากัน แล้วแสดงผลในรูปแบบนี้ทุกตัวอักษร:
98.6F = 37.0Cทายว่าแต่ละบรรทัดจะแสดงผลอะไรโดยยังไม่รันโค้ด จากนั้นรันเพื่อตรวจคำตอบ
เขียนคำทายของคุณเป็นคอมเมนต์ แล้วกด รัน เพื่อตรวจสอบ
โค้ดนี้ควรแสดงสรุปโปรไฟล์ของผู้ใช้ แต่กลับพังด้วย TypeError แก้โค้ดให้แสดงผลดังนี้:
Name: Alice
Age: 25
Height: 5.6 feetจะแก้ด้วยวิธีไหนก็ได้ (f-string, แปลงด้วย str() ฯลฯ)
มีตัวแปรสองตัวให้มา: a = 10 และ b = 20 สลับค่าของทั้งสอง โดยไม่ใช้ตัวแปรชั่วคราว แล้วแสดงผลทั้งคู่
ผลลัพธ์ที่ต้องได้:
a = 20
b = 10มีสตริง price_text ที่เก็บค่า "49" และจำนวนเต็ม quantity ที่มีค่า 3 ให้มา
1. แปลง price_text เป็นจำนวนเต็ม
2. คำนวณยอดรวม (ราคาคูณจำนวน)
3. แสดงผลในรูปแบบนี้ทุกตัวอักษร:
3 items at $49 each = $147 totalต้องใช้ตัวแปรเดิมที่ให้มา ห้ามพิมพ์ตัวเลขลงไปตรงๆ ในคำสั่ง print
สรุป: ตัวแปรและชนิดข้อมูลใน Python
ตารางสรุปทุกอย่างที่คุณได้เรียนในบทเรียนนี้:
| ชนิด | ตัวอย่าง | เก็บอะไร |
|---|---|---|
int | 42, -7, 1_000 | จำนวนเต็ม |
float | 3.14, 0.0, -2.5 | เลขทศนิยม |
str | "hello", 'world' | ข้อความ |
bool | True, False | ค่าใช่/ไม่ใช่ |
None | None | การไม่มีค่า |
เครื่องมือสำคัญ:
| เครื่องมือ | ใช้ทำอะไร | ตัวอย่าง |
|---|---|---|
type(x) | ดูว่า x เป็นชนิดอะไร | type(42) → <class 'int'> |
isinstance(x, int) | ตรวจว่า x เป็นชนิดที่กำหนดหรือไม่ | isinstance(42, int) → True |
int(), float(), str() | แปลงชนิดข้อมูล | int("42") → 42 |
bool() | ตรวจ truthy/falsy | bool("") → False |
a, b = 1, 2 | กำหนดค่าหลายตัวแปรพร้อมกัน | กำหนดหลายตัวแปรในครั้งเดียว |
a, b = b, a | สลับค่า | ไม่ต้องใช้ตัวแปรชั่วคราว |
เรียนอะไรต่อ
ในบทเรียนถัดไป ตัวเลขและคณิตศาสตร์ คุณจะได้เจาะลึกระบบตัวเลขของ Python เรียนรู้โมดูล math วิธีปัดเศษแบบต่าง ๆ การจัดรูปแบบตัวเลข และการเขียนโปรแกรมที่คำนวณตัวเลขได้อย่างมืออาชีพ