Python สำหรับคนเริ่มต้น

EP3: รับค่าจากผู้ใช้และจัดข้อความ — เขียนโปรแกรมออกใบเสร็จ

AD
admin
AIBiz Thailand
61 views 6 นาที 16 ส.ค. 2026
แชร์ Facebook Facebook Group LINE

โปรแกรมของเราตอนนี้เก่งขึ้นเยอะ คิดกำไรได้แล้ว แต่ยังมีปัญหาใหญ่อยู่ข้อหนึ่ง — ทุกครั้งที่อยากเปลี่ยนตัวเลข คุณต้องเปิดโค้ดเข้าไปแก้เอง ซึ่งแปลว่าคนอื่นที่ไม่ใช่คุณ ใช้โปรแกรมนี้ไม่ได้เลย 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() ที่ครอบอยู่ข้างนอกค่อยแปลงเป็นตัวเลข

เส้นทางของข้อมูล ตั้งแต่คนพิมพ์ จนออกมาเป็นใบเสร็จ 1. รับค่า input() คนพิมพ์เข้ามา 2. แปลงชนิด int() / float() ขั้นที่คนลืมบ่อยที่สุด 3. คำนวณ price * qty ได้ยอดรวม 4. จัดรูป f"..." พิมพ์ใบเสร็จ ทำไมต้องมีขั้นที่ 2 input() คืนค่าเป็น "ข้อความ" เสมอ แม้คนจะพิมพ์ตัวเลข "12" * 2 → "1212" ไม่ใช่ 24
จำลำดับนี้ให้ขึ้นใจ — ขั้นที่ 2 คือขั้นที่คนลืมบ่อยที่สุด

💡

เมื่อไหร่ใช้ 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 เราจะสอนให้โปรแกรมตัดสินใจเองได้ ปลายทางคือ ระบบให้ส่วนลดอัตโนมัติตามยอดซื้อ ที่คิดให้เองว่าลูกค้าคนนี้ควรได้ลดกี่เปอร์เซ็นต์ครับ

ปรึกษาฟรี