مقاله قبلی: معرفی list و طرز ایجاد آن در پایتون
تاکنون با دو نوع داده رشته (که از کاراکترها تشکیل می شود) و لیست (که از عناصر مختلف تشکیل می شود) آشنا شدید. حال قصد داریم ساختار داده ای جدیدی را معرفی کنیم که دقیقا مشابه لیست هاست با این تفاوت که برخلاف لیست ها، تغییرناپذیر است. این نوع داده جدید، تاپل نام دارد.
بعد از آن که یک تاپل را ایجاد کردید به هیچ عنوان نمی توانید اعضا و اندازه آن را تغییر دهید. به همین جهت از تاپل ها برای نگه داری داده های write-protect استفاده می شود و به دلیل تغییرناپذیر بودن، سریع تر از لیست ها عمل می کند. در واقع تاپل ها را می توان به عنوان لیست های فقط خواندنی (read-only) تصور نمود. هم چنین برخلاف لیست ها، اعضای یک تاپل در داخل دو علامت پرانتز محصور می شوند و توسط علامت کاما (,) از هم جدا می شوند.
البته وجود پرانتز الزامی نیست و می توانید یک تاپل را به صورت زیر هم بنویسید منتها عموما تاپل ها را با پرانتز می نویسند.
مزایای تاپل ها
از آن جا که تاپل ها مشابه لیست ها هستند بنابراین هر دو را می توان در موقعیت های مشابهی به کارگرفت اما با این حال، در پیاده سازی تاپل ها نسبت به لیست ها، مزیت هایی وجود دارد که به برخی از آن ها اشاره می کنیم:
- از آن جا که تاپل ها برخلاف لیست ها تغییرناپذیر هستند بنابراین پیمایش آن ها سریع تر از لیست هاست درنتیجه در تاپل ها عملکرد بهتری را نسبت به لیست ها شاهد هستیم.
- اگر داده هایی دارید که نمی خواهید تغییر کنند پیاده سازی آن ها با تاپل ها تضمین می کند که داده هایتان هم چنان فقط خواندنی (write-protected) باقی بمانند.
انواع داده هایی که تاپل ها پشیتیبانی می کنند
تاپل ها می توانند هر تعداد از انواع داده های مختلف (عدد صحیح و اعشاری و لیست و رشته و …) را در خود نگهداری کنند.
مثلا در قطعه کد زیر ابتدا با نوشتن یک پرانتز خالی، یک تاپل خالی ایجاد کرده و آن را چاپ نمودیم. سپس تاپلی ایجاد نموده ایم که فقط اعداد صحیح را در خود جای داده است. در بخش بعدی، تاپلی را ایجاد کردیم که اعضای آن ترکیبی از انواع داده های صحیح و اعشاری و رشته است. و در نهایت با قرار دادن یک تاپل در درون تاپل دیگر، یک تاپل تو در تو ایجاد کردیم.
برای نوشتن تاپلی که تنها یک عضو دارد قرار دادن آن عضو در داخل پرانتز کفایت نمی کند بلکه بایستی آن را با یک علامت کاما تمام کنیم تا نشان دهیم که یک تاپل است چرا که در غیر این صورت پایتون آن را به عنوان یک تاپل در نظر نمی گیرد. به مثال زیر توجه کنید. همان طور که می بینید علی رغم این که tup1 و tup2 دارای یک عضو یکسان هستند اما پایتون با اولین عدد 8 به عنوان عدد صحیحی که صرفا درون یک پرانتز قرار گرفته رفتار می کند حال آن که در tup2 عدد 8 عضو یک تاپل محسوب می شود. همین قضیه در مورد tup3 , tup4 هم برقرار است. در حالت اول رشته “hello” درون متغیری به نام tup3 ریخته می شود در حالی که در حالت دوم، همین رشته به عنوان تنها عضو تاپل tup4 محسوب می شود.
این نکته زمانی بیشتر خود را نشان می دهد که تاپل ها را بدون پرانتز بنویسید. مثلا خود شما هم اگر در مثال زیر جلوی کلمه “hello” علامت کاما را نبینید قطعا خواهید که my_tuple یک متغیر رشته ای است.
تغییر عناصر یک تاپل
تاپل ها هم از همان عملیاتی پشتیبانی می کنند که رشته ها و لیست ها پشتیبانی می کردند.
با این تفاوت که تاپل ها تغییر ناپذیرند و اگر بخواهید عناصر یک تاپل را توسط عملگر انتساب، اصلاح کنید با خطا مواجه خواهید شد.
البته برای تغییر عناصر یک تاپل، راه دیگری وجود دارد و آن جایگزین کردن تاپل موجود با یک تاپل جدید است. مثلا اگر بخواهیم در تاپل tup ، کاراکتر ‘a’ را با کاراکتر ‘X’ جایگزین کنیم به جای استفاده از عملگر انتساب باید به شیوه زیر عمل کنیم : تاپل جدیدی با یک عضو ‘X’ ایجاد می کنیم و آن را توسط عملگر الحاق (+) به عناصر دوم و دوم به بعد تاپل tup (tup[1:] ) پیوند می دهیم و در نهایت این تاپل جدید را در همان تاپل قبلی ذخیره می کنیم.
روش دومی که برای تغییر عناصر یک تاپل وجود دارد این است که ابتدا آن را به یک لیست تبدیل کنید و توسط عملگر انتساب تغییرات مورد نظر خود را اعمال کنید و در نهایت لیست تغییر یافته را مجددا به تاپل تبدیل کنید.
مثلا فرض کنیم که این بار می خواهیم تاپل حاصل شده در مثال قبل را به شکل اولش برگردانیم یعنی کاراکتر ‘X’ را با کاراکتر ‘a’ جایگزین کنیم. خوب ابتدا توسط تابع list، تاپل tup را به لیست تبدیل می کنیم و با همان نام ذخیره می کنیم. برای اطمینان از تبدیل صورت گرفته، می توانید از لیست حاصل شده یک خروجی هم بگیرید. ملاحظه می کنید که علامت پرانتز با علامت آکلاد باز و بسته جایگزین [ ]شده است و این یعنی همان تبدیل تاپل به لیست. از آن جا که لیست ها تغییر پذیرند درنتیجه در این مرحله می توانید براحتی توسط عملگر انتساب، عنصر اول لیست(یعنی ‘X’) را با کاراکتر ‘a’جایگزین کنید. حال که تغییرات خود را اعمال کردید می توانید مجددا این لیست تغییر یافته را توسط تابع tuple به یک تاپل تبدیل کرده و با نام تاپل قبلی ذخیره کنید.
نکته : لازم است بدانید که اگر عناصر یک تاپل از نوع داده های تغییر پذیر مثل لیست باشند آیتم های داخلی این عناصر را می توان تغییر داد. مثلا در کد زیر می بینید که تلاش برای تغییر عنصری با اندیس 3 از تاپل my_tupple (یعنی چهارمین عضو تاپل) منجر به خطا می شود و این درحالیست که به دلیل تغییر پذیر بودن نوع چهارمین داده تاپل، می توان با توسط اندیس گذاری تو در تو، اعضای این لیست درونی را تغییر داد بنابراین در نهایت تاپل بیرونی هم تغییر پیدا می کند.
دسترسی به عناصر یک تاپل
-
اندیس گذاری
در تاپل ها نیز مشابه لیست ها می توان با قرار دادن اندیس عددی در داخل عملگر []، به عنصر مورد نظر دسترسی یافت. این اندیس ها باید عدد صحیح باشند و استفاده از اندیس های اعشاری یا سایر انواع، خطای TypeError را تولید می کند. مثلا یک تاپل با 6 عضو، اندیس های 0 تا 5 خواهد داشت و تلاش برای دسترسی به عنصری خارج از این اندیس ها (6, 7,…) ، منجر به بروز خطای IndexError می شود. هم چنین دسترسی به لیست های تو در تو نیز با استفاده از اندیس گذاری تو در تو امکان پذیر است مثلا در کد tup[2][1] از مثال زیر ، اولین اندیس، تاپل بیرونی را پیمایش می کند و دومین اندیس هم تاپل درونی را.
-
اندیس گذاری منفی
پایتون به شما اجازه می دهد که در لیست ها و تاپل ها از اندیس گذاری منفی هم استفاده کنیم و بتوانید این نوع ساختارهای داده ای را از آخر به اول پیمایش کنید. مثلا اندیس 1- آخرین عنصر تاپل و اندیس 2- عنصر ماقبل آخرین عنصر تاپل را برمی گرداند و همین شیوه اندیس گذاری تا رسیدن به اولین عنصر تاپل ادامه می یابد.
-
قاچ بندی [a:b]
هم چنین می توانید با استفاده از عملگر قاچ بندی (کولن 🙂 بازه ای از عناصر یک تاپل را استخراج کنید. مثلا در قطعه کد زیر، my_tupple[1:4] عناصر موجود در اندیس های 1 و 2و 3 را برمی گرداند و همانند بازه ی ریاضی [a,b) عمل می کند. my_tupple[ : ] هم تمامی عناصر تاپل را برمی گرداند.
انتساب چند تایی
اگر قبلا با سایر زبان های برنامه نویسی هم چون c و c++ و …کار کرده باشید قطعا دیده اید که برای تعویض مقادیر دو متغیر، از یک متغیر کمکی سوم عموما با اسم temp بهره می گرفتیم. مثلا برای تعویض مقدار دو متغیر a و b به شیوه زیر عمل می کردیم. شیوه کار نیز واضح است و نیاز به توضیح ندارد.
اما از آن جا که این شیوه هم تا حدودی خسته کننده است لذا پایتون روشی را تحت عنوان انتساب چندتایی (tuple assignment) جایگزین شیوه بالا نموده است. همان طور که در مثال زیر می بینید اولین مقدار به اولین متغیر و دومین مقدار به دومین متغیر، منتسب می شود و در نهایت می بینید که مقدار دو متغیر a و b با هم عوض شده است.
نکته : در این شیوه، اگر در سمت راست عملگر انتساب، عبارات محاسباتی و .. قرار داشته باشند قبل از انتساب، همه این عبارات ارزیابی شده و نتیجه در متغیرهای مربوطه ریخته می شود. علاوه بر این، تعداد متغیرهای سمت چپ عملگر انتساب باید با تعداد مقادیر سمت راست عملگر انتساب برابر باشد. عدم رعایت این اصل، منجر به بروز خطای ValueError می شود.
کارکرد عملگرهای + و * در مورد تاپل ها
این عملگر ها همان کاری را روی تاپل ها انجام می دهند که بر روی لیست ها انجام می دادند یعنی عملگر + برای الحاق تاپل ها به یکدیگر و عملگر * برای تکرار تاپل ها به تعداد تعیین شده، به کار گرفته می شوند.
عملگر in و not in
و باز هم مشابه لیست ها و رشته ها از عملگرهای in و in not برای تست عضویت یا عدم عضویت عنصری در یک تاپل استفاده می شود.
پیمایش عناصر یک تاپل
با استفاده از حلقه for می توان عناصر یک تاپل را نیز پیمایش نموده و عملیات مورد نظرمان را روی آنها انجام دهیم.
حذف تاپل
همان طور که در بخش قبل گفتیم اعضای یک تاپل را نمی توان تغییر داد این گفته به این معناست که امکان پاک یا حذف نمودن عناصر یک تاپل وجود ندارد (منجر به خطای TypeError می شود) اما با این حال می توانید کل یک تاپل را با کلمه کلیدی del حذف نمود. همان طور که می بینید تلاش برای دسترسی به تاپلی که حذف شده، خطای NameError را تولید می کند.
متدهای موجود برای تاپل ها
از آن جا که تاپل ها ساختارهای داده ای تغییر پذیر نیستند بنابراین متدهای حذف و اضافه عناصر برای تاپل ها در دسترس نیست و تنها می توان به توابع زیر اشاره نمود:
count(x) : تعداد تکرار آیتم x را در تاپل مربوطه مشخص می کند.
index(x) : اندیس اولین آیتم x از تاپل مربوطه را برمی گرداند مثلا اگر چندین نمونه از آیتم x در تاپل وجود داشته باشد این تابع اندیس اولین آیتم x را برمی گرداند.
توابع درون ساخته قابل دسترس برای تاپل ها
Len(): طول یک تاپل و در واقع تعداد آیتم های موجود در تاپل را برمی گرداند.
min() و max(): به ترتیب کوچک ترین و بزرگ ترین آیتم یک تاپل را برمی گردانند (بیشتر در مورد تاپل های عددی به درد می خورد)
sum(): مجموع عناصر یک تاپل را برمی گرداند (بیشتر در مورد تاپل های عددی به درد می خورد)
sorted(): یک تاپل را دریافت کرده و یک لیست مرتب شده از عناصر همان تاپل را برمی گرداند.
tuple(): ساختارهای داده ای دیگر مثل رشته، لیست ، مجموعه و دیکشنری را دریافت کرده و به یک تاپل تبدیل می کند. مثلا در قطعه کد زیر می بینید که این تابع یک دیکشنری را دریافت کرده و آن را به تاپلی تبدیل می کند که عناصرش، کلیدهای دیکشنری هستند.
امیدواریم مطالب این مقاله در مورد تاپل ها در پایتون مورد توجه شما قرار گرفته باشد. در ادامه آموزش زبان برنامه نویسی پایتون با ما همراه باشید.
مقاله بعدی: دیکشنری و نحوه ایجاد آن در زبان برنامه نویسی پایتون
ترجمه: رقیه آقایاری
نظر شما چیست؟