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