Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python Queue และ Deque: คู่มือฉบับสมบูรณ์แบบทีละขั้นตอน

Python queue เป็นไลบรารีในตัว (built-in library) ที่ช่วยให้คุณสร้างรายการที่ใช้กฎ FIFO (First In First Out) Python deque ใช้กฎตรงข้าม คือ LIFO queue (Last In First Out) ทั้งสองทำงานบน stacks และ queues


เมื่อคุณทำงานใน Python คุณอาจต้องการสร้างคิว (queue) ของรายการแทนที่จะเป็นลิสต์ ตัวอย่างเช่น สมมติคุณกำลังเขียนโปรแกรมที่ติดตามการลงทะเบียนงานประชุม เมื่อเราเพิ่มคนเข้าไปในรายการ คุณต้องการวางพวกเขาที่ท้ายคิว และคุณต้องการให้พวกเขาเคลื่อนที่ผ่านคิวเมื่อคนหน้าคิวเริ่มเข้าไป

มีไลบรารีในตัวใน Python ที่ออกแบบมาเพื่อช่วยคุณกับปัญหาแบบนี้: queues คิว (Queues) คล้ายกับ stacks ใน Python ความแตกต่างหลักคือกับคิว คุณลบรายการที่เพิ่มนานที่สุด ใน stack ฝ่ายตรงข้าม คุณลบรายการที่เพิ่มล่าสุด

ในบทช่วยสอนนี้ เราจะแยกวิเคราะห์พื้นฐานของคิวใน Python และวิธีที่คุณสามารถนำไปใช้ได้

Queue Primer

เป็นประโยชน์เมื่อทำงานกับ Python list คิวมีประโยชน์เมื่อคุณต้องการนำสิ่งต่างๆ ออกจากรายการในลำดับที่คุณใส่เข้าไป ในตัวอย่างก่อนหน้านี้ เมื่อคุณอยู่ในงานประชุม คุณควรถูกวางที่ท้ายคิวเมื่อคุณลงทะเบียนครั้งแรก แต่เมื่อคนในรายการเริ่มเข้าไป คุณควรเคลื่อนที่ไปข้างหน้าบนรายการ

คิวแตกต่างจากอาร์เรย์และลิสต์ในที่คิวไม่ใช่ random access—ข้อมูลที่จัดเก็บในคิวมีลำดับเฉพาะ ดังนั้น หากคุณต้องการเพิ่มรายการในคิว มันจะถูกเพิ่มที่ท้าย เรื่องนี้เรียกว่า first-in, first-out หรือ FIFO queue ย่อหน้า

ใน Python คุณสามารถใช้ลิสต์มาตรฐานเป็นคิวได้ อย่างไรก็ตาม ลิสต์อาจช้าค่อนข้างถ้าคุณกำลังแทรกและลบองค์ประกอบ เพราะการเปลี่ยนแปลงองค์ประกอบที่จุดเริ่มต้นของลิสต์ต้องย้ายองค์ประกอบอื่นๆ ในลิสต์ลงมา ดังนั้น หากคุณต้องการนำ first-in, last-out list ไปใช้ คุณควรใช้คิว

Python Queue

ดังนั้น คุณจะนำคิวไปใช้ใน Python อย่างไร? เพื่อทำเช่นนั้น เราต้องใช้ไลบรารีคิวในตัว โมดูลคิวรวมถึงคลาสที่มีประโยชน์หลายอย่างสำหรับคิว แต่สำหรับบทช่วยสอนนี้ เราจะเน้นที่คลาส queue.Queue

สมมติว่าเรากำลังสร้างโปรแกรมที่ติดตามคนที่อยากไปดูหนังเรื่องล่าสุดที่โรงหนังท้องถิ่น เราสามารถใช้คิวเพื่อติดตามรายชื่อรอ (waitlist) ของคนที่อยากดูหนัง

ขั้นแรก เราต้องกำหนดคลาสคิวของเรา เราสามารถทำได้โดยใช้โค้ดต่อไปนี้:

from queue import Queue waitlist = Queue()

ตอนนี้เราพร้อมที่จะสร้างคิวของเรา ฟังก์ชัน put() อนุญาตให้ข้อมูลถูก put เข้าไปในคิว ในโค้ดด้านล่าง เราจะเพิ่มคนห้าคนในรายชื่อรอที่เพิ่งลงทะเบียนดูหนัง:

waitlist.put('Erin') waitlist.put('Samantha') waitlist.put('Joe') waitlist.put('Martin') waitlist.put('Helena')

ตอนนี้เราเพิ่มชื่อห้าชื่อเข้าไปในคิว Erin อยู่หน้าสุดในคิวของเรา ตามด้วย Samantha และต่อไปจนถึง Helena ซึ่งอยู่ท้ายสุด เราสามารถสาธิตได้โดยใช้ฟังก์ชัน get() เช่นนี้:

print(waitlist.get())

โค้ดของเราคืนค่าดังนี้:

Erin

ตามที่เห็น Erin เป็นคนแรกในคิวของเรา หากเราต้องการพิมพ์ชื่อสองคนแรกในคิว เราจะใช้ฟังก์ชัน get() สองครั้ง:

print(waitlist.get()) print(waitlist.get())

โค้ดของเราคืนค่าดังนี้:

Erin Samantha

ตัวอย่าง Python Deque

แต่ถ้าคุณต้องการเพิ่มและลบรายการหลายรายการจากปลายใดปลายหนึ่งของคิวของคุณ? นี่คือที่ที่ฟังก์ชัน deque เข้ามามีบทบาท โดยใช้ deque เราสามารถสร้างคิวสองปลาย (double-ended queue) ที่เราสามารถเพิ่มและลบองค์ประกอบจากจุดเริ่มต้นหรือจุดสิ้นสุดของคิวได้ Deques เป็น last-in, first-out หรือ LIFO ย่อหน้า

มาใช้ตัวอย่างเดียวกับข้างต้น: จัดเก็บชื่อรายชื่อรอสำหรับหนัง ขั้นแรก เราจะประกาศฟังก์ชัน deque ของเรา:

from collections import deque waitlist = deque()

ตอนนี้เรา initialize deque ของเราแล้ว เราสามารถเพิ่มรายชื่อรอของเราเข้าไปใน deque:

waitlist.append('Erin') waitlist.append('Samantha') waitlist.append('Joe') waitlist.append('Martin') waitlist.append('Helena')

ตามที่เห็น เราใช้ฟังก์ชัน append() เพื่อใส่รายการเข้าไปในคิวของเรา เพื่อดูค่าที่จัดเก็บใน waitlist ของเรา เราสามารถใช้โค้ดต่อไปนี้:

print(waitlist)

โค้ดของเราคืนค่าดังนี้:

deque(['Erin', 'Samantha', 'Joe', 'Martin', 'Helena'])

ตามที่เห็น ข้อมูลของเราถูกจัดเก็บในลำดับที่เราแทรกเข้าไปใน deque ของเรา แต่ถ้าเราต้องการลบรายการแรกออกจากคิวของเรา? เราสามารถใช้ฟังก์ชัน popleft() เพื่อบรรลุเป้าหมายนี้ นี่คือตัวอย่าง:

waitlist.popleft() print(waitlist)

โค้ดของเราลบรายการแรกในรายการของเรา — Erin — และคืนค่าดังนี้:

deque(['Samantha', 'Joe', 'Martin', 'Helena'])

หากเราต้องการลบรายการทั้งหมดใน deque ของเรา เราสามารถใช้ฟังก์ชัน clear():

deque.clear() print(waitlist)

ผลลัพธ์ของโค้ดของเราคือดังนี้:

deque([])

ตามที่เห็น deque ของเราว่างเปล่า แต่ออบเจ็กต์ยังคงมีอยู่ 

สรุป

ในบทความนี้ เราพูดถึงว่าคิวเป็นประเภทของโครงสร้างข้อมูลที่ช่วยให้คุณใช้วิธีการจัดเก็บ first-in, first-out ในการจัดเก็บข้อมูล ตัวอย่างการใช้คิวคือการเก็บรายชื่อรอสำหรับผลิตภัณฑ์ใหม่

เรายังพูดถึงว่าคุณสามารถใช้ deque เพื่อสร้างคิวสองปลายที่คุณสามารถเพิ่มและลบองค์ประกอบจากคิวของคุณได้ ตอนนี้คุณพร้อมที่จะเริ่มเขียนคิวและ deque ของคุณเองแล้ว!

Python ถูกใช้ในสภาพแวดล้อมการเขียนโปรแกรมมืออาชีพหลากหลาย ดาวน์โหลด แอป Career Karma ฟรี วันนี้เพื่อเรียนรู้ว่า Python สามารถช่วยคุณเข้าสู่อาชีพฝันในเทคโนโลยีได้อย่างไร!