آموزش پایتون, پایتون سطح متوسط

تاپل در پایتون؛ ساخت، دسترسی و تفاوت 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 در پایتون

ویژگیListTuple
نشانه اصلی[]() و ویرگول
قابل‌تغییر بودنبلهخیر
افزودن و حذف عنصربا متدهایی مانند 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}")

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

تمرین‌های عملی

  1. تاپلی شامل نام پنج زبان برنامه‌نویسی بسازید و عنصر اول و آخر را نمایش دهید.
  2. یک تاپل تک‌عنصری بسازید و نوع آن را با type() بررسی کنید.
  3. عددهای زوج یک تاپل را با حلقه for نمایش دهید.
  4. تعداد تکرار عدد ۱۰ را در یک تاپل با count() محاسبه کنید.
  5. یک تاپل شامل نام، سن و شهر بسازید و با unpacking آن را داخل سه متغیر قرار دهید.
  6. اولین و آخرین عنصر یک تاپل را جدا و عناصر میانی را با متغیر ستاره‌دار دریافت کنید.
  7. یک لیست را به تاپل تبدیل کنید، یک تغییر غیرمستقیم انجام دهید و دوباره آن را به تاپل برگردانید.
  8. تاپلی از سه مختصات بسازید و هر نقطه را در یک خط نمایش دهید.
  9. دو تاپل عددی را ترکیب و نتیجه را معکوس کنید.
  10. تابعی بنویسید که کمترین، بیشترین و میانگین سه عدد را به‌صورت تاپل برگرداند.

📌 همچنین بخوانید: بازار کار پایتون در ایران، دستورهای 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()، بسته‌بندی و بازکردن مقادیر آشنا شدیم و تفاوت آن را با لیست بررسی کردیم.

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

درس بعدی: دیکشنری در پایتون؛ ذخیره اطلاعات به‌صورت کلید و مقدار.

ادامه مسیر یادگیری پایتون

برای یادگیری منظم، آموزش‌های مرتبط زیر را به‌ترتیب دنبال کنید:

می‌خواهی پیشرفتت ذخیره شود؟با ورود یا ثبت‌نام رایگان، درس‌های تمام‌شده را علامت بزن و درصد پیشرفتت را در حساب کاربری ببین.ورود / ثبت‌نام برای ذخیره پیشرفت
درس بعدی · دوره پایتون متوسط (2 از 18)دیکشنری در پایتون؛ ذخیره اطلاعات به‌صورت کلید و مقدار ←
آموزش‌های تازه، کد آماده و رفع خطاهر هفته در کانال Dev Source؛ رایگان.
🧭 مسیر یادگیری پایتون از صفر
ماژول 5: ساختارهای داده — درس 19 از 44

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *