مقدمه

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

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

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

Copy Icon tuples.py
dimensions = (200, 50) 
print(dimensions[0]) 
print(dimensions[1])

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

200
50
          

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

Copy Icon tuples.py
dimensions = (200, 50) 
dimensions[0] = 250

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

Traceback (most recent call last): 
File "tuples.py", line 2, in 
  dimensions[0] = 250 
TypeError: 'tuple' object does not support item assignment
          

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

Copy Icon tuples.py
dimensions = (200, 50)
print(dimensions)
            
dimensions = (400, 100)
print(dimensions)

اگر این کد را اجرا کنید، نتیجه‌ی زیر را مشاهده خواهید کرد.

(200, 50)
(400, 100)
          

از نظر فنی، تاپل‌ها با استفاده از کاما ساخته می شوند و نیازی به پرانتز نیست اما افزودن پرانتز باعث می‌شود که تاپل‌ها آشناتر به نظر برسند و خواناتر باشند. در ضمن، یک تاپل که فقط شامل یک عنصر باشد به صورت (element,) ساخته می‌شود. برای مثال (3,) یک تاپل تک‌عضوی است که فقط شامل یک مقدار عددی است. البته ساخت یک تاپل تک‌عضوی چیزی نیست که خیلی معنایی داشته باشد اما این احتمال هنگامی که تاپل به صورت خودکار ساخته می‌شود، وجود دارد.

عملگر اسلایس ( : ) که بخشی از یک کالکشن را استخراج می‌کند، روی تاپل‌ها هم کار می‌کند. نحوه‌ی استفاده از این عملگر روی تاپل‌ها کاملاً مشابه لیست‌هاست و هیچ تفاوتی ندارد.

پیمایش تاپل‌ها با حلقه for

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

Copy Icon slices.py
my_tuple = (1, 2, 3, 4)
for item in my_tuple:
  print(item)

در نتیجه‌ی اجرای این کد، اعداد 1 تا 4 چاپ می‌شوند.

1
2
3
4
          

برای تبدیل سایر کالکشن‌ها (از جمله لیست‌ها) به تاپل، می‌توانیم از تابعی به نام tuple() استفاده کنیم. کافیست کالکشن مورد نظر را به عنوان آرگومان به این متد پاس کنیم. یادآوری می‌کنم که برای لیست‌ها هم تابعی با نام list() همین کار را انجام می‌دهد.

Copy Icon tuples.py
my_list = [1, 2, 3]
my_tuple = tuple(my_list)
print(my_tuple)

نتیجه‌ی اجرای این کد به صورت زیر خواهد بود.

(1, 2, 3)