Kahibaro
Discord Login Register

تاپل‌ها (Tuples)

آشنایی با تاپل‌ها در پایتون

تاپل (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)

چرا از تاپل استفاده می‌کنیم؟

چند دلیل مهم برای استفاده از تاپل:

  1. اطلاعات ثابت
    وقتی مطمئن هستیم داده‌ها نباید در طول برنامه تغییر کنند (مثل مختصات جغرافیایی، تاریخ تولد، تنظیمات ثابت).
  2. کلیدهای دیکشنری
    تاپل چون تغییرناپذیر است، می‌تواند به عنوان کلید در دیکشنری استفاده شود، اما لیست نمی‌تواند.
  3. سریع‌تر بودن در برخی موارد
    در پشت‌صحنه، کار با تاپل‌ها کمی کم‌هزینه‌تر از لیست‌هاست، چون قرار نیست تغییر کنند.
  4. درک بهتر معنایی کد
    وقتی از تاپل استفاده می‌کنیم، به خوانندهٔ کد می‌فهمانیم که این داده‌ها قرار نیست عوض شوند.

مثال: ذخیرهٔ موقعیت یک نقطه در صفحه به صورت $(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 = (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

در اینجا هر کلید یک تاپل از دو عدد (عرض و طول جغرافیایی) است.

چه زمانی تاپل، چه زمانی لیست؟

به طور خلاصه:

این تفاوت معنایی کمک می‌کند کدتان شفاف‌تر و کم‌اشتباه‌تر باشد.

Views: 8

Comments

Please login to add a comment.

Don't have an account? Register now!