Tutorial

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

By Arnon Puitrakul - 10 กันยายน 2021

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 ค่า และ ทำงานไปในบรรทัดเดียวกันเลยก็ได้

Read Next...

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

Obsidian เป็นโปรแกรมสำหรับการจด Note ที่เรียกว่า สารพัดประโยชน์มาก ๆ เราสามารถเอามาทำอะไรได้เยอะมาก ๆ หนึ่งในสิ่งที่เราเอามาทำคือ นำมาใช้เป็นระบบสำหรับการจัดการ Todo List ในแต่ละวันของเรา ทำอะไรบ้าง วันนี้เราจะมาเล่าให้อ่านกันว่า เราจัดการะบบอย่างไร...

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

อะ อะจ๊ะเอ๋ตัวเอง เป็นยังไงบ้างละ เมื่อหลายเดือนก่อน เราไปเล่าเรื่องกันขำ ๆ ว่า ๆ จริง ๆ แล้วพวก Loop ที่เราใช้เขียนโปรแกรมกันอยู่ มันไม่มีอยู่จริง สิ่งที่เราใช้งานกันมันพยายาม Abstract บางอย่างออกไป วันนี้เราจะมาถอดการทำงานของ Loop จริง ๆ กันว่า มันทำงานอย่างไรกันแน่ ผ่านภาษา Assembly...

Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana

Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana

นอกจากการทำให้ Application รันได้แล้ว อีกเรื่องที่สำคัญไม่แพ้กันคือการวางระบบ Monitoring ที่ดี วันนี้เราจะมาแนะนำวิธีการ Monitor การทำงานของ MySQL ผ่านการสร้าง Dashboard บน Grafana กัน...

เสริมความ"แข็งแกร่ง" ให้ SSH ด้วย fail2ban

เสริมความ"แข็งแกร่ง" ให้ SSH ด้วย fail2ban

จากตอนที่แล้ว เราเล่าในเรื่องของการ Harden Security ของ SSH Service ของเราด้วยการปรับการตั้งค่าบางอย่างเพื่อลด Attack Surface ที่อาจจะเกิดขึ้นได้ หากใครยังไม่ได้อ่านก็ย้อนกลับไปอ่านกันก่อนเด้อ วันนี้เรามาเล่าวิธีการที่มัน Advance มากขึ้น อย่างการใช้ fail2ban...