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

EP4: เงื่อนไข if/else — สร้างระบบส่วนลดอัตโนมัติ

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

ทุกธุรกิจมีกฎอยู่ในหัวเจ้าของเสมอครับ "ซื้อครบพันลดห้าเปอร์เซ็นต์" "สมาชิกลดเพิ่มอีกห้า" "ถ้าเงินไม่พอห้ามจบบิล" — กฎพวกนี้แหละที่เราจะย้ายจากหัวคุณลงไปอยู่ในโปรแกรม พอย้ายเสร็จ โปรแกรมจะตัดสินใจแทนคุณได้เอง ไม่มีวันลืม ไม่มีวันคิดผิด

🎯

จบ EP นี้คุณจะทำอะไรได้

เขียนเงื่อนไข if / elif / else ได้ · ใช้ and และ or รวมหลายเงื่อนไขได้ · เขียนระบบให้ส่วนลดอัตโนมัติตามยอดซื้อได้ 1 ตัว
ใช้เวลา: อ่าน 16 นาที + ลงมือทำ 30 นาที · ต้องผ่านมาก่อน: EP1-EP3

ทบทวน 30 วินาที — EP3 เรารับค่าจากผู้ใช้ด้วย input() แปลงชนิดด้วย int() / float() และจัดข้อความสวยๆ ด้วย f-string โดยเฉพาะ {total:,.2f} ที่จะใช้ต่อใน EP นี้เยอะมาก

if — ถ้าเงื่อนไขจริง ให้ทำ

🚦

เหมือนป้ายหน้าร้านที่เขียนว่า "ซื้อครบ 1,000 บาท รับส่วนลด 5%" พนักงานของคุณจะดูยอดก่อน ถ้าถึงพันก็ลดให้ ถ้าไม่ถึงก็ไม่ลด if คือการเขียนป้ายนั้นให้คอมพิวเตอร์อ่านออกครับ

โครงสร้างมี 3 ส่วนที่ต้องครบ ขาดอย่างใดอย่างหนึ่งไม่ได้

total = 1500

if total >= 1000:              # 1. เงื่อนไข ตามด้วยเครื่องหมาย :
    print("คุณได้ส่วนลด 5%")    # 2. เว้น 4 ช่อง แล้วเขียนสิ่งที่จะทำ

print("จบการคำนวณ")             # 3. ชิดซ้าย = ทำทุกครั้งไม่ว่ายังไง

ผลที่ได้คือทั้งสองบรรทัดถูกพิมพ์ แต่ถ้าเปลี่ยน total เป็น 500 จะเหลือแค่ "จบการคำนวณ" บรรทัดเดียว

การเว้นวรรคหน้าบรรทัด คือสิ่งที่บอกว่า "บรรทัดนี้อยู่ในเงื่อนไขหรือเปล่า" ถูกต้อง ✓ if total >= 1000: discount = 0.05 print("จบแล้ว") บรรทัดที่ย่อหน้า = ทำเฉพาะตอนเงื่อนไขจริง บรรทัดที่ชิดซ้าย = ทำทุกครั้ง ผิด ✗ if total >= 1000: discount = 0.05 IndentationError: expected an indented block ลืมเว้น 4 ช่อง → Python ไม่รู้ว่าจะทำอะไรถ้าเงื่อนไขจริง
ใน Python การเว้นวรรคหน้าบรรทัดไม่ใช่แค่ความสวยงาม แต่มีความหมายจริงๆ

🚫

การเว้นวรรคหน้าบรรทัดคือกฎเหล็กของ Python

ภาษาอื่นใช้ปีกกา { } บอกขอบเขต แต่ Python ใช้การย่อหน้าแทน บรรทัดที่ย่อหน้าเข้าไปคือ "อยู่ในเงื่อนไข" บรรทัดที่ชิดซ้ายคือ "อยู่นอกเงื่อนไข" มาตรฐานคือเว้น 4 ช่อง ซึ่ง VS Code จะทำให้อัตโนมัติเมื่อคุณกด Enter หลังเครื่องหมาย :

เครื่องหมายเปรียบเทียบ 6 ตัว

สิ่งที่อยู่หลัง if ต้องเป็นคำถามที่ตอบได้แค่ จริง หรือ เท็จ เท่านั้น (จำ bool จาก EP2 ได้ไหมครับ — นี่แหละที่มันถูกใช้จริง)

a = 10
b = 3

print(a > b)      # True   มากกว่า
print(a < b)      # False  น้อยกว่า
print(a >= 10)    # True   มากกว่าหรือเท่ากับ
print(a <= 9)     # False  น้อยกว่าหรือเท่ากับ
print(a == 10)    # True   เท่ากับ  (เท่ากับ 2 ตัว!)
print(a != b)     # True   ไม่เท่ากับ

⚠️

= กับ == ไม่เหมือนกันเด็ดขาด

= ตัวเดียว คือ "เอาค่าใส่กล่อง" (จาก EP2)
== สองตัว คือ "ถามว่าเท่ากันไหม"
เขียน if a = 10: จะได้ SyntaxError ทันที เป็นความผิดพลาดที่คนเขียนโปรแกรมทุกคนบนโลกเคยทำ รวมถึงคนที่เขียนมา 20 ปีแล้วครับ

else และ elif — ไล่เงื่อนไขเป็นชั้น

else แปลว่า "ถ้าไม่เข้าเงื่อนไขข้างบนเลย ให้ทำอันนี้แทน"

total = 500

if total >= 1000:
    print("ได้ส่วนลด")
else:
    print("ยังไม่ถึงยอดขั้นต่ำ ซื้อเพิ่มอีก", 1000 - total, "บาท")

ส่วน elif (ย่อมาจาก else if) ใช้ตอนมีเงื่อนไขหลายชั้น ซึ่งเป็นกรณีของธุรกิจจริงส่วนใหญ่

if total >= 5000:
    discount = 0.15
elif total >= 2000:
    discount = 0.10
elif total >= 1000:
    discount = 0.05
else:
    discount = 0
Python ไล่เงื่อนไขจากบนลงล่าง แล้วหยุดทันทีที่เจอข้อแรกที่เป็นจริง total = 3000 if total >= 5000: เท็จ ✗ 3000 ไม่ถึง 5000 → ข้ามไปข้อถัดไป elif total >= 2000: จริง ✓ ทำบรรทัดข้างใน แล้วจบเลย elif total >= 1000: ไม่ถูกตรวจเลย else: ไม่ถูกตรวจเลย 2 ข้อล่างนี้ ถูกข้ามทั้งหมด
Python หยุดทันทีที่เจอเงื่อนไขแรกที่เป็นจริง ข้อที่เหลือไม่ถูกตรวจเลย

🚫

ลำดับของ elif สำคัญมาก เรียงผิดคือธุรกิจเสียหายจริง

ถ้าคุณเอา if total >= 1000 ขึ้นก่อน ลูกค้าที่ซื้อ 8,000 บาท จะเข้าเงื่อนไขแรกทันทีแล้วได้ลดแค่ 5% ทั้งที่ควรได้ 15% เพราะ Python หยุดที่ข้อแรกที่จริง กฎคือเรียงจากเงื่อนไขที่เข้มที่สุดลงมาหาหลวมที่สุดเสมอ

and และ or — รวมหลายเงื่อนไข

บางกฎต้องเช็คหลายอย่างพร้อมกัน เช่น "เป็นสมาชิก และ ซื้อครบ 1,000"

is_member = True
total = 1500

if is_member and total >= 1000:
    print("ได้ส่วนลดสมาชิกพิเศษ")
  • and — ต้องจริงทั้งคู่ ถึงจะผ่าน (เข้มกว่า)
  • or — จริงอย่างใดอย่างหนึ่งก็ผ่าน (หลวมกว่า)
  • not — กลับผลจากจริงเป็นเท็จ
if is_member or total >= 5000:
    print("ส่งฟรี")           # เป็นสมาชิก หรือ ซื้อเยอะ อย่างใดอย่างหนึ่งก็ได้

สร้างระบบส่วนลดอัตโนมัติ

รวมทุกอย่างเข้าด้วยกันครับ สร้างไฟล์ ep4_discount.py

print("=== ระบบคิดส่วนลด ร้านกาแฟหนูดี ===")
print()

total = float(input("ยอดซื้อรวม (บาท): "))
answer = input("เป็นสมาชิกไหม (y/n): ")
is_member = answer == "y"

# ==== ขั้นบันไดส่วนลดตามยอดซื้อ (เรียงจากเข้มไปหลวม) ====
if total >= 5000:
    discount = 0.15
    tier = "ลูกค้า VIP"
elif total >= 2000:
    discount = 0.10
    tier = "ลูกค้าประจำ"
elif total >= 1000:
    discount = 0.05
    tier = "ลูกค้าทั่วไป"
else:
    discount = 0
    tier = "ยังไม่ถึงยอดขั้นต่ำ"

# ==== สมาชิกได้เพิ่มอีก 5% ====
if is_member:
    discount = discount + 0.05

# ==== คำนวณ ====
saved = total * discount
final = total - saved

# ==== แสดงผล ====
print()
print("=" * 38)
print(f"ระดับลูกค้า : {tier}")
if is_member:
    print("สถานะ       : สมาชิก (+5%)")
print("-" * 38)
print(f"ยอดซื้อ      : {total:>14,.2f} บาท")
print(f"ส่วนลด {discount*100:.0f}%   : {saved:>14,.2f} บาท")
print(f"ยอดต้องชำระ  : {final:>14,.2f} บาท")
print("=" * 38)

if discount == 0:
    need = 1000 - total
    print(f"ซื้อเพิ่มอีก {need:,.2f} บาท จะได้ส่วนลด 5% ทันที")

ลองรันด้วยยอด 3,500 บาท และตอบว่าเป็นสมาชิก จะได้

ยอดซื้อรวม (บาท): 3500
เป็นสมาชิกไหม (y/n): y

======================================
ระดับลูกค้า : ลูกค้าประจำ
สถานะ       : สมาชิก (+5%)
--------------------------------------
ยอดซื้อ      :       3,500.00 บาท
ส่วนลด 15%   :         525.00 บาท
ยอดต้องชำระ  :       2,975.00 บาท
======================================

ลองรันซ้ำหลายๆ รอบด้วยยอดต่างกันครับ — 500, 1200, 2500, 8000 ทั้งแบบสมาชิกและไม่ใช่ คุณจะเห็นว่าโปรแกรมตัดสินใจถูกทุกครั้ง ไม่มีวันลืมกฎข้อไหนเลย นี่คือความต่างระหว่างกฎที่อยู่ในหัวคน กับกฎที่อยู่ในระบบ

🏪

เอาไปใช้จริงได้เลย

เปลี่ยนตัวเลขขั้นบันไดกับเปอร์เซ็นต์ให้ตรงกับกฎร้านคุณ แล้วเปิดโปรแกรมนี้ทิ้งไว้ตอนคิดเงิน พนักงานใหม่จะคิดส่วนลดถูกตั้งแต่วันแรก โดยไม่ต้องท่องกฎเลยครับ

กับดักที่คุณจะเจอ

🚫

1. ลืมเครื่องหมาย : ท้ายบรรทัด if

if total >= 1000 (ไม่มี :) จะได้ SyntaxError: expected ':' — ทุกบรรทัดที่ขึ้นต้นด้วย if, elif, else ต้องจบด้วยเครื่องหมาย : เสมอ ไม่มีข้อยกเว้น

🚫

2. ย่อหน้าไม่เท่ากัน

ถ้าบางบรรทัดเว้น 4 ช่อง บางบรรทัดเว้น 2 ช่อง จะได้ IndentationError: unindent does not match any outer indentation level ปัญหานี้เกิดบ่อยเวลาก๊อปโค้ดจากเว็บมาวาง — อีกเหตุผลที่ผมย้ำให้พิมพ์เอง ถ้าเจอให้ลบช่องว่างหน้าบรรทัดทิ้งแล้วกด Tab ใหม่

⚠️

3. เทียบข้อความโดยลืมเรื่องตัวพิมพ์ใหญ่-เล็ก

ถ้าคนใช้พิมพ์ Y ตัวใหญ่ แต่โค้ดคุณเช็ค == "y" ตัวเล็ก จะไม่ผ่าน แก้ได้ด้วย answer.lower() == "y" ซึ่ง .lower() จะแปลงเป็นตัวเล็กทั้งหมดก่อนเทียบ

⚠️

4. ใช้ if หลายอันแทน elif

ถ้าเขียน if เรียงกัน 4 อันโดยไม่ใช้ elif Python จะตรวจทุกข้อและทำทุกข้อที่จริง ทำให้ลูกค้าที่ซื้อ 8,000 บาท โดนคิดส่วนลดทับกัน 3 ชั้น — จำง่ายๆ ว่า เลือกได้แค่ข้อเดียวใช้ elif เลือกได้หลายข้อใช้ if แยก

ลงมือทำ

ข้อ 1 (ง่าย) — เขียนโปรแกรมถามอายุ แล้วบอกว่าเข้าเงื่อนไขไหน ต่ำกว่า 13 = เด็ก, 13-19 = วัยรุ่น, 20-59 = ผู้ใหญ่, 60 ขึ้นไป = ผู้สูงอายุ (ได้ส่วนลด 10%)

ดูเฉลยข้อ 1
age = int(input("อายุ: "))

if age >= 60:
    print("ผู้สูงอายุ — รับส่วนลด 10%")
elif age >= 20:
    print("ผู้ใหญ่")
elif age >= 13:
    print("วัยรุ่น")
else:
    print("เด็ก")

สังเกตว่าเรียงจากมากไปน้อย ทำให้ไม่ต้องเขียนเงื่อนไขซ้อนแบบ age >= 20 and age < 60 เลย เพราะถ้ามาถึงบรรทัดนั้นได้ แปลว่าไม่ถึง 60 อยู่แล้ว

ข้อ 2 (กลาง) — แก้โปรแกรมเงินทอนจาก EP3 ให้เตือนเมื่อลูกค้าให้เงินไม่พอ และบอกว่าขาดอีกเท่าไหร่ ถ้าพอดีเป๊ะให้บอกว่า "รับเงินพอดี ไม่มีทอน"

ดูเฉลยข้อ 2
total = float(input("ยอดที่ต้องจ่าย: "))
paid = float(input("ลูกค้าให้มา: "))

if paid < total:
    short = total - paid
    print(f"เงินไม่พอครับ ขาดอีก {short:,.2f} บาท")
elif paid == total:
    print("รับเงินพอดี ไม่มีทอน")
else:
    change = paid - total
    print(f"เงินทอน {change:,.2f} บาท")

ข้อ 3 (ท้าทาย) — ร้านมีโปรโมชั่นส่งฟรีเมื่อ "ซื้อครบ 500 บาท หรือ เป็นสมาชิก" แต่ถ้าอยู่ต่างจังหวัดต้องซื้อครบ 1,000 บาทถึงจะส่งฟรี เขียนโปรแกรมตัดสินใจให้

ดูเฉลยข้อ 3
total = float(input("ยอดซื้อ: "))
is_member = input("เป็นสมาชิกไหม (y/n): ").lower() == "y"
upcountry = input("อยู่ต่างจังหวัดไหม (y/n): ").lower() == "y"

if upcountry:
    limit = 1000
else:
    limit = 500

if total >= limit or is_member:
    print("ส่งฟรีครับ")
else:
    need = limit - total
    print(f"ค่าส่ง 50 บาท — ซื้อเพิ่มอีก {need:,.2f} บาท ส่งฟรีทันที")

เทคนิคสำคัญคือแยกการตัดสินใจเป็น 2 ขั้น — ขั้นแรกหาว่ายอดขั้นต่ำของลูกค้าคนนี้คือเท่าไหร่ ขั้นสองค่อยเช็คว่าถึงหรือยัง ถ้ายัดทุกอย่างไว้ใน if เดียวจะอ่านยากมากและแก้ทีหลังไม่ได้เลย

เช็คว่าคุณผ่าน EP นี้จริง

  • อธิบายความต่างของ = กับ == ได้
  • บอกได้ว่าทำไมลำดับของ elif ถึงสำคัญ และเรียงผิดแล้วเกิดอะไรขึ้น
  • เว้นวรรคหน้าบรรทัดถูกต้อง ไม่เจอ IndentationError อีกแล้ว
  • ระบบส่วนลดของคุณรันได้ และทดสอบด้วยยอด 500 / 1,200 / 3,500 / 8,000 แล้วผลถูกทุกกรณี

🎉

คุณจบช่วงที่ 1 แล้ว

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

EP หน้าเจออะไร

ปัญหาที่คุณน่าจะเริ่มรู้สึกแล้วคือ ถ้าลูกค้ามี 50 คน คุณต้องรันโปรแกรม 50 รอบ หรือถ้าบิลมี 20 รายการ ก็ต้องเขียนตัวแปร 20 ชุด — มันไปต่อไม่ไหวแน่นอน

EP5 เราจะเข้าสู่ช่วงที่ 2 ด้วยของสองอย่างที่จะเปลี่ยนวิธีเขียนโปรแกรมของคุณไปตลอดกาล คือ ลิสต์ (เก็บของหลายชิ้นในกล่องเดียว) และ ลูป (ทำซ้ำจนกว่าจะหมด) ปลายทางคือโปรแกรมสรุปยอดขาย 50 บิลที่ทำงานเสร็จใน 1 วินาทีครับ

ปรึกษาฟรี