آموزش جامع داده ساختار تغییرناپذیر پایتون: تعریف، روشهای ایجاد، دسترسی، متدها، تفاوت با لیست، تاپلهای تودرتو، کاربردها و نحوه ذخیرهسازی در حافظه — به همراه مثالهای عملی و تمرینات گوناگون
در پایتون، تاپل یک نوع دادهٔ مجموعهای (sequence) است که مانند لیست عمل میکند اما با دو تفاوت بنیادین: تغییرناپذیری (Immutable) و سرعت بالاتر. به زبان ساده، تاپل را یک «لیست فقط خواندنی» در نظر بگیرید که پس از ساخته شدن، دیگر نمیتوانید آن را تغییر دهید، حذف کنید یا عنصر جدیدی به آن اضافه کنید.
تاپلها را به سه روش اصلی میسازیم: استفاده از پرانتز ()، تابع سازنده 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) فقط یک عدد عادی است، نه تاپل!
هر 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() برای یافتن اندیس اولین رخداد.
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 = ((1,2,3), (4,5,6), (7,8,9))
print(nested[1][2]) # 6
print(nested[0]) # (1,2,3)
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]) — تاپل همچنان همان مراجع را دارد
books = ('پایتون مقدماتی', 'الگوریتمها', 'ساختار داده', 'داده کاوی', 'یادگیری ماشین')
print(books[2])
for book in books: print(book)
f = c * 9/5 + 32 هر کدام را به فارنهایت تبدیل کرده و در تاپل جدیدی ذخیره کنید. در نهایت هر دو تاپل را چاپ کنید.
celsius = (0, 25, 100)
fahrenheit = tuple(c * 9/5 + 32 for c in celsius)
print('سلسیوس:', celsius)
print('فارنهایت:', fahrenheit)
(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().