🧮 Daily Python Problem: มาหาค่าเฉลี่ยกันเถอะ! 💖

วันนี้เรามาฝึกโจทย์ที่ใช้บ่อยมากๆ ในโลกของ Data กันค่ะ นั่นคือ Daily Python Problem: หาค่าเฉลี่ย (Calculate Average)!

โจทย์: ให้เราเขียนฟังก์ชันชื่อ calculate_average(numbers) ที่รับ List ของตัวเลขเข้ามา แล้ว return ค่าเฉลี่ยของตัวเลขทั้งหมดใน List นั้นๆ ค่ะ

⚠️ อย่าลืมจัดการ Edge Case น้า!

สิ่งที่สำคัญมากๆ คือ Edge Case หรือกรณีพิเศษค่ะ ถ้า Input เป็น List ว่างเปล่า [] แล้วเราพยายามหารด้วย 0 (จำนวนตัวเลข) โปรแกรมของเราจะ Error ทันที! 😱

• ข้อกำหนด: ถ้า List ว่าง ให้ return 0 (หรือจะ None ก็ได้แล้วแต่เรากำหนดค่ะ)

✨ มาดู 2 วิธีเด็ดๆ ในการเขียนกันค่ะ

1. แบบพื้นฐาน (เช็ค len ก่อน):

• เช็คก่อนว่า len(numbers) == 0 ไหม ถ้าใช่ก็ return 0

• ถ้าไม่ว่าง ก็ใช้ฟังก์ชัน sum() เพื่อหาผลรวม และ len() เพื่อหาจำนวน แล้วนำมาหารกันค่ะ

2. แบบ Pythonic (ใช้ if not numbers):

• วิธีนี้จะสั้นกว่าและเป็นที่นิยมใน Python เพราะ if not numbers: มีความหมายเหมือนกับการเช็คว่า if len(numbers) == 0: เลยค่ะ!

• ถ้า List ไม่ว่าง ก็คำนวณและ return ในบรรทัดเดียวเลย สั้นและสวยงามมาก!

ตัวอย่าง:

• Input: calculate_average([1, 2, 3, 4, 5])

• Output: 3.0

ลองเอาไปฝึกทำดูนะคะ การจัดการ Edge Case เป็นทักษะสำคัญที่นักพัฒนาที่ดีต้องมีเลยค่ะ! Keep going. 🥰

#data #python #ai #programmer #learnonlemon8

2025/11/11 แก้ไขแล้ว

... อ่านเพิ่มเติมนอกจาก “หาค่าเฉลี่ยใน List” แล้ว เวลาเจอคำถามแนว ๆ ในงาน Data มักจะต่อยอดไปที่ “หาค่าเฉลี่ยหลายคอลัมน์ในตาราง” เช่นใน pandas DataFrame (หลายคนค้นหากับชุดข้อมูล mtcars บ่อยมาก) เลยขอเสริมวิธีคิด/ตัวอย่างที่ฉันใช้จริงให้ค่ะ เผื่อเอาไปประยุกต์กับโจทย์ apply() ได้เลย 1) หาค่าเฉลี่ยทุกคอลัมน์ใน DataFrame แบบตรงที่สุด ถ้าต้องการค่าเฉลี่ย “รายคอลัมน์” (เหมือนเอา calculate_average ไปใช้กับแต่ละคอลัมน์) ทำได้ง่ายมาก: - df.mean(numeric_only=True) อันนี้จะได้ Series ของค่าเฉลี่ยแต่ละคอลัมน์ และเลี่ยงคอลัมน์ที่ไม่ใช่ตัวเลขให้อัตโนมัติ 2) ใช้ apply() เพื่อฝึกแนวคิด (เหมือนทำฟังก์ชันเอง) ถ้าโจทย์ระบุให้ใช้ apply() เช่น “หาค่าเฉลี่ยของทุกคอลัมน์ใน mtcars ต้องเขียน apply() ยังไง” ฉันจะทำประมาณนี้: - df.apply(lambda col: col.mean(), axis=0) axis=0 คือทำงานทีละคอลัมน์ ผลลัพธ์เหมือน df.mean() 3) จัดการ Edge case แบบเดียวกับ List ว่าง (สำคัญมาก) ใน DataFrame ก็มีเคสคล้าย ๆ “List ว่าง” เช่นคอลัมน์มีแต่ค่าว่าง (NaN) หรือกรองข้อมูลแล้วไม่เหลือแถวเลย - ถ้าเป็น NaN: โดยปกติ mean() จะข้าม NaN ให้ แต่ถ้าทั้งคอลัมน์เป็น NaN ผลจะเป็น NaN - ถ้าอยากให้ fallback เป็น 0 แบบโจทย์ calculate_average ให้ใช้: df.apply(lambda col: 0 if col.dropna().empty else col.mean(), axis=0) แนวคิดเดียวกับ if not numbers: คือเช็ค “ว่างจริงไหม” ก่อนหาร 4) ตัวอย่างการประยุกต์กับคอลัมน์ที่ไม่ใช่ตัวเลข บางทีในตารางมีคอลัมน์ชื่อรุ่น/ประเภทปนมา ถ้าใช้ apply ตรง ๆ อาจ error ได้ ฉันจะเลือกเฉพาะ numeric ก่อน: - num_df = df.select_dtypes(include="number") - num_df.apply(lambda col: col.mean(), axis=0) 5) “Problem list” เขียนยังไงให้ชัด (เผื่อทำโน้ต/โพสต์/การบ้าน) เวลาฉันทำโจทย์แนว Daily Python Problem จะเขียนเป็น problem list สั้น ๆ แบบนี้เพื่อกันหลุดประเด็น: - Input คืออะไร (List ตัวเลข / DataFrame) - Output ต้องเป็นอะไร (ค่าเฉลี่ย float) - Constraints/Edge case (ลิสต์ว่าง return 0, คอลัมน์ว่าง/NaN ทำยังไง) - วิธีแก้ (ใช้ sum() + len(), หรือ mean(), หรือ apply()) - ตัวอย่างทดสอบ (เช่น [1,2,3,4,5] -> 3.0, [10,20] -> 15.0) ถ้าทำ 2 สเต็ปนี้จนคล่อง (เช็คว่าง + คำนวณแบบสั้น) จะต่อยอดจาก List ไป DataFrame ได้ไวมาก และลดบั๊กเรื่องหารศูนย์/ข้อมูลหายได้เยอะจริง ๆ ค่ะ