تاپل در پایتون چیست؟ آموزش Tuple و تفاوت آن با List
تاپل در پایتون
جلسه ۱۸ آموزش پایتون: تاپل در پایتون و تفاوت آن با لیست
تاپل در پایتون یکی از ساختارهای مهم برای نگهداری چند مقدار در یک متغیر است که برخلاف لیست، پس از ایجاد قابل تغییر نیست. در این جلسه با ساخت Tuple، دسترسی به عناصر، اندیسگذاری، برش یا Slicing و متدهای مهم آن آشنا میشویم. همچنین تفاوت List و Tuple را بررسی میکنیم و یاد میگیریم چه زمانی بهتر است از تاپل استفاده کنیم. در پایان نیز با چند مثال واقعی و تمرین، کاربرد این ساختار را در برنامههای پایتونی یاد میگیریم.
تحقیق و تدوین مهدی گمرکی
اگر میخواهید ابتدا با ساختارهای قابل تغییر در پایتون آشنا شوید، پیشنهاد میکنیم قبل از ادامه این آموزش، آموزش لیست در پایتون را مطالعه کنید؛ چون در این جلسه قرار است تاپل را با لیست مقایسه کنیم و دقیقاً ببینیم هرکدام چه زمانی کاربرد دارند.
بعد از لیست، چرا باید تاپل را یاد بگیریم؟
در جلسه قبل با لیست (List) آشنا شدیم. لیست یکی از پرکاربردترین ساختارهای داده در پایتون است و به ما اجازه میدهد چند مقدار را در یک متغیر ذخیره کنیم.
برای مثال:
products = ["Laptop", "Mouse", "Keyboard"]
اما همیشه نمیخواهیم دادههای ذخیرهشده قابل تغییر باشند.
فرض کنید اطلاعات یک محصول شامل نام، قیمت و کد محصول است:
product = ("Laptop", 45000, "LP100")
ممکن است بخواهیم این اطلاعات را ذخیره کنیم، اما نمیخواهیم برنامه در ادامه بهصورت تصادفی مقدار قیمت یا کد محصول را تغییر دهد.
اینجاست که Tuple اهمیت پیدا میکند.
تاپل نیز مانند لیست میتواند چند مقدار را در خود نگهداری کند، اما یک تفاوت بسیار مهم دارد:
تاپل پس از ایجاد قابل تغییر نیست.
به این ویژگی در پایتون Immutable یا «تغییرناپذیر» گفته میشود.
تاپل در پایتون چیست؟
Tuple یک ساختار داده در پایتون است که برای نگهداری چند مقدار در کنار یکدیگر استفاده میشود.
یک تاپل میتواند شامل چند نوع داده مختلف باشد:
user = ("Ali", 25, "Tehran")
در این مثال سه مقدار داخل یک Tuple قرار گرفتهاند:
- نام کاربر
- سن کاربر
- شهر کاربر
تاپل معمولاً با استفاده از پرانتز () ساخته میشود.
numbers = (10, 20, 30, 40)
ساخت Tuple در پایتون
سادهترین روش ساخت تاپل استفاده از پرانتز است:
numbers = (10, 20, 30)
میتوانیم تاپل را با رشتهها نیز بسازیم:
colors = ("red", "green", "blue")
یا دادههای مختلف را کنار هم قرار دهیم:
person = ("Sara", 28, True)
پایتون اجازه میدهد انواع مختلف داده را در یک Tuple قرار دهیم.
یک Tuple خالی
مانند لیست، میتوان یک تاپل خالی نیز ایجاد کرد:
empty_tuple = ()
در این حالت، متغیر empty_tuple یک Tuple خالی است.
Tuple یک عضوی؛ نکتهای که نباید فراموش کنید
یکی از نکات مهم درباره Tuple این است که برای ساخت یک تاپل تکعضوی، ویرگول اهمیت دارد.
این کد را ببینید:
number = (10)
این متغیر در واقع Tuple نیست؛ مقدار آن یک عدد صحیح است.
اما:
number = (10,)
یک Tuple تکعضوی ایجاد میکند.
میتوانیم این موضوع را بررسی کنیم:
number = (10,)
print(type(number))
خروجی:
<class 'tuple'>
بنابراین:
(10)
با:
(10,)
متفاوت است.
دسترسی به عناصر Tuple
مانند List، عناصر Tuple نیز دارای Index یا اندیس هستند.
فرض کنید:
fruits = ("apple", "banana", "orange")
اندیس عناصر به شکل زیر است:
apple → 0
banana → 1
orange → 2
برای دسترسی به عنصر اول:
print(fruits[0])
خروجی:
apple
برای عنصر دوم:
print(fruits[1])
خروجی:
banana
و برای عنصر سوم:
print(fruits[2])
خروجی:
orange
استفاده از اندیس منفی
در Tuple نیز مانند List میتوان از اندیس منفی استفاده کرد.
fruits = ("apple", "banana", "orange")
در این حالت:
orange → -1
banana → -2
apple → -3
مثلاً:
print(fruits[-1])
خروجی:
orange
این قابلیت زمانی کاربردی است که بخواهیم از انتهای داده به عناصر دسترسی داشته باشیم.
Slicing در Tuple
یکی دیگر از ویژگیهای مهم Tuple، امکان استفاده از Slicing یا برش است.
فرض کنید:
numbers = (10, 20, 30, 40, 50)
اگر بخواهیم بخشی از Tuple را دریافت کنیم:
print(numbers[1:4])
خروجی:
(20, 30, 40)
نکته مهم این است که عنصر اندیس شروع در نظر گرفته میشود، اما عنصر اندیس پایان در نتیجه قرار نمیگیرد.
بنابراین:
numbers[1:4]
یعنی عناصر اندیسهای:
1
2
3
Slicing با ابتدای Tuple
میتوانیم از ابتدای Tuple نیز برش بگیریم:
numbers = (10, 20, 30, 40, 50)
print(numbers[:3])
خروجی:
(10, 20, 30)
Slicing تا انتهای Tuple
برای دریافت بخشی از یک اندیس تا انتهای Tuple:
numbers = (10, 20, 30, 40, 50)
print(numbers[2:])
خروجی:
(30, 40, 50)
مهمترین ویژگی Tuple؛ تغییرناپذیری
حالا به مهمترین تفاوت Tuple با List میرسیم.
یک List قابل تغییر است:
numbers = [10, 20, 30]
numbers[0] = 100
print(numbers)
خروجی:
[100, 20, 30]
اما اگر همین کار را با Tuple انجام دهیم:
numbers = (10, 20, 30)
numbers[0] = 100
پایتون خطا میدهد.
دلیل آن این است که Tuple Immutable است.
یعنی بعد از ایجاد Tuple نمیتوان عناصر آن را مستقیماً تغییر داد.
چرا تغییرناپذیری مهم است؟
شاید در نگاه اول تصور کنید تغییرناپذیر بودن یک محدودیت است.
اما در برنامهنویسی، گاهی دقیقاً همین ویژگی یک مزیت محسوب میشود.
فرض کنید اطلاعات یک مختصات جغرافیایی را ذخیره کردهایم:
location = (35.6892, 51.3890)
اگر قرار است این دو مقدار بهعنوان یک موقعیت ثابت استفاده شوند، منطقی است ساختاری داشته باشیم که در طول اجرای برنامه بهصورت تصادفی تغییر نکند.
در چنین شرایطی Tuple میتواند انتخاب مناسبی باشد.
List و Tuple چه تفاوتی دارند؟
یکی از مهمترین سؤالات هنگام یادگیری پایتون این است:
چه زمانی از List استفاده کنیم و چه زمانی از Tuple؟
تفاوت اصلی این دو ساختار در قابلیت تغییر آنهاست.
| ویژگی | List | Tuple |
|---|---|---|
| ساختار | [] |
() |
| قابل تغییر | بله | خیر |
| Index | دارد | دارد |
| Slicing | دارد | دارد |
| نگهداری چند مقدار | بله | بله |
| append | دارد | ندارد |
| remove | دارد | ندارد |
| pop | دارد | ندارد |
| کاربرد | دادههای قابل تغییر | دادههای ثابتتر |
برای مثال، اگر فهرست محصولات فروشگاه مرتباً تغییر میکند:
products = ["Laptop", "Mouse", "Keyboard"]
List انتخاب طبیعیتری است.
اما اگر بخواهیم مشخصات ثابت یک محصول را به شکل یک مجموعه منظم نگهداری کنیم:
product = ("Laptop", 45000, "LP100")
Tuple میتواند مناسب باشد.
Tuple چه زمانی انتخاب بهتری است؟
یک قانون ساده برای شروع کار:
اگر دادهها باید در طول اجرای برنامه تغییر کنند، List معمولاً گزینه مناسبی است؛ اگر دادهها قرار است ثابت بمانند، Tuple میتواند انتخاب مناسبی باشد.
برای مثال:
فهرست خرید
shopping_list = ["Milk", "Bread", "Eggs"]
کاربر ممکن است محصولی را اضافه یا حذف کند؛ بنابراین List مناسب است.
مختصات
location = (35.6892, 51.3890)
مختصات یک نقطه معمولاً بهعنوان یک مجموعه ثابت از مقادیر استفاده میشود؛ بنابراین Tuple انتخاب مناسبی است.
متدهای مهم Tuple
تعداد متدهای Tuple نسبت به List کمتر است.
دلیل آن روشن است: چون Tuple قابل تغییر نیست، متدهایی مانند append()، remove() یا sort() در آن وجود ندارند.
دو متد مهم Tuple عبارتاند از:
count()index()
متد count
متد count() مشخص میکند یک مقدار چند بار در Tuple تکرار شده است.
مثال:
numbers = (10, 20, 10, 30, 10)
print(numbers.count(10))
خروجی:
3
یعنی عدد 10 سه بار در Tuple وجود دارد.
متد index
متد index() اولین موقعیت یک مقدار را پیدا میکند.
مثال:
colors = ("red", "blue", "green")
print(colors.index("blue"))
خروجی:
1
چون blue در اندیس شماره ۱ قرار دارد.
اگر یک مقدار چند بار وجود داشته باشد، index() موقعیت اولین مورد را برمیگرداند.
مثلاً:
numbers = (10, 20, 30, 20, 40)
print(numbers.index(20))
خروجی:
1
بررسی وجود یک مقدار در Tuple
مانند List میتوان با استفاده از in بررسی کرد که یک مقدار در Tuple وجود دارد یا خیر.
fruits = ("apple", "banana", "orange")
print("banana" in fruits)
خروجی:
True
اگر مقدار وجود نداشته باشد:
print("mango" in fruits)
خروجی:
False
این روش برای بررسی سریع وجود یک مقدار بسیار کاربردی است.
به دست آوردن تعداد عناصر Tuple
برای دریافت تعداد عناصر یک Tuple میتوان از تابع len() استفاده کرد.
numbers = (10, 20, 30, 40)
print(len(numbers))
خروجی:
4
len() در اینجا تعداد عناصر Tuple را برمیگرداند.
پیمایش Tuple با حلقه for
از آنجا که Tuple یک مجموعه از عناصر است، میتوانیم با for روی آن پیمایش کنیم.
fruits = ("apple", "banana", "orange")
for fruit in fruits:
print(fruit)
خروجی:
apple
banana
orange
این روش زمانی بسیار مفید است که بخواهیم تمام دادههای یک Tuple را پردازش کنیم.
مثال واقعی؛ اطلاعات کاربران
فرض کنید مشخصات چند کاربر را به شکل Tuple ذخیره کردهایم:
users = (
("Ali", 25),
("Sara", 28),
("Reza", 31)
)
حالا میتوانیم اطلاعات کاربران را پیمایش کنیم:
for user in users:
print(user)
خروجی:
('Ali', 25)
('Sara', 28)
('Reza', 31)
حتی میتوانیم مقادیر هر Tuple را مستقیماً دریافت کنیم:
for name, age in users:
print(name, age)
خروجی:
Ali 25
Sara 28
Reza 31
این قابلیت در پروژههای واقعی بسیار کاربردی است.
Tuple و Unpacking
یکی از قابلیتهای جالب Tuple، Unpacking یا بازکردن مقادیر آن است.
فرض کنید:
person = ("Ali", 25, "Tehran")
میتوانیم مقادیر را در سه متغیر قرار دهیم:
name, age, city = person
print(name)
print(age)
print(city)
خروجی:
Ali
25
Tehran
پایتون مقادیر Tuple را بهترتیب در متغیرهای مربوط قرار میدهد.
تعداد متغیرها باید با تعداد مقادیر قابل تطبیق باشد.
مثلاً این کد مشکل دارد:
person = ("Ali", 25, "Tehran")
name, age = person
چون سه مقدار داریم اما فقط دو متغیر تعریف کردهایم.
یک کاربرد جالب؛ جابهجایی دو متغیر
در پایتون میتوان از ویژگی Unpacking برای جابهجایی ساده مقادیر استفاده کرد:
a = 10
b = 20
a, b = b, a
print(a)
print(b)
خروجی:
20
10
این یکی از قابلیتهای جذاب زبان پایتون است که به ساختار Tuple و نحوه انتساب چندگانه مقادیر مرتبط است.
آیا Tuple واقعاً کاملاً تغییرناپذیر است؟
یک نکته مهم و کمی پیشرفتهتر وجود دارد.
خود Tuple تغییرناپذیر است، اما اگر داخل آن یک شیء قابل تغییر مانند List قرار داشته باشد، محتوای آن شیء میتواند تغییر کند.
مثال:
data = ("Ali", [10, 20, 30])
data[1].append(40)
print(data)
خروجی:
('Ali', [10, 20, 30, 40])
در اینجا خود عنصر Tuple جایگزین نشده است.
بلکه List موجود درون Tuple تغییر کرده است.
این موضوع نشان میدهد که مفهوم Immutable بودن را باید دقیق درک کنیم:
Immutable بودن Tuple به این معناست که عناصر و ارجاعهای درون Tuple را نمیتوان مستقیماً جایگزین کرد؛ اما اشیای قابل تغییر داخل آن ممکن است همچنان قابل تغییر باشند.
برای یک برنامهنویس مبتدی، فعلاً همین نکته را به خاطر داشته باشید و در مباحث پیشرفتهتر میتوانیم مفهوم آن را دقیقتر بررسی کنیم.
تبدیل List به Tuple
گاهی لازم است یک List را به Tuple تبدیل کنیم.
برای این کار میتوانیم از tuple() استفاده کنیم:
numbers = [10, 20, 30]
numbers_tuple = tuple(numbers)
print(numbers_tuple)
خروجی:
(10, 20, 30)
تبدیل Tuple به List
برعکس این حالت نیز امکانپذیر است.
numbers = (10, 20, 30)
numbers_list = list(numbers)
print(numbers_list)
خروجی:
[10, 20, 30]
این تبدیل زمانی کاربرد دارد که دادهای ابتدا بهصورت Tuple دریافت شده باشد اما بخواهیم آن را تغییر دهیم.
یک مثال واقعی از فروشگاه
فرض کنید مشخصات ثابت یک محصول را در Tuple نگهداری کنیم:
product = ("Laptop", 45000, "LP100")
میتوانیم اطلاعات آن را استخراج کنیم:
name, price, code = product
print("Name:", name)
print("Price:", price)
print("Code:", code)
خروجی:
Name: Laptop
Price: 45000
Code: LP100
اگر بعداً بخواهیم قیمت را تغییر دهیم، باید توجه داشته باشیم که Tuple مستقیماً قابل تغییر نیست.
اگر تغییرپذیری برای این داده ضروری باشد، List یا ساختار داده مناسب دیگری میتواند گزینه بهتری باشد.
خطاهای رایج در کار با Tuple
۱. تلاش برای تغییر عنصر Tuple
کد زیر اشتباه است:
numbers = (10, 20, 30)
numbers[0] = 100
چون Tuple تغییرناپذیر است.
۲. فراموش کردن ویرگول در Tuple تکعضوی
این:
item = (10)
Tuple نیست.
اما این:
item = (10,)
یک Tuple تکعضوی است.
۳. اشتباه در Unpacking
اگر تعداد متغیرها با تعداد مقادیر هماهنگ نباشد، خطا دریافت میکنیم.
مثلاً:
person = ("Ali", 25, "Tehran")
name, age = person
در این حالت تعداد متغیرها کافی نیست.
۴. استفاده از متدهای List برای Tuple
کد زیر معتبر نیست:
numbers = (10, 20, 30)
numbers.append(40)
Tuple متد append() ندارد.
تمرینهای جلسه ۱۸
تمرین ساده ۱
یک Tuple با نام سه شهر ایجاد کنید و شهر دوم را چاپ کنید.
تمرین ساده ۲
یک Tuple شامل پنج عدد ایجاد کنید و با استفاده از len() تعداد عناصر آن را نمایش دهید.
تمرین متوسط ۱
Tuple زیر را ایجاد کنید:
numbers = (10, 20, 30, 40, 50)
سپس با استفاده از Slicing سه مقدار اول را چاپ کنید.
تمرین متوسط ۲
یک Tuple از نام چند محصول ایجاد کنید و با استفاده از in بررسی کنید که آیا محصول "Laptop" در آن وجود دارد یا خیر.
تمرین متوسط ۳
Tuple زیر را ایجاد کنید:
person = ("Sara", 28, "Tehran")
سپس با استفاده از Unpacking، نام، سن و شهر را در سه متغیر جداگانه قرار دهید.
تمرین چالشی
یک Tuple شامل اطلاعات چند محصول ایجاد کنید:
products = (
("Laptop", 45000),
("Mouse", 1200),
("Keyboard", 2500)
)
با استفاده از حلقه for نام و قیمت هر محصول را چاپ کنید.
سپس برنامه را طوری تغییر دهید که فقط محصولاتی با قیمت بیشتر از 2000 نمایش داده شوند.
جمعبندی جلسه ۱۸
در این جلسه با تاپل در پایتون آشنا شدیم و دیدیم که Tuple یکی از ساختارهای مهم برای نگهداری چند مقدار است.
مهمترین نکات این جلسه عبارتاند از:
- Tuple معمولاً با
()ساخته میشود. - عناصر Tuple دارای Index هستند.
- میتوان از Index منفی استفاده کرد.
- Slicing در Tuple امکانپذیر است.
- Tuple قابل تغییر نیست.
- Tuple دارای متدهای
count()وindex()است. - میتوان با
inوجود یک مقدار را بررسی کرد. - تابع
len()تعداد عناصر Tuple را مشخص میکند. - میتوان Tuple را با
forپیمایش کرد. - امکان Unpacking مقادیر Tuple وجود دارد.
- میتوان List را به Tuple و Tuple را به List تبدیل کرد.
- انتخاب بین List و Tuple به نیاز برنامه و تغییرپذیر بودن یا نبودن دادهها بستگی دارد.
به زبان ساده:
List برای دادههایی که ممکن است تغییر کنند و Tuple برای مجموعه دادههایی که میخواهیم ساختارشان تغییر نکند، کاربرد بسیار خوبی دارند.
جلسه بعد؛ مجموعهها در پایتون
در جلسه بعد وارد یکی دیگر از ساختارهای مهم داده در پایتون میشویم:
Set یا مجموعه در پایتون
در Set با مفاهیمی مانند حذف دادههای تکراری، add()، remove()، discard()، اجتماع، اشتراک و تفاضل مجموعهها آشنا خواهیم شد.
این موضوع زمانی اهمیت بیشتری پیدا میکند که بخواهیم با مجموعهای از دادههای یکتا کار کنیم.
برای ادامه مسیر یادگیری، در جلسه بعد به سراغ آموزش مجموعهها در پایتون (Set) میرویم و یاد میگیریم چگونه دادههای تکراری را حذف کنیم و عملیات مختلف مجموعهای را انجام دهیم.
سؤالات متداول درباره تاپل در پایتون
۱. تاپل در پایتون چیست؟
Tuple یک ساختار داده برای نگهداری چند مقدار است که پس از ایجاد، عناصر آن مستقیماً قابل تغییر نیستند.
۲. تفاوت List و Tuple در پایتون چیست؟
مهمترین تفاوت این است که List قابل تغییر است، اما Tuple تغییرناپذیر است.
۳. چگونه در پایتون Tuple بسازیم؟
معمولاً با استفاده از پرانتز ساخته میشود:
numbers = (10, 20, 30)
۴. آیا Tuple قابل تغییر است؟
خیر. نمیتوان عناصر Tuple را پس از ایجاد مستقیماً جایگزین یا حذف کرد.
۵. چگونه به یک عنصر Tuple دسترسی پیدا کنیم؟
مانند List از Index استفاده میکنیم:
numbers = (10, 20, 30)
print(numbers[0])
۶. آیا در Tuple میتوان از Slicing استفاده کرد؟
بله. Tuple از Slicing پشتیبانی میکند:
numbers = (10, 20, 30, 40)
print(numbers[1:3])
۷. متدهای مهم Tuple کداماند؟
دو متد مهم Tuple عبارتاند از count() برای شمارش یک مقدار و index() برای پیدا کردن اولین موقعیت یک مقدار.
۸. چگونه بفهمیم یک مقدار در Tuple وجود دارد؟
میتوان از عملگر in استفاده کرد:
"Ali" in users
۹. Tuple یک عضوی چگونه ساخته میشود؟
برای ساخت Tuple یک عضوی باید بعد از مقدار ویرگول قرار دهیم:
item = (10,)
۱۰. چه زمانی از Tuple استفاده کنیم؟
وقتی مجموعهای از دادهها را داریم که قرار نیست ساختار آنها در طول اجرای برنامه تغییر کند، Tuple میتواند انتخاب مناسبی باشد.
