2.8. ทูเพิล

ทูเพิล คือลำดับค่าที่ไม่เปลี่ยนแปลงและเรียงลำดับแล้ว เมื่อสร้างแล้ว รายการภายในไม่สามารถเพิ่ม ลบ หรือเปลี่ยนแปลงได้

2.8.1. การสร้างทูเพิล

ใช้วงเล็บ (หรือแค่จุลภาค) เพื่อสร้างทูเพิล:

empty   = ()
point   = (3, 4)
triple  = 1, 2, 3                # parentheses are optional
mixed   = (1, "two", 3.14)
nested  = ((1, 2), (3, 4))

2.8.1.1. ข้อผิดพลาดของการมีองค์ประกอบเดียว

วงเล็บรอบค่าเป็นเพียงวงเล็บ สิ่งที่สร้างทูเพิลจริงๆ คือ จุลภาค ทูเพิลที่มีองค์ประกอบเดียวต้องมีจุลภาคตามหลัง:

>>> (1)
1                                # just an int in parens
>>> (1,)
(1,)                             # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)

2.8.2. ความยาว การจัดทำดัชนี และการแบ่งส่วน

เหมือนกับรายการและสตริง ทั้ง len() การจัดทำดัชนี การแบ่งส่วน in และ + / * ทำงานในแบบเดียวกัน:

>>> point = (3, 4, 5)
>>> len(point)
3
>>> point[0]
3
>>> point[1:]
(4, 5)
>>> 4 in point
True
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)

2.8.3. ความไม่เปลี่ยนแปลง

ทูเพิลไม่มี append, pop, sort หรือเมธอด in-place อื่นใด การกำหนดค่าด้วยดัชนีจะเกิด TypeError:

>>> point = (3, 4)
>>> point[0] = 99
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment

หากต้องการ "แก้ไข" ทูเพิล ให้สร้างใหม่ด้วยค่าที่เปลี่ยนแปลงแล้ว

2.8.4. การแกะแพ็ก

ความสามารถพิเศษหลักของทูเพิลคือ การแกะแพ็ก ซึ่งกำหนดแต่ละรายการให้กับตัวแปรแยกกันในคำสั่งเดียว

A three-element tuple (1, 2, 3) unpacking into three named variables x, y, z.

การแกะแพ็กจะผูกแต่ละองค์ประกอบของทูเพิลกับตัวแปรที่ตั้งชื่อในการกำหนดค่าเดียว

>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4

ด้านขวาสามารถเป็น iterable ใดก็ได้ เช่น รายการ สตริง หรือค่าที่ฟังก์ชันส่งคืน:

>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')

* นำหน้าจะรวบรวม "ส่วนที่เหลือ" ของการแกะแพ็กเป็นรายการ:

>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]

2.8.5. การส่งคืนค่าหลายค่า

ฟังก์ชันสามารถส่งคืนทูเพิลเพื่อให้ค่าหลายค่าพร้อมกัน ผู้เรียกจะแกะแพ็กในขณะรับ:

def size_of(rect):
    return (rect[2] - rect[0], rect[3] - rect[1])

width, height = size_of((10, 20, 110, 140))
# width = 100, height = 120

วงเล็บใน return นั้นเป็นทางเลือก return a, b เพียงอย่างเดียวก็เป็นทูเพิลเช่นกัน

2.8.6. ทูเพิลกับรายการ

คู่มือปฏิบัติสำหรับการเลือก:

  • ทูเพิล สำหรับข้อมูลรูปทรงคงที่ที่มักต่างประเภทกัน เช่น จุด (x, y) สี (r, g, b) ค่าส่งคืนหลายค่า อาร์กิวเมนต์ฟังก์ชันที่แพ็กไว้ใช้ภายหลัง

  • รายการ สำหรับข้อมูลที่มีความยาวผันแปรและมักเป็นประเภทเดียวกัน เช่น รายการการวัด คิวของรายการที่จะประมวลผล อะไรก็ตามที่คุณคาดว่าจะต่อท้าย

ทูเพิลยังสามารถ แฮช ได้ (ตราบใดที่ทุกองค์ประกอบภายในสามารถแฮชได้) ดังนั้นจึงสามารถใช้เป็นคีย์ใน dict ได้