Walrus Operator ของเล่นใหม่ใน Python 3.8 อิหยังว้าาาา

Photo by Jay Ruzesky on Unsplash

เรื่องนี้อยู่ ๆ ก็นึกขึ้นได้ว่าเมื่อ 1-2 ปีก่อน ตอนอ่าน Release Note ของ Python 3.8 อ่าน ๆ ไปแล้วมันต้องสะดุด Feature นึงเลย คือ Walrus Operator คือเขียนโปรแกรมมา ยังไม่เคยเจอเลย อยู่ ๆ มันก็มาอยู่ใน Python คือ งง ไปเลย อ่านครั้งแรกคือ อิหยังว้าาาาา แต่พอมาดูในรายละเอียดมันทำให้การเขียน Script ของเราสั้นลงเยอะมาก วันนี้เราลองมาดูกันว่า มันคืออะไร และใช้ยังไง

Walrus Operator

Walrus Operator เป็นเครื่องหมาย ที่ทำหน้าที่แพค 2 ในตัวเดียวกันเลย คือ การ Assign ค่า เหมือนกับเท่ากับปกติที่เราใช้งานกัน และ ยัง Return ค่าออกไปอีกด้วย อ่านแล้วอาจจะ งง ลองดูตัวอย่างนี้ดู

a = 10
print(a)

ในตัวอย่างนี้ เรา Assign ให้ a เป็น 10 โดยใช้เท่ากับ และ เราก็ใช้คำสั่ง print() เพื่อเอา a ออกมาแสดงผลที่หน้าจอ ซึ่งแน่นอนละว่ามันก็ควรจะต้องออก 10 อยู่แล้ว นั่นไม่ใช่ประเด็น

print(a := 10)

เมื่อเราใช้ Walrus Operator มันก็จะย่อลงเหลือแค่บรรทัดเดียวเลย อย่างที่เราบอกว่า Walrus Operator มันจะทำการ Assign ค่า ในที่นี้มันจะเอา 10 ใส่เข้าไปใน a ในขณะเดียวกัน มันจะปล่อยเลข 10 ออกมาด้วย ซึ่งมันก็จะอยู่ในคำสั่ง print() สุดท้าย ทำให้เราได้ a เป็น 10 และนำเลข 10 ออกมาทางหน้าจอ เหมือนกับเป็นการรวม 2 บรรทัดที่เราทำก่อนหน้านี้เข้าด้วยกัน

ตัวอย่าง

เราว่าตัวอย่างเจ๋ง ๆ ของการใช้ Walrus Operator คือ ส่วนที่อยู่ใน Loop ทั้งหลาย ในตัวอย่างนี้ เราจะทำการเปิดไฟล์ขึ้นมาเพื่ออ่านทีละบรรทัด วนไปเรื่อย ๆ จนกว่าจะหมดไฟล์

sample_file = open('sample.txt', 'r')

inputs = []
line = sample_file.readline()

while line != '' :
    inputs.append(line.rstrip())
    line = sample_file.readline()

sample_file.close()

Code ด้านบน เป็นการอ่านไฟล์ทั่ว ๆ ไปเลย เราก็สร้าง List สำหรับการเก็บสิ่งที่อ่านมาได้ และใช้ While Loop มีเงื่อนไขว่า ถ้าบรรทัดที่เราอ่านเข้ามา มันไม่ได้เป็น String ว่างนั่นหมายถึง เมื่อเราอ่านจนสุดไฟล์แล้ว แล้วเราอ่านต่อ Python มันจะให้ออกมาเป็น String ว่าง ดังนั้น เราก็เช็คผ่านเงื่อนไขพวกนี้ได้เลย ภายใน Loop เราก็จะให้มันเอาสิ่งที่อ่านได้ ยัดลงไปใน List ที่เราสร้างไว้ ก็เป็นอันเรียบร้อย เราจะเห็นได้เลยว่า มันต้องใช้หลายบรรทัดเหมือนกันนะ ในการทำอะไรแค่นี้

sample_file = open('sample.txt', 'r')

inputs = []

while (line := sample_file.readline()) != '' :
    input.append(line.rstrip())

sample_file.close()

ตัวนี้เราเปลี่ยนมาใช้ Walrus Operator เราจะเห็นได้เลยว่า Code มันหายไปเลย 2 บรรทัด และ อ่านแล้วน่าจะเข้าใจได้ง่ายขึ้นเยอะ จากเดิมที่ต้องมานั่งดูว่าอะไรนะ มันเป็น String ว่าง งง ไปหมด เราก็รวบมันมาอยู่บรรทัดเดียวไปเลยก็ทำให้เราอ่านได้ง่ายขึ้นเยอะมาก

ใน Document ของ Python เอง ก็มีตัวอย่างของตัว Python ที่ทำการเปลี่ยนมาใช้ Walrus Operator ด้วยเช่นกัน ลองไปดูได้ที่ Python Documentation

สรุป

Walrus Operator เป็นเครื่องหมายใหม่ที่มาพร้อมกับ Python 3.8 ดูตอนแรกมันจะอิหยังวะมาก ๆ แต่พอได้ใช้ ๆ ไป มันก็เป็นเครื่องหมายที่ทำให้เราเขียน Script สั้นลงมาก ๆ อย่างไม่น่าเชื่อเลย สิ่งที่มันทำ มันเป็นการรวบ 2 ขั้นตอนเข้าด้วยกันคือ การ Assign ค่าตามการเป็นเครื่องหมายเท่ากับตามปกติ และ การ Return ค่าออกมา เพื่อนำไปใช้ต่อ อาจจะนำไปยัดใน Function ต่าง ๆ เพื่อให้เราสามารถ Assign ค่า และ ทำงานไปในบรรทัดเดียวกันเลยก็ได้