Tag Archives: ไพธอน

วิทย์ม.ต้น: เขียนโปรแกรม ไพธอนแปลงข้อความและเกมทายตัวเลข

ผมให้เด็กๆม.2-3 ไปพยายามเขียนโปรแกรมแปลงข้อความแบบในรูปนี้ครับ:

เด็กบางคนทำได้ บางคนยังติดอยู่ ผมจะเขียนทีละขั้นตอนให้เด็กๆดู ค่อยๆเพิ่มความสามารถโปรแกรมทีละนิดๆ และตรวจเช็คการทำงานแต่ละขั้นตอน เด็กๆได้เรียนรู้เรื่องสตริงที่ไม่สามารถเปลี่ยนแปลงได้ในไพธอน รู้จักการเก็บข้อมูลไว้ในลิสต์แล้วเปลี่ยนเป็นสตริงภายหลัง รู้จักใช้ดิกชันนารีในไพธอนเก็บข้อมูล รู้จัก .maketrans(…) และ .translate(…) ที่สตริงแต่ละตัวสามารถใช้ได้ ดู Jupyter Notebook ที่บันทึกการเรียนที่นี่นะครับ

หน้าตาจอตอนเรียนเป็นประมาณนี้ครับ:

วิธีที่นี้ใช้ if หลายๆอันตรงๆเลย
วิธีนี้ใช้ดิกชันนารีชื่อ translate เป็นตัวเก็บว่าอักษรอะไรเปลี่ยนเป็นอะไร ใช้ if i in translate ดูก่อนว่าตัวอักษรที่จะเปลี่ยนมีอยู่ใน translate
วิธีนี้ใช้ฟังก์ชั่นของสตริงในไพธอนชื่อ .maketrans และ .translate

สำหรับเด็กม.1 เด็กๆได้เรียนรู้เรื่องตัวแปร การเก็บข้อมูลจากผู้ใช้ด้วย input(…) การทำงานตามเงื่อนไขด้วย if … else การทำงานซ้ำๆด้วย for … in และ while(…) การสุ่มตัวเลขด้วย random.randint(…) แล้วหัดทำเกมทายตัวเลขกันครับ

เด็กๆเห็นว่าในการเดาเลขตั้งแต่ 1 ถึง 100 เราสามารถเดาไม่เกิน 7 ครั้งก็ถูกถ้าเราแบ่งครึ่งช่วงการเดาโดยเดาไปตรงกลางของช่วงที่เป็นไปได้ของตัวเลขเสมอ เพราะช่วงที่เป็นไปได้จะมีขนาดเล็กลงเรื่อยๆจาก 100, 50, 25, 13, 7, 4, 2, 1

ถ้าเดาตั้งแต่ 1 ถึง 1,000 ก็เดาไม่เกิน 7 ครั้งเพราะช่วงที่เป็นไปได้จะมีขนาดเล็กลง จาก 1000, 500, 250, 125, 63, 32, 16, 8, 4, 2, 1

ถ้าเดาตั้งแต่ 1 ถึง 2**n ก็เดาไม่เกิน n ครั้ง เพราะช่วงที่เป็นไปได้จะมีขนาดเล็กลงจาก 2**n, 2**(n-1), 2**(n-2), 2**(n-3), … , 8, 4, 2, 1

เมื่อลองคำนวณขนาด 2**i โดยให้ i เป็น 0 ถึง 30 จะเห็นว่า 2**10 มีค่าประมาณหนึ่งพัน 2**20 มีค่าประมาณ หนึ่งล้าน และ2**30 มีค่าประมาณ พันล้าน

ดู Jupyter Notebook ที่บันทึกการเรียนที่นี่นะครับ

หน้าตาจอตอนเรียนเป็นประมาณนี้ครับ:

เราสามารถทายตัวเลข 1 ในล้านตัวได้ภายใน 20 ครั้ง ถ้าเราแบ่งครึ่งช่วงที่ตัวเลขอยู่ข้างในให้เล็กลงครึ่งหนึ่งทุกครั้งที่ทาย

วิทย์ม.ต้น: เขียนโปรแกรม 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) อยู่แล้ว