อันนี้ใช้บ่อยอยู่นะ ก๊อบมาลงละกัน ให้เนื้อหามันครบๆ
List Comprehensions คือ วิธีสร้าง list แบบกระชับ โดยใช้ไวยากรณ์ที่สั้นกว่า for loop
เอาแบบง่ายๆก่อนนะ ยกตัวอย่างเป็นตัวเลขก่อนละกัน
สร้าง list 1-10 ปกติก็แค่ range(1,11) แหละนะ แต่มันสำเร็จรูปไป
เอามาเขียนเป็น for ละกัน
ตัวอย่าง code
range_10 = []
for _ in range(1,11):
range_10.append(_)
ผมใช้ _ นะครับ เค้าบอกว่าตัวแปรแบบใช้แล้วทิ้ง ก็แนะนำให้ใช้ _ หรือใครสะดวกใช้ i ก็ได้ ไม่ติด
append เป็นคำสั่งที่ใช้กับตัวแปรประเภท list ใน python (ภาษาอื่นจะเรียก array) ใช้สำหรับเพิ่มค่าต่อท้ายเข้าไปใน list
พอมาเขียนเป็น List Comprehensions ก็จะเหลือแค่นี้
ตัวอย่าง code
range_10 = [_ for _ in range(1,11)]
ใช้ _ อาจมองไม่ชัด จัด i มาให้อีกอัน
range_10 = [i for i in range(1,11)]
จบแล้วบันทัดเดียว ให้มองแยกเป็น 2 อันนะครับ คือ
- ตัวสีน้ำเงิน ก็คือรูปแบบ for ปกติ
- ตัวสีแดง คือค่าที่จะถูกเพิ่มเข้าไปใน list เหมือนตอนที่ใช้คำสั่ง append
จากตัวอย่างนี้เหมือนจะไม่ค่อยมีประโยชน์เลยเนาะ ส่วนใหญ่ผมใช้ loop get ค่าออกมาจาก object หรือพวก query (ถ้าใครมีวิธีดีๆแนะนำผมได้นะ)
เราสามารถเพิ่ม if หรือ if else ไปใน list comprehensoin ได้ด้วยนะ เช่น
ตัวอย่าง code List Comprehensions + if
range_10 = [_ for _ in range(1,11) if _%2 == 0]
ก็จะเหมือนเอาเฉพาะเลขคู่มา
ตัวอย่าง code List Comprehensions + if else
a = ['1', '2', '3', 'a', 'b', 'c']
result = [int(_) if _.isdigit() else 0 for _ in a]
อันนี้ loop เช็กว่าค่าแต่ละอันเป็นจำนวนเต็มหรือเปล่า ถ้าใช่ให้แปลงเป็น int ถ้าไม่ใช่ ให้ fix เป็น 0
จริงๆมันก็คือ loop ธรรมดานี่แหละ แค่เขียนย่อให้มันสั้นลง ควรใช้กับ loop ง่ายๆแต่ยังจำเป็นต้อง Loop ถ้าซับซ้อนไปเขียนแบบเต็มดีกว่า อ่านง่ายแก้ง่ายกว่า เคยลองเลย ปวดหัวตอนกลับมาแก้
Dict Comprehensions อันนี้ก็แทบเหมือนกันเลย ต่างกันแค่ผลที่ได้จะเป็น dict กับวิธีเขียนนิดหน่อย
ถ้าเป็น list จะใช้ [ _ for _ in list_data ]
ถ้าเป็น dict จะเปลี่ยนเป็น {key:value for _ in list_data}
ซึ่งเราจะเอา _ ไปใส่แทน key หรือ value ก็ได้
ตัวอย่างที่ผมใช้งานจริงคือผมเขียนโปรแกรมไปอ่านค่า config จากอุปกรณ์ แล้วใช้ key เป็นชื่อ แล้วก็ value เป็นค่าที่ได้
ตัวอย่าง code
config = getconfig(ip='192.168.1.1', user='admin', passwd='password')
json_config = {_.name:_.value for _ in config}
ข้อดีของ dict คือเราใช้ชื่อเป็น key เลย ง่ายต่อการจำ และเข้าใจครับ แต่ก็ใช้ mem เยอะกว่านิดหน่อย ซึ่งข้อมูลผมไม่ได้เยอะขนาดนั้นเลยไม่ซีเรียส
ตัว Dict Comprehensions ก็ใช้ if else ได้เหมือนกับ ListComprehensions เลยนะ
สรุปนะครับ
ข้อดี สั้น ถ้าเราจำเป็นต้อง loop เพื่อสร้าง list หรือ dict ก็เหมาะเลย
แต่ไม่ควรใช้กับพวกที่เงื่อนไขเยอะๆหรือมี process ที่ซับซ้อน ไม่งั้นตอนกลับมาแก้ กุมขมับแน่นอน
ไม่มีความคิดเห็น:
แสดงความคิดเห็น