تاپل در پایتون؛ ساخت، دسترسی و تفاوت Tuple با List

🗓 آخرین بهروزرسانی:
تاپل یکی از ساختارهای داده مهم پایتون برای نگهداری چند مقدار مرتب و غیرقابلتغییر است. تاپل از نظر دسترسی به عناصر و ترتیب دادهها شباهت زیادی به لیست دارد؛ اما پس از ساختهشدن نمیتوان عناصر آن را مستقیماً اضافه، حذف یا جایگزین کرد.
این مطلب، درس نخست از دوره رایگان پایتون سطح متوسط است. پیش از شروع بهتر است با لیستها در پایتون آشنا باشید؛ زیرا در این درس تفاوتهای tuple و list را بهصورت دقیق بررسی میکنیم.
تاپل در پایتون چیست؟
تاپل یا tuple مجموعهای مرتب از مقدارهاست. عناصر تاپل معمولاً داخل پرانتز نوشته میشوند و با ویرگول از یکدیگر جدا میشوند:
colors = ("قرمز", "سبز", "آبی")
print(colors)خروجی:
('قرمز', 'سبز', 'آبی')هر عنصر تاپل یک جایگاه مشخص دارد و مانند لیست میتوان با اندیس به آن دسترسی پیدا کرد. تفاوت اصلی این است که تاپل غیرقابلتغییر یا immutable است.
ویژگیهای اصلی Tuple
- مرتب است: ترتیب عناصر حفظ میشود.
- اندیسپذیر است: میتوان با شماره جایگاه به عناصر دسترسی داشت.
- مقدار تکراری میپذیرد: یک مقدار میتواند چند بار در تاپل وجود داشته باشد.
- میتواند انواع داده مختلف داشته باشد: متن، عدد، مقدار بولی و حتی لیست یا تاپل دیگر.
- غیرقابلتغییر است: پس از ساخت، نمیتوان عناصر آن را مستقیماً جایگزین، اضافه یا حذف کرد.
user_data = ("مهران", 30, 18.5, True)
print(user_data)ساخت تاپل در پایتون
سادهترین روش ساخت تاپل استفاده از پرانتز و ویرگول است:
numbers = (10, 20, 30, 40)
names = ("علی", "سارا", "رضا")
prices = (49.9, 120.0, 85.5)ساخت تاپل بدون پرانتز
در پایتون، عامل اصلی ساخت تاپل ویرگول است و پرانتز بیشتر برای خوانایی استفاده میشود:
coordinates = 35.7, 51.4
print(coordinates)
print(type(coordinates))خروجی:
(35.7, 51.4)
<class 'tuple'>با وجود امکان حذف پرانتز، در بسیاری از موقعیتها استفاده از پرانتز خوانایی کد را افزایش میدهد.
ساخت تاپل خالی
برای ساخت تاپل خالی میتوان از پرانتز خالی یا تابع tuple() استفاده کرد:
empty_tuple = ()
another_empty_tuple = tuple()
print(empty_tuple)
print(type(empty_tuple))تاپل یکعنصری و اهمیت ویرگول
یکی از مهمترین نکتهها این است که برای ساخت تاپل تکعنصری باید پس از مقدار، ویرگول قرار دهیم:
single_item = (10,)
print(single_item)
print(type(single_item))خروجی:
(10,)
<class 'tuple'>اگر ویرگول را حذف کنیم، پایتون پرانتز را فقط برای گروهبندی عبارت در نظر میگیرد:
not_a_tuple = (10)
print(type(not_a_tuple))خروجی:
<class 'int'>پس برای تاپل یکعنصری، وجود , ضروری است.
ساخت تاپل با تابع tuple
تابع tuple() میتواند یک داده قابل پیمایش را به تاپل تبدیل کند:
letters = tuple("Python")
print(letters)خروجی:
('P', 'y', 't', 'h', 'o', 'n')تبدیل لیست به تاپل:
numbers_list = [10, 20, 30]
numbers_tuple = tuple(numbers_list)
print(numbers_tuple)تشخیص نوع تاپل با type
cities = ("استانبول", "تهران", "دبی")
print(type(cities))خروجی:
<class 'tuple'>دسترسی به عناصر تاپل با اندیس
اندیسگذاری در تاپل مانند لیست از صفر آغاز میشود:
cities = ("استانبول", "تهران", "دبی")
print(cities[0])
print(cities[1])
print(cities[2])خروجی:
استانبول
تهران
دبیاندیس منفی
با اندیس منفی میتوان از انتهای تاپل به عناصر دسترسی داشت:
cities = ("استانبول", "تهران", "دبی")
print(cities[-1])
print(cities[-2])خروجی:
دبی
تهرانخطای IndexError در تاپل
اگر اندیسی خارج از محدوده درخواست شود، پایتون خطای IndexError ایجاد میکند:
numbers = (10, 20, 30)
print(numbers[5])IndexError: tuple index out of rangeاین تاپل سه عنصر دارد و فقط اندیسهای صفر، یک و دو معتبر هستند.
تعداد عناصر تاپل با len
languages = ("Python", "JavaScript", "PHP")
print(len(languages))خروجی:
3برش تاپل با slicing
برای دریافت بخشی از تاپل میتوان از برش استفاده کرد:
numbers = (10, 20, 30, 40, 50, 60)
print(numbers[1:4])
print(numbers[:3])
print(numbers[3:])خروجی:
(20, 30, 40)
(10, 20, 30)
(40, 50, 60)برش یک تاپل جدید میسازد و تاپل اصلی را تغییر نمیدهد.
برش با گام
numbers = (0, 1, 2, 3, 4, 5, 6)
print(numbers[::2])خروجی:
(0, 2, 4, 6)معکوسکردن تاپل
numbers = (1, 2, 3, 4, 5)
print(numbers[::-1])خروجی:
(5, 4, 3, 2, 1)چرا نمیتوان عناصر تاپل را تغییر داد؟
تاپل غیرقابلتغییر است. کد زیر تلاش میکند عنصر دوم را جایگزین کند:
colors = ("قرمز", "سبز", "آبی")
colors[1] = "زرد"پایتون خطای زیر را ایجاد میکند:
TypeError: 'tuple' object does not support item assignmentاین ویژگی زمانی مفید است که بخواهیم داده پس از تعریف بهطور ناخواسته تغییر نکند؛ برای مثال مختصات یک نقطه، تنظیمات ثابت یا روزهای هفته.
روش تغییر غیرمستقیم یک تاپل
برای تغییر دادههای تاپل باید آن را به لیست تبدیل کنیم، تغییر را انجام دهیم و دوباره به تاپل برگردانیم:
colors = ("قرمز", "سبز", "آبی")
colors_list = list(colors)
colors_list[1] = "زرد"
colors = tuple(colors_list)
print(colors)خروجی:
('قرمز', 'زرد', 'آبی')این روش در واقع تاپل قبلی را تغییر نمیدهد؛ بلکه یک تاپل جدید میسازد و متغیر colors را به آن متصل میکند.
افزودن عناصر به تاپل
تاپل متد append() یا extend() ندارد. برای افزودن مقدار میتوان دو تاپل را با هم ترکیب کرد:
numbers = (1, 2, 3)
numbers = numbers + (4,)
print(numbers)خروجی:
(1, 2, 3, 4)در این مثال نیز تاپل اصلی تغییر نکرده است؛ یک تاپل جدید ساخته شده است.
حذف عناصر از تاپل
نمیتوان یک عنصر مشخص را مستقیماً با remove() یا pop() حذف کرد. برای حذف یک عنصر باید ابتدا تاپل را به لیست تبدیل کنیم:
numbers = (10, 20, 30)
numbers_list = list(numbers)
numbers_list.remove(20)
numbers = tuple(numbers_list)
print(numbers)اما میتوان کل متغیر تاپل را با del حذف کرد:
numbers = (10, 20, 30)
del numbersبررسی وجود عنصر با in و not in
roles = ("admin", "editor", "customer")
print("admin" in roles)
print("guest" not in roles)خروجی:
True
Trueاین قابلیت برای اعتبارسنجی گزینهها یا بررسی عضویت یک مقدار کاربرد دارد.
پیمایش تاپل با حلقه for
products = ("کتاب", "دفتر", "مداد")
for product in products:
print(product)پیمایش همراه با شماره عناصر
products = ("کتاب", "دفتر", "مداد")
for index, product in enumerate(products, start=1):
print(index, product)خروجی:
1 کتاب
2 دفتر
3 مدادمتدهای count و index در تاپل
تاپل فقط دو متد عمومی اصلی برای بررسی عناصر دارد.
شمارش مقدار با count
scores = (18, 20, 17, 20, 15, 20)
print(scores.count(20))خروجی:
3پیداکردن جایگاه با index
cities = ("تهران", "شیراز", "تبریز")
print(cities.index("شیراز"))خروجی:
1اگر مقدار موردنظر وجود نداشته باشد، index() خطای ValueError ایجاد میکند. بهتر است ابتدا با in وجود مقدار را بررسی کنیم:
city = "اصفهان"
if city in cities:
print(cities.index(city))
else:
print("شهر موردنظر در تاپل وجود ندارد.")ترکیب و تکرار تاپلها
ترکیب با عملگر +
first = (1, 2, 3)
second = (4, 5, 6)
combined = first + second
print(combined)خروجی:
(1, 2, 3, 4, 5, 6)تکرار با عملگر *
pattern = (0, 1)
print(pattern * 3)خروجی:
(0, 1, 0, 1, 0, 1)بستهبندی مقادیر در تاپل
قرارگرفتن چند مقدار در یک متغیر بهصورت خودکار یک تاپل میسازد. به این فرایند tuple packing گفته میشود:
user = "مهران", 30, "استانبول"
print(user)خروجی:
('مهران', 30, 'استانبول')بازکردن تاپل یا Tuple Unpacking
میتوان عناصر تاپل را همزمان داخل چند متغیر قرار داد:
user = ("مهران", 30, "استانبول")
name, age, city = user
print(name)
print(age)
print(city)تعداد متغیرهای سمت چپ باید با تعداد عناصر تاپل برابر باشد. در غیر این صورت خطای ValueError ایجاد میشود.
بازکردن با ستاره
با استفاده از * میتوان چند مقدار میانی را داخل یک لیست قرار داد:
numbers = (10, 20, 30, 40, 50)
first, *middle, last = numbers
print(first)
print(middle)
print(last)خروجی:
10
[20, 30, 40]
50دقت کنید که متغیر ستارهدار یک لیست دریافت میکند، نه تاپل.
جابهجایی مقدار دو متغیر با تاپل
پایتون با استفاده از بستهبندی و بازکردن تاپل امکان جابهجایی ساده دو مقدار را فراهم میکند:
first = 10
second = 20
first, second = second, first
print(first)
print(second)خروجی:
20
10برگرداندن چند مقدار از تابع
وقتی یک تابع چند مقدار را با ویرگول برمیگرداند، نتیجه در واقع یک تاپل است:
def calculate(number1, number2):
total = number1 + number2
difference = number1 - number2
return total, difference
result = calculate(10, 4)
print(result)
print(type(result))خروجی:
(14, 6)
<class 'tuple'>میتوان نتیجه را مستقیم باز کرد:
total, difference = calculate(10, 4)
print(total)
print(difference)تاپلهای تو در تو
یک تاپل میتواند شامل تاپلهای دیگر باشد:
students = (
("علی", 18),
("سارا", 20),
("رضا", 17)
)
print(students[0])
print(students[0][0])
print(students[0][1])خروجی:
('علی', 18)
علی
18پیمایش تاپل تو در تو
for name, score in students:
print(f"{name}: {score}")آیا همه دادههای داخل تاپل غیرقابلتغییر هستند؟
خود تاپل قابلتغییر نیست؛ اما اگر یکی از عناصر آن یک شیء قابلتغییر مانند لیست باشد، محتوای آن لیست قابل تغییر خواهد بود:
data = ("کاربر", [10, 20, 30])
data[1].append(40)
print(data)خروجی:
('کاربر', [10, 20, 30, 40])در این مثال جایگاه عنصر دوم تغییر نکرده است؛ همان لیست قبلی همچنان داخل تاپل قرار دارد، اما محتوای خود لیست تغییر کرده است.
استفاده از تاپل بهعنوان کلید دیکشنری
تاپلهایی که تمام عناصرشان قابل هشکردن باشند، میتوانند بهعنوان کلید دیکشنری استفاده شوند. این قابلیت برای مختصات یا شناسههای چندبخشی کاربرد دارد:
locations = {
(35.7, 51.4): "تهران",
(41.0, 29.0): "استانبول"
}
print(locations[(41.0, 29.0)])اما اگر تاپل شامل یک لیست باشد، نمیتوان از آن بهعنوان کلید دیکشنری استفاده کرد؛ زیرا لیست قابلتغییر و غیرقابل هشکردن است.
مقایسه تاپلها
پایتون عناصر تاپلها را از چپ به راست مقایسه میکند:
print((1, 2, 3) == (1, 2, 3))
print((1, 2, 3) < (1, 3, 0))خروجی:
True
Trueدر مقایسه دوم، عنصر اول برابر است؛ سپس عدد ۲ با عدد ۳ مقایسه میشود و نتیجه مشخص میشود.
تفاوت Tuple و List در پایتون
| ویژگی | List | Tuple |
|---|---|---|
| نشانه اصلی | [] | () و ویرگول |
| قابلتغییر بودن | بله | خیر |
| افزودن و حذف عنصر | با متدهایی مانند append و remove | مستقیم امکانپذیر نیست |
| اندیس و برش | پشتیبانی میشود | پشتیبانی میشود |
| مقدار تکراری | مجاز است | مجاز است |
| مصرف حافظه | معمولاً بیشتر | معمولاً کمتر |
| کاربرد اصلی | دادههایی که تغییر میکنند | دادههای ثابت و ساختاریافته |
| استفاده بهعنوان کلید دیکشنری | خیر | در صورت قابل هش بودن عناصر، بله |
چه زمانی از تاپل استفاده کنیم؟
تاپل انتخاب مناسبی است وقتی:
- مقدارها پس از تعریف نباید تغییر کنند.
- میخواهید یک رکورد کوچک و ثابت مانند مختصات یا رنگ RGB بسازید.
- یک تابع باید چند مقدار را برگرداند.
- به یک کلید چندبخشی برای دیکشنری نیاز دارید.
- میخواهید هدف ثابتبودن داده را برای خواننده کد روشن کنید.
rgb_color = (255, 120, 40)
point = (35.7, 51.4)
week_days = ("شنبه", "یکشنبه", "دوشنبه", "سهشنبه", "چهارشنبه", "پنجشنبه", "جمعه")چه زمانی لیست انتخاب بهتری است؟
لیست زمانی مناسبتر است که:
- تعداد عناصر در طول اجرای برنامه تغییر میکند.
- باید داده جدید اضافه یا دادهای حذف شود.
- قرار است عناصر مرتب، ویرایش یا جایگزین شوند.
- با یک فهرست پویا مانند سبد خرید یا کارهای روزانه سروکار دارید.
اشتباهات رایج هنگام کار با تاپل
۱. فراموشکردن ویرگول در تاپل تکعنصری
item = (10) # عدد صحیح
item = (10,) # تاپل تکعنصری۲. تلاش برای تغییر مستقیم عنصر
numbers = (1, 2, 3)
numbers[0] = 10 # TypeError۳. بازکردن تاپل با تعداد متغیر نامناسب
user = ("علی", 25, "تهران")
name, age = user # ValueError۴. استفاده از index برای مقدار ناموجود
colors = ("قرمز", "سبز")
print(colors.index("آبی")) # ValueError۵. تصور اینکه پرانتز عامل اصلی ساخت تاپل است
عامل اصلی تاپلسازی ویرگول است. عبارت (10) تاپل نیست، اما 10, یک تاپل تکعنصری است.
پروژه عملی: ثبت اطلاعات ثابت محصول
در این پروژه اطلاعات هر محصول را داخل یک تاپل نگهداری و سپس گزارش آن را نمایش میدهیم:
product = (
"کتاب آموزش پایتون",
"BK-102",
249000,
True
)
name, code, price, is_available = product
print("مشخصات محصول")
print("-" * 30)
print("نام:", name)
print("کد:", code)
print("قیمت:", price)
if is_available:
print("وضعیت: موجود")
else:
print("وضعیت: ناموجود")در این مثال، تاپل برای یک رکورد ثابت مناسب است. اگر قرار باشد قیمت یا وضعیت محصول مرتب تغییر کند، استفاده از دیکشنری یا کلاس در پروژههای بزرگتر انتخاب مناسبتری خواهد بود.
پروژه دوم: گزارش مختصات مسیر
route = (
(35.70, 51.40),
(35.72, 51.42),
(35.75, 51.45)
)
for index, point in enumerate(route, start=1):
latitude, longitude = point
print(f"نقطه {index}: عرض {latitude}، طول {longitude}")هر مختصات یک تاپل دوعنصری است و کل مسیر نیز داخل یک تاپل بزرگتر نگهداری میشود.
تمرینهای عملی
- تاپلی شامل نام پنج زبان برنامهنویسی بسازید و عنصر اول و آخر را نمایش دهید.
- یک تاپل تکعنصری بسازید و نوع آن را با
type()بررسی کنید. - عددهای زوج یک تاپل را با حلقه
forنمایش دهید. - تعداد تکرار عدد ۱۰ را در یک تاپل با
count()محاسبه کنید. - یک تاپل شامل نام، سن و شهر بسازید و با unpacking آن را داخل سه متغیر قرار دهید.
- اولین و آخرین عنصر یک تاپل را جدا و عناصر میانی را با متغیر ستارهدار دریافت کنید.
- یک لیست را به تاپل تبدیل کنید، یک تغییر غیرمستقیم انجام دهید و دوباره آن را به تاپل برگردانید.
- تاپلی از سه مختصات بسازید و هر نقطه را در یک خط نمایش دهید.
- دو تاپل عددی را ترکیب و نتیجه را معکوس کنید.
- تابعی بنویسید که کمترین، بیشترین و میانگین سه عدد را بهصورت تاپل برگرداند.
📌 همچنین بخوانید: بازار کار پایتون در ایران، دستورهای break، continue و pass در پایتون و ساخت ربات تلگرام با پایتون
پرسشهای متداول
آیا تاپل سریعتر از لیست است؟
در بسیاری از عملیات ساده، تاپل به دلیل ساختار ثابت خود میتواند کمی سبکتر و سریعتر باشد؛ اما تفاوت عملکرد معمولاً نباید تنها دلیل انتخاب باشد. مهمتر این است که داده ثابت است یا باید تغییر کند.
آیا تاپل میتواند مقدار تکراری داشته باشد؟
بله. مانند لیست، عناصر تکراری در تاپل مجاز هستند.
آیا میتوان تاپل را مرتب کرد؟
تاپل متد sort() ندارد. تابع sorted() عناصر را مرتب میکند، اما نتیجه آن یک لیست است:
numbers = (30, 10, 20)
sorted_numbers = sorted(numbers)
print(sorted_numbers)برای دریافت تاپل مرتبشده میتوان نتیجه را دوباره تبدیل کرد:
sorted_tuple = tuple(sorted(numbers))آیا پرانتز برای ساخت تاپل ضروری است؟
خیر. ویرگول عنصر اصلی ساخت تاپل است؛ اما استفاده از پرانتز معمولاً کد را خواناتر میکند.
تفاوت اصلی List و Tuple چیست؟
لیست قابلتغییر است، اما تاپل پس از ساختهشدن امکان تغییر مستقیم عناصر را نمیدهد.
جمعبندی
در این درس یاد گرفتیم تاپل مجموعهای مرتب و غیرقابلتغییر از مقدارهاست. با روشهای ساخت تاپل، اندیسگذاری، برش، پیمایش، count()، index()، بستهبندی و بازکردن مقادیر آشنا شدیم و تفاوت آن را با لیست بررسی کردیم.
هنگامی که دادهها باید ثابت باقی بمانند، تاپل انتخاب روشن و مطمئنی است. برای فهرستهای پویا که عناصر آنها تغییر میکنند، استفاده از لیست مناسبتر خواهد بود.
درس بعدی: دیکشنری در پایتون؛ ذخیره اطلاعات بهصورت کلید و مقدار.
ادامه مسیر یادگیری پایتون
برای یادگیری منظم، آموزشهای مرتبط زیر را بهترتیب دنبال کنید:
برای ذخیره پیشرفت در همه دستگاهها و دریافت گواهی پایان مسیر، رایگان ثبتنام کن یا وارد شو.