آموزش

تاپل‌ها در پایتون

Learn about Python tuples: what they are, how to create them, when to use them, what operations you perform on them and various functions you should know.

تاریخ انتشار:
27 خرداد 1405
پایتون
10 دقیقه
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

تاپل‌ها (Tuples) شبیه به لیست‌های پایتون، یکی دیگه از انواع داده استاندارد هستن که بهت اجازه می‌دن مقادیر رو در یک توالی ذخیره کنی. تاپل‌ها در شرایطی مفیدن که می‌خوای داده‌ها رو با کسی به اشتراک بذاری اما اجازه تغییرشون رو بهش ندی. اون‌ها می‌تونن از مقادیر استفاده کنن، اما هیچ تغییری در داده‌های اصلی اعمال نمی‌شه.

در این آموزش، تاپل‌های پایتون رو با جزئیات بررسی می‌کنیم:

  • یاد می‌گیری چطور می‌تونی تاپل‌ها رو مقداردهی اولیه کنی. همچنین طبیعت تغییرناپذیر (Immutable) تاپل‌ها رو با مثال‌هایی می‌بینی.
  • متوجه می‌شی که تفاوت تاپل با لیست پایتون چیه.
  • سپس، عملیات مختلف کار با تاپل مثل برش زدن (Slicing)، ضرب، ترکیب و غیره رو یاد می‌گیری.
  • آشنایی با برخی از توابع داخلی مربوط به تاپل‌ها  خیلی مفیده و توابع مهم رو در این بخش می‌بینی.
  • در نهایت، می‌بینی که انتساب چند مقدار به صورت هم‌زمان در تاپل‌ها هم ممکنه.

حتما دوره انواع داده برای علم داده از فینکا رو ببین، جایی که می‌تونی دانشت رو درباره ساختارهای داده مثل لیست‌ها، دیکشنری‌ها، مجموعه‌ها و خیلی چیزهای دیگه تقویت و تمرین کنی! از طرفی، می‌تونی آموزش ساختارهای داده در پایتون رو هم بخونی تا با ساختارهای داده مختلفی که پایتون استفاده می‌کنه بیشتر آشنا بشی.

تاپل در پایتون

همونطور که قبلا خوندی، می‌تونی از این ساختار داده پایتون برای ذخیره یک توالی از آیتم‌ها استفاده کنی که تغییرناپذیر و مرتبن.

تاپل‌ها برخلاف لیست‌ها که با براکت [] ساخته می‌شن، با پرانتز () مقداردهی اولیه می‌شن. این یعنی، برای ساخت یک تاپل، فقط کافیه کار زیر رو انجام بدی:

خروجی
<class 'tuple'>

یادت باشه که تابع type() یک تابع داخلیه که بهت اجازه می‌ده تا نوع داده پارامتر ارسال‌شده بهش رو بررسی کنی.

تاپل‌ها می‌تونن مقادیر همگن (هم نوع) و ناهمگن رو در خودشون جای بدن. با این حال، به خاطر داشته باش که وقتی این مقادیر رو تعریف کردی، دیگه نمی‌تونی اون‌ها رو تغییر بدی:

خروجی
C : <class 'str'>
0 : <class 'int'>
0 : <class 'int'>
K : <class 'str'>
I : <class 'str'>
E : <class 'str'>
خروجی
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-16-dec29c289a95> in <module>()
----> 1 mixed_type[1] = 'O' # Trying to change 0 to 'O'


TypeError: 'tuple' object does not support item assignment

این پیام خطای آخر رو دریافت می‌کنی چون نمی‌تونی مقادیر داخل یک تاپل رو تغییر بدی.

اینجا روش دیگه‌ای برای ساخت یک تاپل وجود داره:

خروجی
<class 'tuple'>

تاپل‌ در مقابل لیست

شاید متوجه شده باشی که تاپل‌ها خیلی شبیه به لیست‌ها هستن. در واقع، می‌تونی بگی که اون‌ها لیست‌های تغییرناپذیر هستن؛ یعنی وقتی یک تاپل ساخته می‌شه، نمی‌تونی مقادیر درونش رو حذف کنی یا تغییر بدی. نمی‌تونی مقادیر جدیدی هم بهش اضافه کنی. اینو ببین:

خروجی
---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-26-e47776d745ce> in <module>()
      3 
      4 # Append a number to the tuple
----> 5 numbers_tuple.append(6)


AttributeError: 'tuple' object has no attribute 'append'

این کار با یک خطا مواجه می‌شه چون نمی‌تونی چیزی رو به یک تاپل اضافه کنی یا ازش حذف کنی؛ اما با یک لیست می‌تونی این کار رو انجام بدی.

خروجی
[1, 2, 3, 4, 5, 6, 8]

اما چرا باید از تاپل‌ها استفاده کنی وقتی تغییرناپذیر هستن؟

خب، علاوه بر اینکه اون‌ها دسترسی «فقط خواندن» (Read-only) به داده‌ها فراهم می‌کنن، از لیست‌ها هم سریع‌تر هستن. کدهای زیر رو در نظر بگیر:

خروجی
0.0018976779974764213
خروجی
0.019868606992531568

تغییرناپذیر دقیقا در تاپل‌ها چه معنایی داره؟

طبق مستندات رسمی پایتون، اصطلاح تغییرناپذیر به «شیئی با مقدار ثابت» اشاره داره. اما کلمه «مقدار» کمی مبهمه؛ اصطلاح درست‌تر برای تاپل‌ها شناسه یا همون id هست. id در واقع هویت مکان یک شیء در حافظه‌ست.

بیا کمی دقیق‌تر نگاه کنیم:

خروجی
True
خروجی
False
خروجی
4297148528
خروجی
4359711048
خروجی
---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-40-3cd258e024ff> in <module>()
----> 1 n_tuple.append(5)


AttributeError: 'tuple' object has no attribute 'append'

همون‌طور که دیدی، نمی‌تونی موردی رو به یک تاپل اضافه کنی، به همین دلیل خطای بالا رو دریافت می‌کنی. برای همین تاپل، تغییرناپذیر نامیده می‌شه. اما همیشه می‌تونی این کار رو انجام بدی:

خروجی
(1, 1, [3, 4, 5])

بنابراین، این کار بهت اجازه می‌ده تا واقعا، تاپل اصلی رو تغییر بدی. پس چطور تاپل همچنان تغییرناپذیر نامیده می‌شه؟

این به این دلیله که شناسه لیستِ درون تاپل همچنان ثابت می‌مونه، حتی با اینکه عدد 5 رو بهش اضافه کردی.

خروجی
4359711048

برای خلاصه‌کردن چیزهایی که تا اینجا یاد گرفتی:

بعضی تاپل‌ها (که فقط شامل اشیای تغییرناپذیر مثل رشته‌ها و غیره هستن) تغییرناپذیرن و بعضی تاپل‌های دیگه (که شامل یک یا چند شیء تغییرپذیر مثل لیست‌ها هستن) تغییرپذیرن. با این حال، این موضوع اغلب در بین پایتون‌کارها مورد بحثه و برای درک کاملش به دانش بیشتری نیاز داری. این لینک یک مقاله عمیق‌تر در همین مورده. فعلا بهتره فقط بگیم تاپل‌ها به‌طور کلی تغییرناپذیر هستن.

  • به‌خاطر ویژگی تغییرناپذیری، نمی‌تونی عنصری رو به تاپل اضافه کنی. هیچ متد append() یا extend() در تاپل‌ها وجود نداره.
  • همچنین به‌دلیل تغییرناپذیری، نمی‌تونی عناصر رو از تاپل حذف کنی. تاپل‌ها متدهایی مثل remove() یا pop() ندارن.
  • می‌تونی عناصر داخل تاپل رو پیدا کنی؛ چون این کار تغییری در اون ایجاد نمی‌کنه.
  • می‌تونی از عملگر in استفاده کنی تا ببینی عنصری در تاپل وجود داره یا خیر.

بنابراین، اگر داری یک مجموعه ثابت از مقادیر تعریف می‌کنی و تنها کاری که باهاش داری اینه که روش پیمایش کنی، از تاپل به‌جای لیست استفاده کن. چون هم سریع‌تر از لیسته و هم امن‌تر، در واقع اطلاعات یک تاپل، «محافظت‌شده در برابر نوشتن» محسوب می‌شن.

اگر دوست داری درباره لیست‌های پایتون بیشتر بدونی، حتما این آموزش رو هم ببین!

عملیات‌های رایج در تاپل‌ها

پایتون روش‌های مختلفی برای کار و تغییر تاپل‌ها در اختیارت می‌ذاره. بیا بعضی از مهم‌ترین‌هاشون رو با مثال بررسی کنیم.

برش‌ زدن تاپل

اولین مقدار در یک تاپل، دارای اندیس 0 هست. درست مثل لیست‌های پایتون، می‌تونی از مقادیر اندیس در ترکیب با براکت [] برای دسترسی به آیتم‌ها در یک تاپل استفاده کنی:

خروجی
0

همچنین می‌تونی از اندیس‌دهی منفی در تاپل‌ها استفاده کنی:

خروجی
5

درحالی‌که اندیس‌دهی برای دستیابی به آیتم‌های جداگانه استفاده می‌شه، برش زدن بهت اجازه می‌ده یک زیرمجموعه از آیتم‌ها رو به دست بیاری. وقتی محدوده‌ای رو که می‌خوای استخراج کنی مشخص می‌کنی، بهش برش محدوده‌ای گفته می‌شه. قالب کلی این نوع از برش‌ به صورت زیره:

اینجا Increment یک پارامتر اختیاریه، و مقدار پیش‌فرض گام افزایش برابر 1 در نظر گرفته می‌شه.

خروجی
(1, 2, 3)
خروجی
(0, 1, 2, 3, 4, 5)
خروجی
(0, 2, 4)

نکته: تو می‌تونی از مقدار افزایش منفی برای معکوس کردن تاپل استفاده کنی.

خروجی
(5, 4, 3, 2, 1, 0)

جمع کردن تاپل‌

می‌تونی تاپل‌ها رو ترکیب کنی تا یک تاپل جدید بسازی. عملیات جمع، فقط کار پیوند دادن مقادیر تاپل رو انجام می‌ده.

خروجی
(1, 2, 3, 4, 5, 6, 7, 8)
خروجی
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-55-d352c6414a4c> in <module>()
      1 y = [5,6,7,8]
----> 2 z = x + y
      3 print(z)


TypeError: can only concatenate tuple (not "list") to tuple

فقط می‌تونی انواع داده مشابه رو با هم جمع یا ترکیب کنی. بنابراین ترکیب کردن یک تاپل و یک لیست با خطا روبه‌رو می‌شه.

ضرب کردن تاپل

عملیات ضرب کردن صرفا منجر به تکرار تاپل می‌شه.

خروجی
(1, 2, 3, 4, 1, 2, 3, 4)

توابع تاپل

برخلاف لیست‌های پایتون، تاپل‌ها به دلیل ماهیت تغییرناپذیرشون، متدهایی مثل append()، remove()، extend()، insert() و pop() ندارن. اما، بسیاری از متدهای داخلی دیگه برای کار با تاپل‌ها وجود دارن:

متد ()count و ()len

متد count() تعداد دفعات تکرار یک آیتم در یک تاپل رو برمی‌گردونه.

خروجی
2

با تابع len()، می‌تونی طول تاپل رو برگردونی:

خروجی
5

تابع ()any

می‌تونی از any() استفاده کنی تا بفهمی آیا عنصری از یک تاپل یک نوع داده تکرارپذیر هست یا نه. اگر این‌طور باشه True و در غیر این صورت False برمی‌گردونه.

خروجی
True

به , در زمان تعریف تاپل a در بالا دقت کن. اگر هنگام قرار دادن یک آیتم واحد در یک تاپل، از کاما استفاده نکنی، پایتون فرض می‌کنه که اشتباها یک جفت پرانتز اضافه گذاشتی (که البته مشکلی ایجاد نمی‌کنه) اما در این صورت، نوع داده یک تاپل نیست. بنابراین یادت باشه وقتی قصد داری یک آیتم تنها رو در تاپل مقداردهی کنی، حتما یک کاما قرار بدی.

حالا برگردیم به تابع any(): در یک زمینه بولین، مقدار آیتم اهمیتی نداره. یک تاپل خالی معادل با False و هر تاپلی با حداقل یک آیتم برابر با True خواهد بود.

خروجی
False

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

متد ()tuple

از تابع tuple() برای تبدیل یک نوع داده به تاپل استفاده می‌شه. برای مثال، در قطعه کد زیر، یک لیست پایتون رو به یک تاپل تبدیل می‌کنی.

خروجی
<class 'tuple'>

متد ()min و ()max

درحالی‌که تابع max() بزرگ‌ترین عنصر در تاپل رو برمی‌گردونه، می‌تونی از min() برای دریافت کوچک‌ترین عنصر تاپل استفاده کنی. مثال زیر رو در نظر بگیر:

خروجی
5
A

همین‌طور می‌تونی از این توابع برای تاپل‌هایی شامل نوع داده رشته هم استفاده کنی.

خروجی
p

متد ()sum

با این تابع، مجموع همه آیتم‌های درون یک تاپل رو به دست میاری. این تابع فقط با مقادیر عددی قابل‌استفاده‌ست.

خروجی
28

متد ()sorted

برای دریافت یک تاپل با عناصر مرتب‌شده، از تابع sorted() استفاده کن، درست مثل مثال زیر:

خروجی
[1, 2, 3, 4, 5, 6, 7]

باید به این نکته توجه کنی که نوع داده بازگشتی یک لیسته و نه تاپل. توالی عناصر در تاپل اصلی a تغییر نکرده و متغیر a همچنان از نوع تاپل باقی مونده.

نکته طلایی: انتساب چند مقدار هم‌زمان

یکی از کارهای جالبی که می‌تونی با تاپل‌ها انجام بدی اینه که با استفاده ازشون، چند متغیر رو به‌طور هم‌زمان مقداردهی کنی. اینو ببین:

خروجی
1

متغیر a یک تاپل با سه عنصره و (one,two,three) هم تاپلی با سه متغیره. اختصاص دادن (one,two,three) به تاپل a، مقادیر a رو به ترتیب به متغیرهای یک، دو و سه نسبت می‌ده. این روش زمانی که باید محدوده‌ای از مقادیر رو به توالی از متغیرهای یک تاپل نسبت بدی می‌تونه خیلی کاربردی باشه.

تبریک!

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

اشتراک‌گذاری
فهرست مطالب
  • تاپل در پایتون
  • تاپل‌ در مقابل لیست
  • عملیات‌های رایج در تاپل‌ها
  • توابع تاپل
  • نکته طلایی: انتساب چند مقدار هم‌زمان
  • تبریک!

دریافت اپلیکیشن فینکا

با اپلیکیشن فینکا، به بیشتر دوره‌ها و مسیرها روی موبایل دسترسی دارید، تمرین می‌کنید و یادگیری رو هم‌زمان روی موبایل و دسکتاپ ادامه می‌دید.