โปรแกรมของเราตอนนี้เก่งขึ้นเยอะ คิดกำไรได้แล้ว แต่ยังมีปัญหาใหญ่อยู่ข้อหนึ่ง — ทุกครั้งที่อยากเปลี่ยนตัวเลข คุณต้องเปิดโค้ดเข้าไปแก้เอง ซึ่งแปลว่าคนอื่นที่ไม่ใช่คุณ ใช้โปรแกรมนี้ไม่ได้เลย EP นี้เราจะแก้เรื่องนั้นครับ
🎯
จบ EP นี้คุณจะทำอะไรได้
ทำให้โปรแกรมถามข้อมูลจากผู้ใช้เองได้ · แปลงข้อความเป็นตัวเลขเป็น · จัดรูปแบบตัวเลขให้มีลูกน้ำและทศนิยมสวยงาม · เขียนโปรแกรมออกใบเสร็จได้ 1 ตัว
ใช้เวลา: อ่าน 15 นาที + ลงมือทำ 30 นาที · ต้องผ่านมาก่อน: EP1, EP2
ทบทวน 30 วินาที — EP2 เราเก็บค่าไว้ในตัวแปร รู้จักชนิดข้อมูล 4 แบบ (str, int, float, bool) และเจอกับดักสำคัญว่า "250" ที่มีคำพูดครอบ คือข้อความ เอาไปคำนวณตรงๆ ไม่ได้ — จำไว้ให้ดี เพราะมันจะกลับมาใน EP นี้
input — ให้โปรแกรมถามเราเป็น
คำสั่งเดียวที่ต้องรู้คือ input() ครับ มันจะหยุดโปรแกรมไว้ รอให้คนพิมพ์ แล้วกด Enter
name = input("คุณชื่ออะไร: ")
print("สวัสดีครับคุณ", name)
รันแล้วโปรแกรมจะหยุดรอ พอคุณพิมพ์ชื่อแล้วกด Enter จะได้
คุณชื่ออะไร: ภูมิพัฒน์
สวัสดีครับคุณ ภูมิพัฒน์
ข้อความในวงเล็บของ input() คือคำถามที่จะขึ้นบนจอ ควรใส่เสมอและใส่ให้ชัดว่าต้องการอะไร ไม่งั้นคนใช้จะงงว่าโปรแกรมค้างหรือรออะไรอยู่
กับดักที่ทำให้มือใหม่ติดกันทุกคน
ลองรันโค้ดนี้ครับ แล้วเดาก่อนว่าจะได้อะไร
qty = input("ซื้อกี่ชิ้น: ")
print(qty * 2)
ถ้าคุณพิมพ์ 12 คุณอาจคิดว่าจะได้ 24 แต่ผลจริงคือ
1212
🚫
input() คืนค่าเป็นข้อความเสมอ ไม่ว่าคุณจะพิมพ์อะไรลงไป
แม้พิมพ์ตัวเลขล้วน Python ก็มองว่าเป็นข้อความ "12" อยู่ดี พอเอาไปคูณ 2 มันเลยแปลว่า "ต่อข้อความนี้ซ้ำ 2 รอบ" ได้ "1212" นี่คือบั๊กอันดับ 1 ของคนเริ่มต้น และตอนนี้คุณรู้ทันแล้ว
วิธีแก้คือครอบด้วย int() สำหรับจำนวนเต็ม หรือ float() สำหรับทศนิยม
qty = int(input("ซื้อกี่ชิ้น: ")) # แปลงเป็นจำนวนเต็ม
price = float(input("ราคาต่อชิ้น: ")) # แปลงเป็นทศนิยม (ใช้กับเงิน)
print(qty * 2) # คราวนี้ได้ 24 แล้ว
อ่านจากในออกนอกนะครับ — input() ทำงานก่อนได้ข้อความมา แล้ว int() ที่ครอบอยู่ข้างนอกค่อยแปลงเป็นตัวเลข
💡
เมื่อไหร่ใช้ int เมื่อไหร่ใช้ float
ของที่นับเป็นชิ้นได้ ไม่มีทางเป็นเศษ → int เช่น จำนวนสินค้า จำนวนคน
ของที่มีเศษได้ → float เช่น ราคา น้ำหนัก ส่วนสูง
ถ้าไม่แน่ใจ ใช้ float ไว้ก่อนปลอดภัยกว่าครับ
f-string — จัดข้อความให้ออกมาสวย
ใน EP2 เราพิมพ์ผลลัพธ์ด้วยการใส่จุลภาคคั่นไปเรื่อยๆ ซึ่งได้ผลแต่หน้าตาไม่สวย และคุมเว้นวรรคไม่ได้ Python มีวิธีที่ดีกว่ามากชื่อว่า f-string
วิธีใช้คือเติมตัว f ไว้หน้าเครื่องหมายคำพูด แล้วเอาชื่อตัวแปรใส่ในปีกกา
name = "ภูมิพัฒน์"
total = 3000
# แบบเก่าจาก EP2
print("คุณ", name, "ยอดรวม", total, "บาท")
# แบบ f-string — อ่านง่ายกว่า คุมเว้นวรรคได้เป๊ะ
print(f"คุณ {name} ยอดรวม {total} บาท")
ทั้งสองแบบให้ผลใกล้เคียงกัน แต่แบบ f-string คุณเห็นหน้าตาผลลัพธ์ได้เลยตั้งแต่ตอนเขียน และในปีกกาใส่การคำนวณลงไปตรงๆ ได้ด้วย
price = 250
qty = 12
print(f"ยอดรวม {price * qty} บาท") # ยอดรวม 3000 บาท
จัดรูปแบบตัวเลขให้เป็นมืออาชีพ
ความสามารถที่ทำให้ f-string เหนือกว่าคือการจัดรูปแบบตัวเลข ด้วยการเติมโค้ดสั้นๆ หลังเครื่องหมาย :
total = 1234567.891
print(f"{total}") # 1234567.891 ดิบๆ อ่านยาก
print(f"{total:.2f}") # 1234567.89 ทศนิยม 2 ตำแหน่ง
print(f"{total:,.2f}") # 1,234,567.89 มีลูกน้ำคั่นหลักพัน
print(f"{total:,.0f}") # 1,234,568 ปัดเป็นจำนวนเต็ม
จำแค่ :,.2f ตัวเดียวก็พอครับ แปลว่า "ใส่ลูกน้ำคั่นหลักพัน และเอาทศนิยม 2 ตำแหน่ง" ซึ่งเป็นรูปแบบมาตรฐานของการแสดงเงินทั่วโลก
สร้างโปรแกรมออกใบเสร็จ
เอาทุกอย่างมารวมกันครับ สร้างไฟล์ ep3_receipt.py
# ==== รับข้อมูลจากผู้ใช้ ====
shop = "ร้านกาแฟหนูดี"
customer = input("ชื่อลูกค้า: ")
item = input("สินค้า: ")
price = float(input("ราคาต่อชิ้น: "))
qty = int(input("จำนวน: "))
# ==== คำนวณ ====
subtotal = price * qty
vat = subtotal * 0.07
total = subtotal + vat
# ==== พิมพ์ใบเสร็จ ====
print()
print("=" * 34)
print(f"{shop:^34}")
print("=" * 34)
print(f"ลูกค้า : {customer}")
print(f"สินค้า : {item}")
print(f"ราคา : {price:,.2f} x {qty}")
print("-" * 34)
print(f"ยอดรวม : {subtotal:>13,.2f} บาท")
print(f"VAT 7% : {vat:>13,.2f} บาท")
print(f"สุทธิ : {total:>13,.2f} บาท")
print("=" * 34)
print("ขอบคุณที่ใช้บริการครับ")
รันแล้วลองใส่ข้อมูลดู จะได้ประมาณนี้
ชื่อลูกค้า: คุณสมชาย
สินค้า: ลาเต้เย็น
ราคาต่อชิ้น: 85
จำนวน: 3
==================================
ร้านกาแฟหนูดี
==================================
ลูกค้า : คุณสมชาย
สินค้า : ลาเต้เย็น
ราคา : 85.00 x 3
----------------------------------
ยอดรวม : 255.00 บาท
VAT 7% : 17.85 บาท
สุทธิ : 272.85 บาท
==================================
ขอบคุณที่ใช้บริการครับ
มีของใหม่ 2 อย่างในโค้ดนี้ที่ผมยังไม่ได้อธิบายครับ
{shop:^34}— เครื่องหมาย ^ แปลว่า "จัดกึ่งกลางในพื้นที่กว้าง 34 ช่อง"{subtotal:>13,.2f}— เครื่องหมาย > แปลว่า "ชิดขวาในพื้นที่กว้าง 13 ช่อง" ซึ่งทำให้ตัวเลขทุกบรรทัดเรียงหลักตรงกันสวยงาม
ยังมี < สำหรับชิดซ้ายอีกตัว ทั้ง 3 ตัวนี้คือเครื่องมือจัดตารางแบบง่ายๆ ที่ใช้ได้ยาวๆ ครับ
✨
print() เปล่าๆ ทำอะไร
บรรทัด print() ที่ไม่มีอะไรในวงเล็บ คือการเว้นบรรทัดว่าง 1 บรรทัด ใช้เยอะมากเวลาอยากให้ผลลัพธ์อ่านง่ายขึ้นครับ
กับดักที่คุณจะเจอ
🚫
1. ลืมครอบด้วย int() หรือ float()
อาการคือตัวเลขซ้ำกันแปลกๆ (1212) หรือพังด้วย TypeError: can't multiply sequence by non-int วิธีเช็คเร็วที่สุดคือ print(type(qty)) ถ้าขึ้น str แปลว่าลืมแปลง
⚠️
2. ผู้ใช้พิมพ์ตัวหนังสือตอนที่โปรแกรมขอตัวเลข
ถ้าโปรแกรมถามจำนวนแล้วคนพิมพ์ว่า "สามชิ้น" จะพังด้วย ValueError: invalid literal for int() ตอนนี้ยังแก้ไม่ได้ครับ ต้องรอ EP9 ที่เราจะเรียนวิธีดักข้อผิดพลาด — ระหว่างนี้ก็พิมพ์ตัวเลขให้ถูกไปก่อนนะครับ
⚠️
3. ลืมใส่ f หน้าเครื่องหมายคำพูด
print("ยอดรวม {total} บาท") จะพิมพ์ปีกกาออกมาตรงๆ เป็น ยอดรวม {total} บาท ซึ่งไม่ error แต่ผลลัพธ์ผิด ข้อนี้อันตรายกว่า error เพราะโปรแกรมไม่เตือนคุณเลย ต้องตาไวเอง
ลงมือทำ
ข้อ 1 (ง่าย) — เขียนโปรแกรมถามชื่อกับปีเกิด แล้วบอกอายุออกมา (ใช้ 2569 ลบปีเกิด)
ดูเฉลยข้อ 1
name = input("ชื่อ: ")
birth_year = int(input("ปีเกิด (พ.ศ.): "))
age = 2569 - birth_year
print(f"สวัสดีครับคุณ {name} ปีนี้อายุ {age} ปี")
ข้อ 2 (กลาง) — แก้โปรแกรมใบเสร็จให้รับสินค้าได้ 2 รายการ แล้วรวมยอดทั้งหมด
ดูเฉลยข้อ 2
item1 = input("สินค้าชิ้นที่ 1: ")
price1 = float(input("ราคา: "))
qty1 = int(input("จำนวน: "))
item2 = input("สินค้าชิ้นที่ 2: ")
price2 = float(input("ราคา: "))
qty2 = int(input("จำนวน: "))
sub1 = price1 * qty1
sub2 = price2 * qty2
total = sub1 + sub2
print("-" * 34)
print(f"{item1:<16}{sub1:>14,.2f}")
print(f"{item2:<16}{sub2:>14,.2f}")
print("-" * 34)
print(f"{'รวมทั้งสิ้น':<16}{total:>14,.2f}")
สังเกตว่าโค้ดเริ่มซ้ำซากแล้วใช่ไหมครับ ถ้ามี 20 รายการคงเขียนไม่ไหว — EP5 (ลิสต์กับลูป) จะแก้ปัญหานี้ให้เหลือไม่กี่บรรทัด
ข้อ 3 (ท้าทาย) — เขียนโปรแกรมคำนวณเงินทอน ถามยอดที่ต้องจ่ายกับเงินที่ลูกค้าให้มา แล้วบอกว่าต้องทอนเท่าไหร่ จัดรูปแบบให้มีลูกน้ำและทศนิยม 2 ตำแหน่ง
ดูเฉลยข้อ 3
total = float(input("ยอดที่ต้องจ่าย: "))
paid = float(input("ลูกค้าให้มา: "))
change = paid - total
print()
print(f"ยอดที่ต้องจ่าย : {total:>12,.2f} บาท")
print(f"รับมา : {paid:>12,.2f} บาท")
print(f"เงินทอน : {change:>12,.2f} บาท")
ถ้าลูกค้าให้เงินไม่พอ ตัวเลขจะติดลบ ซึ่งโปรแกรมยังไม่รู้จักเตือน — EP4 เราจะสอนให้มันตรวจและเตือนเองครับ
เช็คว่าคุณผ่าน EP นี้จริง
- อธิบายได้ว่าทำไม
input()ต้องครอบด้วยint()หรือfloat() - เขียน f-string ได้เอง โดยไม่ลืมตัว f หน้าเครื่องหมายคำพูด
- จัดตัวเลขให้มีลูกน้ำและทศนิยม 2 ตำแหน่งด้วย
:,.2fได้ - โปรแกรมใบเสร็จของคุณรันได้ครบ และตัวเลขในคอลัมน์เรียงตรงกันสวยงาม
EP หน้าเจออะไร
โปรแกรมของเราตอนนี้รับข้อมูลได้ คำนวณได้ แสดงผลสวยได้แล้ว แต่มันยังทำเหมือนเดิมทุกครั้งไม่ว่าข้อมูลจะเป็นยังไง — ซื้อ 100 บาทกับซื้อ 100,000 บาท ก็ปฏิบัติเหมือนกัน
EP4 เราจะสอนให้โปรแกรมตัดสินใจเองได้ ปลายทางคือ ระบบให้ส่วนลดอัตโนมัติตามยอดซื้อ ที่คิดให้เองว่าลูกค้าคนนี้ควรได้ลดกี่เปอร์เซ็นต์ครับ