Table of Contents
آشنایی با تاپلها در پایتون
تاپل (Tuple) یکی از ساختارهای دادهٔ پایتون است که خیلی شبیه لیست است، اما یک تفاوت مهم دارد: تاپل «تغییرناپذیر» است؛ یعنی بعد از ساخته شدن، نمیتوانیم عنصر جدید به آن اضافه کنیم، چیزی را حذف کنیم یا مقدار عنصری را عوض کنیم.
در این بخش فقط روی چیزهایی تمرکز میکنیم که مخصوص تاپلهاست و آنها را از لیستها جدا میکند.
تعریف و ساختن تاپل
تاپل با استفاده از پرانتز () ساخته میشود و عناصر آن با کاما , از هم جدا میشوند:
t = (10, 20, 30)
print(t) # (10, 20, 30)
print(type(t)) # <class 'tuple'>تاپل میتواند انواع دادهٔ مختلف را با هم نگه دارد:
person = ("Ali", 25, 1.75, True)تاپل خالی
برای ساختن تاپل خالی:
empty = ()
print(empty) # ()
print(type(empty)) # <class 'tuple'>تاپل تکعضوی (یک عنصره)
نکتهٔ مهم: اگر فقط یک عنصر داخل پرانتز بگذاریم، هنوز تاپل نیست؛ برای تاپل تکعضوی باید از کاما استفاده کنیم:
a = (5)
print(type(a)) # <class 'int'>
b = (5,)
print(type(b)) # <class 'tuple'>پس کاما است که تاپل را مشخص میکند، نه فقط پرانتز.
دسترسی به عناصر تاپل
دسترسی به عناصر تاپل درست مثل لیست است، با استفاده از اندیس (index) و از ۰ شروع میشود:
t = ("a", "b", "c", "d")
print(t[0]) # "a"
print(t[2]) # "c"اندیس منفی هم کار میکند:
print(t[-1]) # "d"
print(t[-2]) # "c"برش (slicing) هم مثل لیستها پشتیبانی میشود:
print(t[1:3]) # ('b', 'c')
print(t[:2]) # ('a', 'b')
print(t[2:]) # ('c', 'd')تغییرناپذیری (Immutable) تاپلها
مهمترین ویژگی تاپل این است که نمیتوانیم بعد از ساختن، آن را تغییر دهیم.
این کارها خطا میدهد:
t = (1, 2, 3)
# تلاش برای تغییر مقدار
t[0] = 10 # خطا: TypeError
# تلاش برای افزودن
t.append(4) # خطا: AttributeError
# تلاش برای حذف
del t[1] # خطا: TypeErrorاگر بخواهیم «احساس کنیم» تاپل را تغییر دادهایم، در واقع باید تاپل جدید بسازیم:
t = (1, 2, 3)
# اضافه کردن یک عنصر با ساختن تاپل جدید
t = t + (4,)
print(t) # (1, 2, 3, 4)
# «حذف» یک عنصر با ساختن تاپل جدید از برشها
t2 = t[:2] + t[3:]
print(t2) # (1, 2)چرا از تاپل استفاده میکنیم؟
چند دلیل مهم برای استفاده از تاپل:
- اطلاعات ثابت
وقتی مطمئن هستیم دادهها نباید در طول برنامه تغییر کنند (مثل مختصات جغرافیایی، تاریخ تولد، تنظیمات ثابت). - کلیدهای دیکشنری
تاپل چون تغییرناپذیر است، میتواند به عنوان کلید در دیکشنری استفاده شود، اما لیست نمیتواند. - سریعتر بودن در برخی موارد
در پشتصحنه، کار با تاپلها کمی کمهزینهتر از لیستهاست، چون قرار نیست تغییر کنند. - درک بهتر معنایی کد
وقتی از تاپل استفاده میکنیم، به خوانندهٔ کد میفهمانیم که این دادهها قرار نیست عوض شوند.
مثال: ذخیرهٔ موقعیت یک نقطه در صفحه به صورت $(x, y)$:
point = (10, 20) # مختصات نقطه؛ قرار نیست تغییر کندپیمایش تاپل (حلقه روی عناصر)
مثل لیست میتوانیم با for روی عناصر تاپل حلقه بزنیم:
colors = ("red", "green", "blue")
for c in colors:
print(c)
میتوانیم همراه با range و اندیس هم پیمایش کنیم:
for i in range(len(colors)):
print(i, colors[i])عملگرها و توابع مفید برای تاپل
بسیاری از چیزهایی که روی لیستها کار میکند، روی تاپلها هم کار میکند (تا جایی که نیاز به تغییر نداشته باشد).
طول تاپل با `len()`
t = (1, 2, 3, 4)
print(len(t)) # 4وجود یک عنصر (`in` و `not in`)
t = ("apple", "banana", "cherry")
print("banana" in t) # True
print("orange" in t) # False
print("orange" not in t) # Trueشمارش و پیدا کردن موقعیت
t.count(x)→ چند بارxدر تاپل تکرار شدهt.index(x)→ اندیس اولین بار ظهورx
t = (1, 2, 2, 3, 2)
print(t.count(2)) # 3
print(t.index(3)) # 3اتصال و تکرار
مثل رشتهها و لیستها:
- اتصال با
+ - تکرار با
*
a = (1, 2)
b = (3, 4)
c = a + b
print(c) # (1, 2, 3, 4)
d = a * 3
print(d) # (1, 2, 1, 2, 1, 2)تاپلهای چندبعدی (تو در تو)
تاپل میتواند درون خودش تاپل یا ساختارهای دیگر داشته باشد. این برای نمایش دادههای جدولی یا نقطهها مفید است.
points = (
(0, 0),
(10, 5),
(3, 7),
)
print(points[1]) # (10, 5)
print(points[1][0]) # 10یا فهرست دانشآموزان به همراه سنشان:
students = (
("Ali", 20),
("Sara", 19),
("Reza", 22),
)
for name, age in students:
print(name, "=>", age)باز کردن تاپل (Tuple Unpacking)
یک ویژگی بسیار مفید تاپل این است که میتوانیم عناصرش را مستقیم در چند متغیر «باز» کنیم.
point = (10, 20)
x, y = point
print(x) # 10
print(y) # 20اگر تعداد متغیرها با تعداد عناصر تاپل برابر نباشد، خطا میگیریم:
t = (1, 2, 3)
a, b = t # خطا: ValueErrorتعویض مقادیر دو متغیر با تاپل
یکی از استفادههای معروف این ویژگی:
a = 10
b = 20
a, b = b, a
print(a, b) # 20 10تبدیل بین لیست و تاپل
گاهی لازم است بین این دو نوع ساختار جابهجا شویم:
لیست → تاپل
lst = [1, 2, 3]
t = tuple(lst)
print(t) # (1, 2, 3)
print(type(t)) # <class 'tuple'>تاپل → لیست
اگر لازم شد ساختار قابلتغییر داشته باشیم، میتوانیم تاپل را به لیست تبدیل کنیم، تغییرات را اعمال کنیم، و در صورت نیاز دوباره تاپل بسازیم:
t = (1, 2, 3)
lst = list(t)
lst.append(4)
print(lst) # [1, 2, 3, 4]
t2 = tuple(lst)
print(t2) # (1, 2, 3, 4)تاپل به عنوان کلید دیکشنری (ایدهٔ مقدماتی)
چون تاپل تغییرناپذیر است، میتوانیم از آن به عنوان کلید استفاده کنیم.
این برای نمایش دادههایی مثل مختصات دوبعدی یا سهبعدی بسیار کاربردی است.
locations = {
(35.6892, 51.3890): "Tehran",
(48.8566, 2.3522): "Paris",
}
print(locations[(35.6892, 51.3890)]) # Tehranدر اینجا هر کلید یک تاپل از دو عدد (عرض و طول جغرافیایی) است.
چه زمانی تاپل، چه زمانی لیست؟
به طور خلاصه:
- اگر میخواهید بتوانید داده را تغییر دهید → از لیست استفاده کنید.
- اگر نمیخواهید داده تغییر کند یا داده معنای ثابتی دارد (مثل
(سال، ماه, روز)،(x, y)،(نام, سن)) → از تاپل استفاده کنید. - اگر میخواهید از ساختار داده به عنوان کلید دیکشنری استفاده کنید → باید از تاپل (یا نوعهای تغییرناپذیر دیگر) استفاده کنید، نه لیست.
این تفاوت معنایی کمک میکند کدتان شفافتر و کماشتباهتر باشد.