Tag Archives: python

วิทย์ม.ต้น: เขียนโปรแกรม Python หาด้านสามเหลี่ยมมุมฉากที่เป็นจำนวนเต็ม (เช่น 3-4-5), หัดใช้ range()

สัปดาห์ที่แล้วเด็กม. 2-3 ได้การบ้านไปให้พยายามหาเลขจำนวนเต็ม a, b, c ที่สามารถเป็นด้านของสามเหลี่ยมมุมฉากได้ และ a < b < c ซึ่งแปลว่า a2 + b2 = c2 โดยเราจะดูถึง c มีขนาดไม่เกิน 1,000

เด็กๆหลายคนก็พยายามทำและสำเร็จ วันนี้ผมจึงแสดงขบวนการที่ผมเขียนแต่ละขั้นตอนว่าผมทำอย่างไร ให้เห็นว่าผมเขียนทีละนิดและตรวจสอบว่าแต่ละขั้นตอนทำงานอย่างที่ผมคิดหรือเปล่า เพิ่มการทำงานไปทีละน้อยๆจนทำงานครบอย่างที่ต้องการ ไม่ใช่เขียนโปรแกรมไปทีละเยอะๆแล้วผลที่ได้ผิดแต่งงไม่รู้ว่าผิดตรงไหน เป็นตัวอย่างให้เด็กๆไปทดลองทำตามครับ

โค้ดม. 2-3 ของวันนี้อยู่ใน Jupyter Notebook อันนี้ครับ

จริงๆแล้วปัญหานี้เรียกว่า Pythagorean Triple และมีวิธีหาที่ดีกว่านี้ครับ แต่คณิตศาสตร์ที่เกี่ยวข้องซับซ้อนเกินความเข้าใจของเด็กๆ จึงใช้วิธีที่เด็กเข้าใจให้คอมพิวเตอร์ทำงานลองคำนวณและตรวจสอบให้ ส่วนวิธีที่ดีกว่านี้สามารถอ่านได้ที่ Pythagorean triple และ Tree of primitive Pythagorean triples นะครับ

สำหรับเด็กม. 1 ผมสอนให้รู้จักการทำงานซ้ำๆโดยใช้ for x in range(…) และให้รู้จักสร้างฟังก์ชั่นง่ายๆไปคำนวณสิ่งต่างๆในวิชาอื่นๆดูครับ แล้วให้ใช้ความรู้นี้คำนวณดูอัตราการเติบโตที่เปอร์เซ็นต์ต่างๆว่าต่างกันมากแค่ไหนครับ

โค้ดม. 1 ของวันนี้อยู่ใน Jupyter Notebook อันนี้ครับ

วิทย์ม.ต้น: แนะนำและทบทวน Python เทอมใหม่

วันนี้เราเรียน Python กันต่อครับ เด็กใหม่ที่ไม่เคยเรียนมาก่อนได้รู้วิธีไปโหลด Python มาจากเว็บ Anaconda และได้หัดเปิด Jupyter Notebook ที่ติดตั้งมาใน Anaconda แล้วใช้ Python เป็นเครื่องคิดเลข เด็กๆตื่นเต้นมากเมื่อใช้ math.gcd(a, b) เพื่อหาห.ร.ม.ของเลข a และ b

แนะนำลิงก์หัดใช้ Jupyter Notebook ครับ

เด็กๆหัดใช้ใช้ Python เป็นเครื่องคิดเลข

สำหรับเด็กที่เคยเรียนในปีที่แล้วผมสอนว่าของทุกอย่างมันจะยากครั้งแรกๆ ให้ฝึกหัดต่อเนื่องแล้วจะง่ายขึ้นเรื่อยๆและเราจะเก่งขึ้นเรื่อยๆ ความยากและอุปสรรคเป็นเรื่องปกติ ให้ฝึกวิชาไปเรื่อยๆ และได้แนะนำลิงก์ทบทวนดังนี้ครับ:

ลิงก์แนะนำภาษา Python เบื้องต้น เป็นภาษาไทย

เว็บ Real Python สำหรับหัวข้อน่าสนใจหลายๆอันที่ควรเข้าไปเรียนรู้ครับ

ผมลองเขียนโปรแกรมสดๆให้เด็กๆดูว่าขบวนการเขียนทีละนิดและตรวจสอบแต่ละขั้นเป็นอย่างไร เวลาจำอะไรไม่ได้ให้ค้นหาบนเว็บอย่างไร และให้ทบทวนการใช้ list และลองสร้างฟังก์ชั่นแปลงเลขฐานสิบเป็นเลขฐานสอง (ซึ่งจริงๆใน Python ก็คำนวณให้ได้อยู่แล้วแต่ทำเป็นแบบฝึกหัดเพื่อเรียนรู้ครับ)

การอ้างอิงบางส่วนของ list (เรียกว่า list slicing)

ใช้ join เพื่อต่อสมาชิกใน list มาเป็นก้อน string เดียวกัน
แปลงเลขฐานสิบเป็นฐานสองเป็นตัวอย่างการเขียนโปรแกรม จริงๆ Python มี bin(x) อยู่แล้ว

วิทย์ม.ต้น: รู้จัก Simulation (การจำลองสถานการณ์ด้วยคอมพิวเตอร์) เพื่อตอบคำถามที่สนใจ

วันนี้เด็กๆม.ต้นรู้จักการพยายามตอบคำถามที่น่าสนใจแต่หาคำตอบตรงๆไม่เป็น จึงพยายามหาคำตอบด้วย simulation หรือการจำลองสถานการณ์ด้วยคอมพิวเตอร์ครับ

สมมุติว่ามีคนสองคนชื่อ A และ B มาเล่นเกมกัน แต่ละคนจะเลือกหัว (H) หรือก้อย (T) เรียงกันสามตัว เช่น A อาจเลือกก้อยหัวหัว (THH) และ B อาจเลือกหัวหัวหัว (HHH) จากนั้นผู้เล่นก็โยนเหรียญไปเรื่อยๆจนแบบที่เหรียญออกสามครั้งสุดท้ายตรงกับแบบที่ A หรือ B เลือกไว้ ถ้าตรงกับคนไหนคนนั้นก็ชนะ เช่นถ้าโยนเหรียญไปเรื่อยๆแล้วออก HHTHTTTHH จะพบว่าในการโยนแปดครั้งแรกยังไม่ตรงกับ THH หรือ HHH สักที แต่พอโยนครั้งที่ 9 ออก H ทำให้สามครั้งสุดท้ายเป็น THH ซึ่งตรงกับ A เลือกไว้ ในกรณีนี้ A ก็ชนะ

คำถามคือในกรณีเหล่านี้ใครจะมีโอกาสชนะมากกว่ากัน เป็นอัตราส่วนเท่าไร

  1. A เลือก THH, B เลือก HHT
  2. A เลือก HTT, B เลือก HHT

จริงๆเกมนี้เรียกว่า Penney’s Game และสามารถคำนวณด้วยวิธีความน่าจะเป็นได้ แต่ถ้าเราไม่รู้ว่าจะคำนวณอย่างไร เราสามารถจำลองการเล่นเกมนี้หลายๆครั้งแล้วนับจำนวนครั้งที่แต่ละคนชนะก็ได้

หน้าตาฟังก์ชั่นโยนเหรียญไปเรื่อยๆจนมีคนชนะจะเป็นประมาณนี้ครับ:

เราสามารถทดลองเอาคู่แข่งขันมาแข่งซ้ำๆกันหลายๆครั้งเพื่อดูอัตราส่วนการแพ้ชนะได้แบบนี้ครับ:

เราสามารถจับคู่แข่งขันที่เป็นไปได้ทั้งหมดมาแข่งกันแล้วดูอัตราส่วนการแพ้ชนะแบบนี้ก็ได้ครับ:

สามารถดาวน์โหลด Jupyter Notebook ที่มีตัวอย่างโค้ดได้ที่นี่ หรือทดลองออนไลน์ได้ที่ลิงก์นี้ครับ