📘 جزوه کامل تاپل‌ها (Tuples) در پایتون

آموزش جامع داده ساختار تغییرناپذیر پایتون: تعریف، روش‌های ایجاد، دسترسی، متدها، تفاوت با لیست، تاپل‌های تودرتو، کاربردها و نحوه ذخیره‌سازی در حافظه — به همراه مثال‌های عملی و تمرینات گوناگون

📑 فهرست مطالب

🔰 تاپل (Tuple) چیست؟

در پایتون، تاپل یک نوع دادهٔ مجموعه‌ای (sequence) است که مانند لیست عمل می‌کند اما با دو تفاوت بنیادین: تغییرناپذیری (Immutable) و سرعت بالاتر. به زبان ساده، تاپل را یک «لیست فقط خواندنی» در نظر بگیرید که پس از ساخته شدن، دیگر نمی‌توانید آن را تغییر دهید، حذف کنید یا عنصر جدیدی به آن اضافه کنید.

💡 چرا از تاپل استفاده کنیم؟ چون تغییرناپذیری باعث امنیت بیشتر در کدهای بزرگ می‌شود و همچنین پایتون می‌تواند بهینه‌تر از آن استفاده کند (حافظه کمتر و اجرای سریع‌تر).
🤔 سوال ذهنی: فرض کنید مختصات یک نقطه در نقشه (x, y) را می‌خواهید ذخیره کنید. چرا استفاده از تاپل به جای لیست منطقی‌تر است؟ چون مختصات نباید تغییر کند و استفاده از تاپل نشان می‌دهد که این داده ثابت است.

📦 روش‌های ایجاد تاپل

تاپل‌ها را به سه روش اصلی می‌سازیم: استفاده از پرانتز ()، تابع سازنده tuple() و عملگر تکرار *.

۱. استفاده از پرانتز ()

معمول‌ترین روش: عناصر را داخل پرانتز قرار داده و با کاما از هم جدا کنید.

🐍 ایجاد تاپل با پرانتز
a = (1, 2, 3, 4, 5)
b = ('apple', 'banana', 'cherry')
c = (1, 'hello', 3.14, True)
print(a)
print(b)
print(c)
⚠️ نکته تک عنصری: برای ایجاد تاپل با یک عنصر باید حتماً کاما بگذارید: single = (5,). در غیر این صورت (5) فقط یک عدد عادی است، نه تاپل!

۲. استفاده از سازنده tuple()

هر iterable (لیست، رشته، تاپل و ...) را می‌توان به تاپل تبدیل کرد.

🐍 ساخت تاپل از لیست و رشته
from_list = tuple([1, 2, 3, 'apple', 4.5])
from_string = tuple("GFG")
print(from_list)
print(from_string)

۳. عملگر تکرار *

برای ساختن تاپلی با عناصر تکراری از * استفاده کنید.

🐍 ایجاد تاپل تکراری
a = (2,) * 5
b = (0,) * 7
print(a)
print(b)

🎯 دسترسی به عناصر تاپل

دسترسی به عناصر تاپل از طریق اندیس‌گذاری (صفر-مبنا) و برش‌دهی (slicing) انجام می‌شود. اندیس منفی نیز از انتها قابل استفاده است.

🐍 دسترسی و برش
a = (10, 20, 30, 40, 50)
print(a[0])      # 10
print(a[-1])     # 50
print(a[1:4])    # (20, 30, 40)
print(a[:3])     # (10, 20, 30)
💡 برش‌دهی همیشه یک تاپل جدید برمی‌گرداند و تغییری در تاپل اصلی ایجاد نمی‌کند. این اصل تغییرناپذیری را نشان می‌دهد.

⚙️ متدهای تاپل (count و index)

تاپل‌ها فقط دو متد داخلی دارند: count() برای شمارش تعداد دفعات یک مقدار و index() برای یافتن اندیس اولین رخداد.

🐍 متدهای count و index
a = (10, 20, 30, 40, 50, 20, 30)
print('تعداد 20:', a.count(20))
print('اندیس 30:', a.index(30))
⚠️ اگر مقداری که با index() جستجو می‌کنید در تاپل نباشد، پایتون خطای ValueError می‌دهد. همیشه مطمئن شوید که مقدار موجود است یا از in استفاده کنید.

⚖️ تفاوت‌های اصلی تاپل و لیست

درک این تفاوت‌ها به شما کمک می‌کند تصمیم بگیرید کدام ساختار داده برای مسئله شما مناسب‌تر است.

ویژگیتاپل (Tuple)لیست (List)
تغییرپذیریتغییرناپذیر (Immutable)تغییرپذیر (Mutable)
نحو تعریف() یا فقط کاما[]
عملکرد و حافظهسریع‌تر، حافظه کمترکندتر، حافظه بیشتر
متدهای موجودcount() , index()بسیار زیاد (append, remove, sort و ...)
قابلیت کلید دیکشنری✅ دارد❌ ندارد
✨ خلاصه: اگر داده شما ثابت است و قرار نیست تغییری در آن ایجاد شود، از تاپل استفاده کنید. اگر نیاز به عملیات حذف، اضافه یا تغییر دارید، لیست گزینه مناسب‌تری است.

🏗️ تاپل‌های تودرتو (Nested Tuples)

درست مثل لیست‌ها، می‌توانید تاپل‌هایی بسازید که عناصر خودشان تاپل باشند. برای دسترسی به عناصر داخلی از اندیس‌گذاری پشت سر هم استفاده می‌کنیم.

🐍 تاپل تودرتو
nested = ((1,2,3), (4,5,6), (7,8,9))
print(nested[1][2])  # 6
print(nested[0])      # (1,2,3)
💡 تاپل‌های تودرتو برای ذخیره داده‌های سلسله‌مراتبی مثل ماتریس‌ها یا جداول کوچک ایده‌آل هستند.

💡 کاربردهای مهم تاپل در برنامه‌نویسی

🐍 باز کردن تاپل (Unpacking)
user_info = ('علی', 'رضایی', 28)
first_name, last_name, age = user_info
print(f'نام: {first_name}، نام خانوادگی: {last_name}، سن: {age}')

🧠 نحوه ذخیره‌سازی عناصر تاپل در حافظه

در پایتون، تاپل خود مقادیر را ذخیره نمی‌کند، بلکه مراجع (references) به اشیاء در حافظه را نگهداری می‌کند. یعنی هر عنصر یک آدرس از شیء اصلی است. این مسئله باعث می‌شود تاپل‌ها سبک باشند و همچنین اگر یک شیء mutable داخل تاپل باشد (مثلاً لیست)، خود لیست قابل تغییر است اما نمی‌توانید مرجع آن را عوض کنید.

🐍 نمایش مراجع
a = (10, 'GfG', [1,2])
print(a[2])      # [1,2]
a[2].append(3)    # تغییر داخل لیست مجاز است چون خود لیست mutable است
print(a)          # (10, 'GfG', [1,2,3]) — تاپل همچنان همان مراجع را دارد
⚠️ توجه: اگر شیء داخل تاپل mutable باشد (مثل لیست)، می‌توان محتوای آن را تغییر داد، اما نمی‌توان کل عنصر را با عنصر دیگری جایگزین کرد. تغییرناپذیری تاپل به معنی تغییرناپذیری مراجع است، نه خود اشیاء.

✍️ تمرینات عملی و پروژه کوچک

تمرین 1: کتابخانه دیجیتال
یک تاپل شامل ۵ عنوان کتاب (رشته) بسازید. سپس با استفاده از اندیس‌گذاری، سومین کتاب را چاپ کنید. سعی کنید با حلقه for همه کتاب‌ها را نمایش دهید.
🐾 راهنمایی
books = ('پایتون مقدماتی', 'الگوریتم‌ها', 'ساختار داده', 'داده کاوی', 'یادگیری ماشین')
print(books[2])
for book in books: print(book)
تمرین 2: تبدیل دما با تاپل
برنامه‌ای بنویسید که سه مقدار دما بر حسب سلسیوس را در یک تاپل ذخیره کند. سپس با استفاده از فرمول f = c * 9/5 + 32 هر کدام را به فارنهایت تبدیل کرده و در تاپل جدیدی ذخیره کنید. در نهایت هر دو تاپل را چاپ کنید.
🌡️ تبدیل دما
celsius = (0, 25, 100)
fahrenheit = tuple(c * 9/5 + 32 for c in celsius)
print('سلسیوس:', celsius)
print('فارنهایت:', fahrenheit)
تمرین 3: تشخیص نوع عناصر
یک تاپل با مقادیر (10, "پایتون", 3.14, True, (1,2)) بسازید و به کمک حلقه و type() نوع هر عنصر را چاپ کنید.
🐍 کشف نوع داده
mixed = (10, 'پایتون', 3.14, True, (1,2))
for item in mixed:
    print(f'{item} -> {type(item)}')

📌 خلاصه و جمع‌بندی

  • ✅ تاپل یک ساختار داده تغییرناپذیر، مرتب و اندیس‌پذیر است.
  • ✅ روش‌های ایجاد: () ، tuple() و عملگر *.
  • ✅ دسترسی: با [] و اندیس‌گذاری منفی و برش.
  • ✅ متدها: فقط count() و index().
  • ✅ تفاوت اصلی با لیست: تغییرناپذیری، سرعت بیشتر، قابلیت کلید دیکشنری بودن.
  • ✅ تاپل‌های تودرتو و Unpacking از ابزارهای قدرتمند پایتون هستند.
  • ✅ تاپل مراجع اشیاء را نگه می‌دارد، نه خود مقادیر را.
🎯 یادآوری: هرگاه داده‌ای دارید که نباید در طول برنامه تغییر کند (مثل روزهای هفته، ثابت‌های ریاضی، مختصات)، به سراغ تاپل بروید. این کار هم کد شما را خواناتر می‌کند و هم از خطاهای ناخواسته جلوگیری می‌نماید.
✅ کپی شد!