تاپل (Tuple) در پایتون
جلسه هشتم - تاپل (Tuple) در پایتون
آموزش کامل تاپل: تعریف، ویژگیها، عملگرها، متدها، پکینگ و آنپکینگ — مثالها و کدهای قابل کپی.
تعریف تاپل (Tuple)
تاپل (Tuple) یکی از انواع دادههای توکار در زبان پایتون است که برای ذخیره مجموعهای از مقادیر مورد استفاده قرار میگیرد. از نظر ساختار، تاپل بسیار شبیه لیست (List) است، با این تفاوت که غیرقابل تغییر (immutable) میباشد. به عبارت دیگر، پس از ایجاد یک تاپل، امکان افزودن، حذف یا تغییر عناصر آن وجود ندارد.
نکته:
تاپل با استفاده از پرانتز () تعریف میشود و عناصر آن با ویرگول , از یکدیگر جدا میشوند.
my_tuple = (10, 20, 30, "Python", True)
در این مثال، تاپل شامل انواع دادهی عددی، رشتهای و بولی است.
تفاوت تاپل با لیست
هر دو ساختار، یعنی لیست و تاپل، قابلیت نگهداری چند نوع داده را دارند و عناصر آنها به صورت ترتیبی ذخیره میشوند. اما تفاوت اصلی در قابلیت تغییر است:
- لیستها قابل تغییر (mutable) هستند؛ میتوان مقادیر آنها را در زمان اجرا تغییر داد.
- تاپلها غیرقابل تغییر (immutable) هستند؛ پس از تعریف، محتوای آنها ثابت است.
مثال:
numbers = (1, 2, 3)
numbers[0] = 100 # خطا میدهد؛ زیرا تاپل قابل تغییر نیست
شکل ظاهری تاپل
- عناصر درون پرانتز
()قرار میگیرند. - عناصر با
,از یکدیگر جدا میشوند. - در صورتی که تاپل تنها شامل یک مقدار باشد، باید پس از آن ویرگول قرار گیرد تا پایتون آن را به عنوان تاپل تشخیص دهد.
t1 = (5,) # تاپل تکعضوی
t2 = (5) # تاپل نیست، عدد صحیح فرض میشود
ویژگیهای تاپل
۱. ترتیبدار (Ordered)
عناصر تاپل دارای ترتیب مشخص هستند و همان ترتیب در زمان تعریف، در حافظه نیز حفظ میشود.
۲. قابل دسترسی با اندیس (Indexable)
هر عنصر دارای یک اندیس عددی است که از صفر آغاز میشود. میتوان با استفاده از اندیس به عناصر دسترسی داشت:
colors = ("red", "green", "blue")
print(colors[1]) #output: green
۳. غیرقابل تغییر (Immutable)
عناصر تاپل پس از تعریف قابل تغییر نیستند؛ نمیتوان آنها را حذف، جایگزین یا اضافه کرد.
۴. پذیرش مقادیر تکراری (Allow Duplicates)
در تاپل میتوان از مقادیر تکراری استفاده کرد:
nums = (1, 2, 2, 3)
دسترسی به عناصر با استفاده از اندیس (Indexing)
هر عنصر در تاپل دارای یک اندیس عددی است که از صفر شروع میشود. میتوان با استفاده از نام تاپل و اندیس
موردنظر در داخل براکت [] به عنصر مربوطه دسترسی پیدا کرد.
numbers = (10, 20, 30, 40)
print(numbers[0]) #output: 10
print(numbers[2]) # output: 30
# اندیس منفی:
print(numbers[-1]) # خروجی: 40 (آخرین عنصر)
print(numbers[-2]) # خروجی: 30
پیمایش تاپل با حلقه (Looping)
از آنجا که تاپل یک ساختار ترتیبدار و قابل پیمایش (Iterable) است، میتوان با استفاده از حلقه for تمام عناصر آن را مرور کرد:
fruits = ("apple", "banana", "cherry")
for item in fruits:
print(item)
# output:
# apple
# banana
# cherry
این روش فقط برای خواندن دادهها مناسب است، زیرا امکان تغییر مقدار عناصر تاپل وجود ندارد.
بررسی وجود یک مقدار با عملگر in
colors = ("red", "green", "blue")
print("green" in colors) #output: True
print("yellow" in colors) #output: False
بطورکلی: تاپل در پایتون علاوه بر ویژگیهای اصلی خود (ترتیبدار، غیرقابل تغییر، پذیرای مقادیر تکراری و ایندکسپذیر)، از نظر نحوهی دسترسی به دادهها نیز مشابه لیست عمل میکند.
- میتوان با اندیس به عناصر خاص دست یافت.
- میتوان با حلقه
forعناصر را پیمایش کرد. - میتوان با عملگر
inبررسی کرد که آیا مقداری در تاپل وجود دارد یا خیر.
عملگرهای جمع (+) و ضرب (*) برای تاپل
در پایتون، تاپلها علاوه بر ویژگیهای اصلی خود، از عملگرهای جمع + و ضرب
* نیز پشتیبانی میکنند. این دو عملگر برای ترکیب یا تکرار دادهها در
تاپلها مورد استفاده قرار میگیرند و بدون تغییر در دادههای اصلی، تاپل جدیدی تولید میکنند.
جمع دو تاپل (Tuple Concatenation)
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
result = tuple1 + tuple2
print(result)
# output:
# (1, 2, 3, 4, 5, 6)
نکته: از آنجا که تاپلها غیرقابل تغییر (immutable) هستند، عملگر + باعث
ایجاد تاپل جدید میشود و تاپلهای اولیه را تغییر نمیدهد.
ضرب تاپل در عدد صحیح (Tuple Repetition)
letters = ("A", "B")
result = letters * 3
print(result)
# output:
# ('A', 'B', 'A', 'B', 'A', 'B')
نکته: عدد باید عدد صحیح (integer) باشد؛ استفاده از عدد اعشاری منجر به خطا میشود. همچنین، اگر عدد صفر
باشد، تاپل خالی () بازگردانده میشود.
nums = (1, 2, 3)
print(nums * 0) #output: ()
بطورکلی در کار با تاپلها:
- عملگر
+برای اتصال (Concatenation) چند تاپل به کار میرود. - عملگر
*برای تکرار (Repetition) عناصر یک تاپل استفاده میشود. - هیچکدام از این عملگرها تاپل اولیه را تغییر نمیدهند، بلکه تاپل جدیدی تولید میکنند.
متدهای تاپل
از آنجا که تاپلها غیرقابل تغییر (immutable) هستند، تعداد متدهای آنها محدود است. در واقع، تنها دو متد اصلی برای کار با تاپلها وجود دارد:
متد count()
این متد برای شمارش تعداد تکرار یک مقدار مشخص در تاپل استفاده میشود:
numbers = (1, 2, 3, 2, 4, 2)
count_2 = numbers.count(2)
print(count_2)
# output:
# 3
متد index()
این متد برای یافتن اولین محل وقوع یک مقدار خاص در تاپل استفاده میشود.
letters = ("a", "b", "c", "b", "d")
index_b = letters.index("b")
print(index_b)
# output:
# 1
توضیح: اگر مقدار مورد نظر در تاپل وجود نداشته باشد، متد index() خطای
ValueError تولید میکند:
letters = ("a", "b", "c")
print(letters.index("x"))
# output:
# ValueError: tuple.index(x): x not in tuple
نکته تکمیلی: متدهایی مانند append(), remove(), pop() و extend() که در لیستها وجود دارند، برای تاپل تعریف نشدهاند.
توابع داخلی کاربردی برای تاپلها
علاوه بر دو متد اصلی count() و index()،
پایتون توابع داخلی دارد که میتوان آنها را روی تاپلها نیز اجرا کرد.
تابع len()
data = (10, 20, 30, 40)
print(len(data))
# output:
# 4
تابع max() و min()
numbers = (5, 12, 3, 9)
print(max(numbers)) # 12
print(min(numbers)) # 3
تابع sum()
values = (2, 4, 6, 8)
print(sum(values))
# output:
# 20
تابع sorted()
تابع sorted() عناصر تاپل را مرتبسازی میکند، اما خروجی آن یک لیست جدید
است (نه تاپل).
data = (5, 2, 8, 1)
print(sorted(data))
# output:
# [1, 2, 5, 8]
نکته: این توابع فقط برای خواندن و پردازش دادهها هستند و ساختار اصلی تاپل را تغییر نمیدهند.
تاپل پکینگ (Packing) و آنپکینگ (Unpacking)
یکی از ویژگیهای مهم تاپلها قابلیت بستهبندی (packing) و بازکردن (unpacking) دادهها است. این قابلیت باعث میشود چند مقدار را بهصورت منظم در یک متغیر ذخیره کنیم یا از یک تاپل چند متغیر جدا استخراج کنیم.
تاپل پکینگ (Tuple Packing)
در packing چند مقدار را در قالب یک تاپل در یک متغیر قرار میدهیم. پایتون بهصورت خودکار از مقادیر جداشده با کاما، یک تاپل میسازد — حتی اگر پرانتز ننویسیم.
student = "Ali", 21, "Computer Engineering"
print(student)
# output:
# ('Ali', 21, 'Computer Engineering')
وقتی چند مقدار را با ویرگول کنار هم مینویسیم، پایتون به طور خودکار آنها را در یک تاپل بسته بندی میکند، حتی بدون پرانتز. پرانتز فقط برای خوانایی بهتر است و الزامی نیست.
تاپل آنپکینگ (Tuple Unpacking)
در unpacking مقادیر داخل یک تاپل را در چند متغیر جداگانه باز میکنیم. تعداد متغیرها در سمت چپ باید دقیقاً برابر با تعداد اعضای تاپل باشد.
student = ("Ali", 21, "Computer Engineering")
name, age, field = student
print(name)
print(age)
print(field)
# output:
# Ali
# 21
# Computer Engineering
نکته: در آنپکینگ، ترتیب متغیرها اهمیت دارد. هر مقدار تاپل به ترتیب در متغیر متناظر خود قرار میگیرد.
نکات مهم آنپکینگ
1. تعداد متغیرها باید برابر با تعداد عناصر تاپل باشد، در غیر این صورت خطای ValueError رخ میدهد.
data = (1, 2, 3)
a, b = data
# output:
# ValueError: too many values to unpack (expected 2)
استفاده از * (ستاره) در آنپکینگ
میتوان از * برای جمع کردن بقیه عناصر در یک لیست استفاده کرد.
numbers = (1, 2, 3, 4, 5)
first, *rest = numbers
print(first)
print(rest)
# output:
# 1
# [2, 3, 4, 5]
نکته: با * میتوانیم هنگام آنپکینگ، تعداد نامشخصی از عناصر را در یک
متغیر جمعآوری کنیم. اما در یک آنپکینگ فقط یک متغیر میتواند * داشته
باشد.
💡 تمرینها و سوالات
سوال 1: ساخت تاپل ساده
تاپلی شامل نام، سن و شهر خود بسازید.
# خروجی: ('Ali', 25, 'Tehran')
# راه حل:
person = ("Ali", 25, "Tehran")
print(person)
نکته آموزشی: تاپل با پرانتز () تعریف میشود و میتواند انواع مختلف داده را نگهداری کند.
سوال 2: تاپل تکعضوی
تاپلی با یک عضو بسازید و نوع آن را چاپ کنید. سپس همان عدد را بدون ویرگول بنویسید و نوع آن را بررسی کنید.
# خروجی:
# <class 'tuple'>
# <class 'int'>
# راه حل:
t1 = (5,)
print(type(t1))
t2 = (5)
print(type(t2))
نکته آموزشی: برای تاپل تکعضوی حتماً بعد از عنصر ویرگول قرار دهید، وگرنه پایتون آن را تاپل تشخیص نمیدهد.
سوال 3: دسترسی با اندیس مثبت و منفی
تاپل colors = ("red", "green", "blue", "yellow") را در نظر بگیرید. اولین و آخرین رنگ را با اندیس چاپ کنید.
# خروجی:
# red
# yellow
# راه حل:
colors = ("red", "green", "blue", "yellow")
print(colors[0])
print(colors[-1])
نکته آموزشی: اندیس منفی از انتهای تاپل شروع میشود. -1 آخرین عنصر و -2 عنصر قبل از آخر است.
سوال 4: شمارش تکرار عناصر
تاپل grades = (18, 20, 18, 19, 18, 17, 20) شامل نمرات دانشجویان است. تعداد دانشجویانی که نمره 18 گرفتهاند را بیابید.
# خروجی: 3
# راه حل:
grades = (18, 20, 18, 19, 18, 17, 20)
count_18 = grades.count(18)
print(count_18)
نکته آموزشی: متد count() تعداد تکرار یک مقدار مشخص را در تاپل برمیگرداند.
سوال 5: پیدا کردن موقعیت عنصر
در تاپل cities = ("Tehran", "Mashhad", "Isfahan", "Shiraz", "Tabriz") موقعیت شهر "Isfahan" را پیدا کنید.
# خروجی: 2
# راه حل:
cities = ("Tehran", "Mashhad", "Isfahan", "Shiraz", "Tabriz")
position = cities.index("Isfahan")
print(position)
نکته آموزشی: متد index() اولین موقعیت یک عنصر را برمیگرداند. اگر عنصر وجود نداشته باشد ValueError میدهد.
سوال 6: اتصال دو تاپل
دو تاپل weekdays و weekend را به هم متصل کنید.
weekdays = ("Mon", "Tue", "Wed", "Thu", "Fri")
weekend = ("Sat", "Sun")
# خروجی: ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun')
# راه حل:
weekdays = ("Mon", "Tue", "Wed", "Thu", "Fri")
weekend = ("Sat", "Sun")
week = weekdays + weekend
print(week)
نکته آموزشی: عملگر + دو تاپل را به هم متصل میکند و تاپل جدیدی تولید میکند. تاپلهای اصلی تغییر نمیکنند.
سوال 7: تکرار تاپل
تاپل symbol = ("*",) را 10 بار تکرار کنید و طول تاپل حاصل را چاپ کنید.
# خروجی: 10
# راه حل:
symbol = ("*",)
repeated = symbol * 10
print(len(repeated))
نکته آموزشی: عملگر * تاپل را چند بار تکرار میکند. این روش برای ایجاد تاپلهای بزرگ با مقادیر تکراری مفید است.
سوال 8: بررسی عضویت
بررسی کنید آیا عدد 7 در تاپل numbers = (1, 3, 5, 7, 9) وجود دارد یا خیر.
# خروجی: True
# راه حل:
numbers = (1, 3, 5, 7, 9)
result = 7 in numbers
print(result)
نکته آموزشی: عملگر in برای بررسی وجود یک عنصر در تاپل استفاده میشود و True یا False برمیگرداند.
سوال 9: پیمایش تاپل با حلقه
تاپل fruits = ("apple", "banana", "cherry") را با حلقه for پیمایش کنید و هر میوه را با شماره سطرش چاپ کنید.
# خروجی:
# 1. apple
# 2. banana
# 3. cherry
# راه حل:
fruits = ("apple", "banana", "cherry")
for i, fruit in enumerate(fruits, start=1):
print(f"{i}. {fruit}")
نکته آموزشی: تابع enumerate() همزمان اندیس و مقدار عناصر را برمیگرداند. پارامتر start شمارهگذاری را از 1 شروع میکند.
سوال 10: آنپکینگ با ستاره
تاپل numbers = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) را طوری آنپک کنید که اولین عدد در first، آخرین عدد در last و بقیه در middle قرار گیرند.
# خروجی:
# 1
# 10
# [2, 3, 4, 5, 6, 7, 8, 9]
# راه حل:
numbers = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
first, *middle, last = numbers
print(first)
print(last)
print(middle)
نکته آموزشی: از * برای جمعآوری چندین عنصر در یک متغیر استفاده میشود. این تکنیک برای کار با تاپلهای طولانی بسیار مفید است.
سوال 11: محاسبه میانگین نمرات
تاپل scores = (18, 20, 17, 19, 18) شامل نمرات یک دانشجو است. میانگین نمرات را محاسبه کنید.
# خروجی: 18.4
# راه حل:
scores = (18, 20, 17, 19, 18)
average = sum(scores) / len(scores)
print(average)
نکته آموزشی: توابع sum() و len() برای محاسبات آماری روی تاپلهای عددی بسیار کاربردی هستند.
سوال 12: مرتبسازی و بازگشت به تاپل
تاپل prices = (45, 23, 67, 12, 89) را مرتب کنید و نتیجه را به صورت تاپل ذخیره کنید.
# خروجی: (12, 23, 45, 67, 89)
# راه حل:
prices = (45, 23, 67, 12, 89)
sorted_prices = tuple(sorted(prices))
print(sorted_prices)
نکته آموزشی: تابع sorted() لیست برمیگرداند. برای تبدیل به تاپل از ()tuple استفاده میکنیم.
سوال 13: پیدا کردن بزرگترین و کوچکترین
در تاپل temperatures = (25, 30, 22, 28, 35, 20, 32) بیشترین و کمترین دما را پیدا کنید.
# خروجی:
# بیشترین دما: 35
# کمترین دما: 20
# راه حل:
temperatures = (25, 30, 22, 28, 35, 20, 32)
print(f"بیشترین دما: {max(temperatures)}")
print(f"کمترین دما: {min(temperatures)}")
نکته آموزشی: توابع max() و min() سریعترین راه برای یافتن بیشترین و کمترین مقدار در تاپل هستند.
سوال 14: تبدیل رشته به تاپل
رشته "Python" را به تاپل حروف تبدیل کنید.
# خروجی: ('P', 'y', 't', 'h', 'o', 'n')
# راه حل:
text = "Python"
chars = tuple(text)
print(chars)
نکته آموزشی: تابع ()tuple میتواند هر ساختار قابل پیمایش (رشته، لیست، ...) را به تاپل تبدیل کند.
سوال 15: ذخیره مختصات نقاط
تاپلی از مختصات سه نقطه در صفحه دوبعدی بسازید: (0,0), (3,4), (5,12) و فاصله نقطه دوم از مبدأ را محاسبه کنید.
# خروجی: 5.0
# راه حل:
points = ((0, 0), (3, 4), (5, 12))
x, y = points[1]
distance = (x**2 + y**2) ** 0.5
print(distance)
نکته آموزشی: تاپلها میتوانند شامل تاپلهای دیگر باشند (nested tuple). این برای ذخیره دادههای ساختاریافته مفید است.
سوال 16: برگرداندن چند مقدار از تابع
تابعی بنویسید که محیط و مساحت یک دایره را برگرداند. از تاپل برای برگرداندن دو مقدار استفاده کنید.
# ورودی: r = 5
# خروجی: (31.4, 78.5)
# راه حل:
def circle_properties(radius):
pi = 3.14
circumference = 2 * pi * radius
area = pi * radius ** 2
return (circumference, area)
r = 5
result = circle_properties(r)
print(result)
نکته آموزشی: توابع میتوانند چند مقدار را به صورت تاپل برگردانند. این الگو در پایتون بسیار رایج است.
سوال 17: فیلتر کردن عناصر تاپل
از تاپل numbers = (1, 5, 8, 12, 15, 20, 23, 30) فقط اعداد بزرگتر از 10 را در تاپل جدید قرار دهید.
# خروجی: (12, 15, 20, 23, 30)
# راه حل:
numbers = (1, 5, 8, 12, 15, 20, 23, 30)
filtered = tuple(num for num in numbers if num > 10)
print(filtered)
# یا با استفاده از filter:
filtered = tuple(filter(lambda x: x > 10, numbers))
print(filtered)
نکته آموزشی: میتوان با tuple comprehension یا تابع ()filter عناصر تاپل را فیلتر کرد. روش اول خواناتر است.
سوال 18: شمارش اعداد زوج و فرد
در تاپل numbers = (10, 15, 20, 25, 30, 35, 40) تعداد اعداد زوج و فرد را بشمارید.
# خروجی:
# اعداد زوج: 4
# اعداد فرد: 3
# راه حل:
numbers = (10, 15, 20, 25, 30, 35, 40)
even_count = 0
odd_count = 0
for num in numbers:
if num % 2 == 0:
even_count += 1
else:
odd_count += 1
print(f"اعداد زوج: {even_count}")
print(f"اعداد فرد: {odd_count}")
نکته آموزشی: با استفاده از عملگر % (باقیمانده) میتوان زوج یا فرد بودن اعداد را تشخیص داد.
سوال 19: ساخت جدول ضرب
برای عدد 7 یک تاپل حاوی 10 مضرب اول آن بسازید.
# خروجی: (7, 14, 21, 28, 35, 42, 49, 56, 63, 70)
# راه حل:
number = 7
multiples = tuple(number * i for i in range(1, 11))
print(multiples)
نکته آموزشی: tuple comprehension روش قدرتمندی برای ساخت تاپلهای محاسباتی است. مشابه list comprehension عمل میکند.
سوال 20: ذخیره اطلاعات دانشجویان
تاپلی از اطلاعات 3 دانشجو بسازید که هر دانشجو شامل (نام، سن، میانگین) باشد. سپس دانشجویی با بالاترین میانگین را پیدا کنید.
# خروجی:
# دانشجوی برتر: ('Fatemeh', 21, 19.5)
# راه حل:
students = (
("Ali", 20, 18.5),
("Fatemeh", 21, 19.5),
("Reza", 22, 17.8)
)
# پیدا کردن دانشجوی برتر
top_student = max(students, key=lambda student: student[2])
print(f"دانشجوی برتر: {top_student}")
# یا به صورت دستی:
top_student = students[0]
for student in students:
if student[2] > top_student[2]:
top_student = student
print(f"دانشجوی برتر: {top_student}")
نکته آموزشی: تاپلهای تودرتو برای ذخیره رکوردها مناسب هستند. تابع ()max با پارامتر key میتواند بر اساس معیار خاص بیشترین مقدار را پیدا کند.
دیدگاهتان را بنویسید