[MITx: 6.00.1x] Introduction to Computer Science and Programming Using Python (Week 3)

หลังจากผ่าน Week 2 ไปแปบเดียว บทเรียนของ Week 3 มาแล้วครับ โดยใน 2 Week แรก เราได้รู้พื้นฐาน และโครงสร้างของโปรแกรมไปแล้ว ได้แก่พวก

  • Primitive Data Type (พวก int, float, boolean และ String เป็นต้น)
  • Condition :  if-else
  • I/O: input. print และ File
  • Function (def)

สำหรับใน Week นี้เป็นไปในส่วนของลักษณะโครงสร้าง จริงๆ มองให้บอกว่าเรามีตัวช่วย ในการแทนลักษณะของปัญหา มาลงโปรแกรมของเราอย่างไรมากกว่า ซึ่งถ้าดูในบทเรียน ใน Course นี้เรียก รวมๆ ว่า Stucture Type ได้แก่

  • Tuple () - ตระกร้า เอาอะไรมาใส่ก็ได้ ยัด int string จิปาถะอื่นๆลงมาได้ แต่ยัดแล้ว ห้ามแก้ไข
  • List [] - เก็บข้อมูล ที่สนใจลำดับ และเก็บข้อมูลชนิดเดียวกัน
    • สรุป String, Tuple, Listมามีอะไรที่มัน Common บ้างครับ
    • Functions as Objects - เราส่ง Function เข้าไปใน List ได้เลย แล้วให้ทำงาน โดยการเขียนแบบนี้ เรียกว่าเป็น higher order programming โดยในตัว Python มี 3 แบบ (จริงเค้าสอน map อันเดียว แต่ลอง Google ดูเห็นเป็นตัวที่นิยมใช้กัน เลยเอามาแปะไว้รวมกันครับ)ได้แก่
      • map - ให้ทำอะไรกับ แต่ละ Element ใน list
      • filter - กรองข้อมูลใน List ตาม Funtion ที่กำหนดเป็นเงื่อนไข
      • reduce - ทำอะไรบางอย่างับ List ให้มันเหลือค่าเดียว (Scalar)
  • Dictionary {} - เป็นตารางมี Key (ใช้ค้นหา) และ Value(เก็บข้อมูล) ใช้เก็บข้อมูลที่สัมพันธ์กัน เช่น ข้อมูลนักเรียน มีพวก ชื่อ นามสกุล ที่อยู่ เกรด เป็นต้น ถ้าแยกเป็น List งงตาย คราวนี้มาจัดกลุ่ม โดยเพื่อให้หาง่ายเรากำหนดตัวแทนขึ้นมา ในที่นี้ คือ รหัสประจำตัวครับ
    • ตัวอย่าง สำหรับในเรื่องนี้ ผมชอบนะ เอา Dictionary มาทดเก็บ เพื่อเก็บการหาค่า Fibonaci ที่มันซ้ำออกไป ลองดู Slide แล้ว จะพบปัญหาครับ
    • ลองเขียนเล่นดู ได้ Code  Python มา ดังนี้ ดูง่ายสบายตาดี (ตอนเรียนปี 1 เคยลองใช้ C ทำนะ แต่มืนๆงงๆ มาก บางที Stack Overflow 555)
      def fib_efficient(n, d):
          '''
          n = ลำดับของ fibonacci
          d = Dictionary ที่เอาไว้ใ้ช้ ทด ลดการ Call Function
          '''
          #Base Case
          if n in d:
              return d[n]
          #General Case
          else:
              ans = fib_efficient(n-1, d) + fib_efficient(n-2, d)
              d[n] = ans
              return ans
    • เปรีบเทียบ List กับ Dictionary ครับ

จาก Stucture Type เราเอามาใช้งานได้แล้ว แต่มีสิ่งที่ควรระวัง มันเรียกรวมๆว่า Side-Effect ได้แก่ Mutation, Aliasing, Cloning สำหรับ 3 ตัวนี้ เป็นสิ่งที่ต้องสนใจมากๆ ไม่ใช่เฉพาะภาษา Python อย่างเดียวนะครับ ทีนี้ลองมาดูที่ละตัวกัน ดีกว่าครับ

  • Aliasing - Object ชี้ไปที่ Memory จุดเดียวกัน ถ้ามีการแก้ไข ตัวอื่นจะได้รับผลกระทบด้วย (Mutation)
  • Mutation - กลายพันธุ์
  • Cloning - มัน Deep Copy หรือ Shallow Copy หละ ?

แต่เรียนมา มันยังขาดพวก Scope แบบ Global นะ สำหรับตัว Python เอาก็มีครับ ตัว GLOBAL VARIABLES เติมคำว่า Global เข้าไป ใช้งานได้ทุกที แต่ต้องระวังในการใช้งานครับ อย่างในกรณีนี้เป็นใช้มานับจำนวนการ Call ของ Recursive แต่ละแบบครับ

สำหรับใน Week นี้มี Problem Set ครับ แต่เหมือนทำทีละชิ้น Test ที่ละส่วนให้เรียบร้อยครับ แล้วค่อยนำมาประกอบร่างครับ โดยโจทย์ทีทำเป็นเกม Hangman ครับ ถ้ามองความซับซ้อนส่วนตัวมองว่าของ week ที่แล้วยากกว่าครับ แต่ใน Week นี้ ผมไม่ได้ใช้ตัว repl.it แล้ว มาใช้ตัว VS Code เป็น IDE ในการเขียนและทดสอบแทนครับ (จริง คือ ลองตัว Anaconda แล้วติดปัญหา 555)

ผ่านไปเร็วเหมือนกันนะครับสำหรับ Course เพราะสัปดาห์หน้าเข้าสู่ Mid-Term แล้วครับ 😀

 


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.