… ฮึ่ม! งั้นลองไปดูวิธีที่ 3 กันครับ 3.
คุณเคยต้องเขียนโปรแกรมที่วนลูปบน list แล้วลบ "ของ (object)" ออกจาก list นั้นหรือไม่?
25, 333, 333, 1, 1234. 5] >>> print (333), (66. 25), ('x') 2 1 0 >>> (2, -1) >>> (333) >>> a [66. 25, 333, -1, 333, 1, 1234. 5, 333] 1 [66. 25, -1, 333, 1, 1234. 5, 333] >>> verse() [333, 1234. 5, 1, 333, -1, 66. 25] >>> () [-1, 1, 66. 25, 333, 333, 1234. 5] Method ของ Dictionary has_key(k) ตรวจสอบว่าใน dictionary มีคีย์ k หรือไม่ items() คืน list ของคู่ลำดับ ( key, value) ทั้งหมดใน dictionary ออกมา keys() คืน list ของค่าคีย์ทั้งหมดใน dictionary ออกมา values() คืน list ของค่า value ทั้งหมดใน dictionary ออกมา clear() ลบการจับคู่ทั้งหมดออกจาก dictionary >>> tel = { 'guido': 4127, 'jack': 4098, 'sape': 4139} >>> tel. keys () [ 'sape', 'jack', 'guido'] >>> tel. values () [ 4139, 4098, 4127] >>> tel. items () [( 'sape', 4139), ( 'jack', 4098), ( 'guido', 4127)] >>> tel. has_key ( 'guido') True >>> tel.
ไพทอนสนับสนุนการเขียนโปรแกรมเชิงวัตถุ (OOP) ในระัดับหนึ่ง object ค่าทุกค่าในไพทอนล้วนเป็น object ทั้งสิ้น นี่รวมไปถึงค่าที่เป็น primitive type อย่างค่าประเภท int, float, string, และ boolean นอกจากนี้ list, tuple, และ dictionary ก็เป็น object เช่นกัน การเรียก method ของ object ในภาษาไพทอนจะเหมือนกับการเรียก method ในภาษา Java โดยมีรูปแบบดังนี้ <
สาเหตุที่มานั่งเขียน blog นี้เพราะผมเขียนโปรแกรมไปแล้วก็เจอ bug… คือ "ของ" ใน list มันโดนลบออกไปไม่หมด (แต่ python ไม่ยอมเตือนเหมือน C# หง่ะ!! ) ก็เลยนั่งหา bug จนมาเจอ… เอาเป็นว่า เพื่อนๆ คนอื่นที่อ่านมาเจอบล็อกนี้แล้ว คงไม่พลาดแบบผมละกันครับ ปล2. เพิ่งรู้ว่าใช้ reversed() แล้วโค้ดสวยกว่าเดิมเยอะเลย ปกติเวลาต้องการวนลูปจากมากไปน้อย (9 ถึง 0) ก็เขียนโค้ดน่าเกลียดๆ แบบนี้ for i in range(9, -1, -1): print i พอเขียนบล็อกนี้แล้วเพิ่งรู้ว่าเขียนเป็น for i in reversed(range(0, 9)): สวยกว่าเยอะเลย 😀 ปล3. ใครอยากให้เขียนบล็อก แล้วยกตัวอย่างภาษาอื่นๆ นอกจาก Python และ C# ช่วยทิ้งคอมเม็นท์ไว้ด้วยครับ
ในเมื่อมันน่าจะ mod 3 ลงตัว… ในบล็อกนี้เราจะมาดูวิธีแก้ปัญหาที่มักจะเจอบ่อยๆ ปัญหานี้กันครับ ปัญหาที่เจอใน Python คือ เลขจำนวนเต็มที่หารสามลงตัว ไม่โดนลบออกไปทุกตัว สาเหตุคือ ในการวนลูปบน list python จะมีตัวชี้ index ของ list สร้างขึ้นมา และในการวนลูปแต่ละรอบ index จะต้องโดนขยับไป 1 เสมอ ดังนั้นเมื่อตัวเลขโดนลบไป ตัวเลขอื่นๆ ที่อยู่ต่อท้ายจะเลื่อนมาแทนที่ตัวที่หายไป แล้วตัวที่เลื่อนมาแทนที่เนี่ยแหละครับ จะโดนข้ามไป (ไม่โดนตรวจสอบ)…. ถ้างง ลองดูตัวอย่างต่อไปนี้ครับ A = 1 2 3 6 7 9 12 พิจารณา A[0] คือ 1 หารสาม ไม่ลงตัว พิจารณา A[1] คือ 2 หารสาม ไม่ลงตัว พิจารณา A[2] คือ 3 หารสามลงตัว ลบทิ้ง! A = 1 2 6 7 9 12 list A กลายเป็นแบบนี้ จะเห็นว่า 6 เลื่อนมาอยู่ที่ A[2] แต่ python ก็ยังเลื่อน index ไปหนึ่งช่อง ไปพิจารณา A[3] เลย ทำให้เลข 6 โดนข้ามไป … จะเห็นว่ามีกรณีแบบนี้เกิดขึ้นได้ใน python และคนเขียนโปรแกรมก็ไม่รู้ว่าเกิดปัญหาขึ้นเลย (นอกจากมาดูผลลัพธ์) ดังนั้นใน C# เขาจึงห้ามวนลูปแบบ foreach แล้วแก้ไขข้อมูลใน list (เกิด InvalidOperationException นั่นเอง) ในเมื่อ foreach ใช้ไม่ได้ ขอลักไก่ใช้ for ธรรมดาแทนได้มั้ย?
คำตอบคือ ไม่ได้ครับ ถ้าลองเขียนแล้วจะเจอปัญหาเหมือนกับที่เจอใน Python ครับ แล้วเราจะแก้ปัญหานี้ยังไงดีหละ? แบ่งได้เป็น 3 วิธีที่เจอบ่อยๆ ครับ 1. สร้าง List อีกอันมาเก็บเฉพาะผลลัพธ์ที่ต้องการ วิธีนี้ง่ายๆ ตรงๆ เลยครับ ในเมื่อมี list A แล้วเราต้องการเฉพาะเลขที่หารสามไม่ลงตัว แล้วใช้ list ใหม่เป็นคำตอบ เราก็เขียนโปรแกรมประมาณนี้ได้เลยครับ B = [] if x% 3 0: List B = new List(); if (x% 3! = 0) อ่าวๆๆแบบนี้ โปรแกรมก็ต้อง copy ตัวเลขทุกตัว ไปใส่ list B แทน ซึ่งมันต้องทำงานช้าแน่ๆ เลย สมมติว่าเราต้องการลบเลขแค่ตัวเดียวใน list A แต่ดันต้อง copy ตัวที่ต้องการเก็บไว้ไปใส่ใน list B ซึ่งเสียเวลาทำงานตั้งนาน (แต่! จะเร็วกว่าวิธีอื่นๆ ถ้ามีตัวเลขที่ต้องโดนลบเยอะๆ ครับ) งั้นไปดูวิธีที่สองดีกว่า 2. วนลูปในตัวก๊อบปี้ของ List วิธีนี้คือ สร้างตัวก๊อบปี้ของ List (เอาตัวเลขทุกตัว) มาเลยครับ เอามาใช้วนลูป แล้วเวลาลบข้อมูลก็ลบใน list ของจริง ผลลัพธ์ก็จะเก็บอยู่ใน list A ตามปกติ for x in A[:]: foreach(int x in new List(A)) if (x% 3 == 0) อธิบายเพิ่มเติม: A[:] คือการสร้างตัวก๊อบปี้ของ list A ครับ อธิบายเพิ่มเติม: new List(A) คือการสร้างตัวก๊อบปี้ของ list A ครับ หลายๆ คนคงจะเห็นว่า มันก็คล้ายๆ กับวิธีที่ 1 แหละน๊า… แค่สร้างตัวก๊อบปี้ไว้วนลูป ต้องเสียเวลาสร้างตัวก๊อบปี้เหมือนกันไม่ใช่เรอะ?
บอล วัน นี้, 2024 | Sitemap