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...

จัดการข้อมูลบน Pandas ยังไงให้เร็ว 1000x ด้วย Vectorisation

จัดการข้อมูลบน Pandas ยังไงให้เร็ว 1000x ด้วย Vectorisation

เวลาเราทำงานกับข้อมูลอย่าง Pandas DataFrame หนึ่งในงานที่เราเขียนลงไปให้มันทำคือ การ Apply Function เข้าไป ถ้าข้อมูลมีขนาดเล็ก มันไม่มีปัญหาเท่าไหร่ แต่ถ้าข้อมูลของเราใหญ่ มันอีกเรื่องเลย ถ้าเราจะเขียนให้เร็วที่สุด เราจะทำได้โดยวิธีใดบ้าง วันนี้เรามาดูกัน...

ปั่นความเร็ว Python Script เกือบ 700 เท่าด้วย JIT บน Numba

ปั่นความเร็ว Python Script เกือบ 700 เท่าด้วย JIT บน Numba

Python เป็นภาษาที่เราใช้งานกันเยอะมาก ๆ เพราะความยืดหยุ่นของมัน แต่ปัญหาของมันก็เกิดจากข้อดีของมันนี่แหละ ทำให้เมื่อเราต้องการ Performance แต่ถ้าเราจะบอกว่า เราสามารถทำได้ดีทั้งคู่เลยละ จะเป็นยังไง เราขอแนะนำ Numba ที่ใช้งาน JIT บอกเลยว่า เร็วขึ้นแบบ 700 เท่าตอนที่ทดลองกันเลย...

Humanise the Number in Python with "Humanize"

Humanise the Number in Python with "Humanize"

หลายวันก่อน เราทำงานแล้วเราต้องการทำงานกับตัวเลขเพื่อให้มันอ่านได้ง่ายขึ้น จะมานั่งเขียนเองก็เสียเวลา เลยไปนั่งหา Library มาใช้ จนไปเจอ Humanize วันนี้เลยจะเอามาเล่าให้อ่านกันว่า มันทำอะไรได้ แล้วมันล่นเวลาการทำงานของเราได้ยังไง...

ทำไม 0.3 + 0.6 ถึงได้ 0.8999999 กับปัญหา Floating Point Approximation

ทำไม 0.3 + 0.6 ถึงได้ 0.8999999 กับปัญหา Floating Point Approximation

การทำงานกับตัวเลขทศนิยมบนคอมพิวเตอร์มันมีความลับซ่อนอยู่ เราอาจจะเคยเจอเคสที่ เอา 0.3 + 0.6 แล้วมันได้ 0.899 ซ้ำไปเรื่อย ๆ ไม่ได้ 0.9 เพราะคอมพิวเตอร์ไม่ได้มองระบบทศนิยมเหมือนกับคนนั่นเอง บางตัวมันไม่สามารถเก็บได้ เลยจำเป็นจะต้องประมาณเอา เราเลยเรียกว่า Floating Point Approximation...