Shorthand

ในภาษาอื่น อาจพบ shorthand if-else เช่น condition ? true : false ; ส่วนใน Python เรามี

    True if condition else False

อย่าลืมว่าการย่อแบบนี้ ต้องมีส่วน else เสมอนะครับ


สำหรับ generator expressions (หรือที่มักเรียกกันว่า list comprehension เมื่อได้ผลลัพท์เป็น list) มีเทคนิคการกรองข้อมูล (filter) เช่นนี้

    [i for i in range(10) if i%2 == 0]
    # get: [0, 2, 4, 6, 8]

ส่วนการซ้อนชั้นของประโยค for ก็จะไล่ทำจากด้านหน้าไปด้านหลังเรื่อยๆ เช่นเดียวกับการวน for หลายชั้นครับ

    [i+j for i in 'abc' for j in 'xyz' if ord(j)-ord(i) != 23]
    # get: ['ay', 'az', 'bx', 'bz', 'cx', cy']

ข้อสังเกตคือ การ filter นี้มีแต่ if อย่างเดียวนะครับ ไม่มี else และถ้าเอาไปใช้รวมกับ shorthand if-else ก็ระวังว่าจะงงเองหละ

    [i if i%4 == 0 else -i for i in range(10) if i%2 == 0]
    # get: [0, -2, 4, -6, 8]

สำหรับการเขียน slice เราสามารถเล่นกับมันได้มากขึ้นอีกโดยการบอก step ครับ

    my_list = list(range(10))
    my_list = my_list[::2]
    # get: [0, 2, 4, 6, 8]

แต่ส่วนใหญ่ประโยชน์ของมันจะมาจากการกลับตำแหน่งของสมาชิกใน list มากกว่า คือ

    my_list = my_list[::-1]
    # get: [8, 6, 4, 2, 0]

นอกจากนี้ เรายังสามารถ unzip ตัวแปรในกรณีที่ไม่ต้องการระบุตัวแปรครบทุกตัวได้ด้วย

    first, *remain = my_list
    print(first)
    # get: 8
    print(remain)
    # get: [6, 4, 2, 0]

อย่างไรก็ดี แม้ว่าเทคนิคเหล่านี้จะทำให้ code ของเราดูสั้น (เพราะจำนวนบรรทัดที่ลดลง) แต่ก็ควรเลือกใช้ให้เหมาะสมด้วยนะครับ ไม่งั้นแล้วจะกลายเป็นว่า code ของเราจะอ่านยากและไร้ระเบียบไปแทน แถมบางเทคนิคก็อาจก่อนให้เกิดปัญหาด้าน performance อีกด้วยนะ

Nattawut Phetmak

Jack of all Trades

blog comments powered by Disqus