# تاپل پایتون چیست؟
پایتون نوع دیگری را ارائه می دهد که مجموعه ای مرتب شده از اشیاء است که تاپل نامیده می شود. تاپل ها از همه جهات با لیست ها یکسان هستند، به جز ویژگی های زیر:
- تاپل ها با قرار دادن عناصر در پرانتز () به جای براکت [] تعریف می شوند.
- تاپل ها تغییر ناپذیرند.
در اینجا یک مثال کوتاه وجود دارد که تعریف تاپل، ایندکس و برش را نشان می دهد:
>>> t = ('foo', 'bar', 'baz', 'qux', 'quux', 'corge')
>>> t
('foo', 'bar', 'baz', 'qux', 'quux', 'corge')
>>> t[0]
'foo'
>>> t[-1]
'corge'
>>> t[1::2]
('bar', 'qux', 'corge')
حتی اگر تاپل ها با استفاده از پرانتز تعریف می شوند، شما هنوز هم مانند رشته ها و لیست ها، تاپل ها را با استفاده از براکت ها ایندکس و برش می دهید. مکانیسم تغییر برعکس رشته و لیست برای تاپل ها نیز کار می کند:
>>> t[::-1]
('corge', 'quux', 'qux', 'baz', 'bar', 'foo')
همه چیزهایی که در مورد لیست ها یاد گرفته اید - آنها مرتب شده اند، می توانند حاوی اشیاء دلخواه باشند، می توانند فهرست بندی و تکه تکه شوند، می توانند تودرتو شوند - در مورد تاپل ها نیز صادق است. اما آنها را نمی توان اصلاح کرد:
>>> t = ('foo', 'bar', 'baz', 'qux', 'quux', 'corge')
>>> t[2] = 'Bark!'
Traceback (most recent call last):
File "<pyshell#65>", line 1, in <module>
t[2] = 'Bark!'
TypeError: 'tuple' object does not support item assignment
چرا به جای لیست از تاپل استفاده کنیم؟
- اجرای برنامه هنگام دستکاری یک تاپل سریعتر از لیست معادل آن است.
- گاهی اوقات نمی خواهید داده ها اصلاح شوند. اگر قرار است مقادیر موجود در مجموعه در طول عمر برنامه ثابت بمانند، استفاده از یک تاپل به جای لیست از تغییرات تصادفی محافظت می کند.
در یک REPL پایتون، می توانید مقادیر چندین شی را به طور همزمان با وارد کردن مستقیم آنها در اعلان >>>، که با کاما از هم جدا شده اند، نمایش دهید:
>>> a = 'foo'
>>> b = 42
>>> a, 3.14159, b
('foo', 3.14159, 42)
پایتون پاسخ را در پرانتز نمایش می دهد زیرا به طور ضمنی ورودی را به صورت یک تاپل تفسیر می کند.
یک ویژگی در مورد تعریف تاپل وجود دارد که باید از آن آگاه باشید. هیچ ابهامی در تعریف یک تاپل خالی وجود ندارد، و نه یکی با دو یا چند عنصر. پایتون می داند که شما در حال تعریف یک تاپل هستید:
>>> t = ()
>>> type(t)
<class 'tuple'>
>>> t = (1, 2)
>>> type(t)
<class 'tuple'>
>>> t = (1, 2, 3, 4, 5)
>>> type(t)
<class 'tuple'>
اما چه اتفاقی میافتد وقتی میخواهید یک تاپل را با یک آیتم تعریف کنید:
>>> t = (2)
>>> type(t)
<class 'int'>
از آنجایی که از پرانتز برای تعریف اولویت عملگر در عبارات نیز استفاده می شود، پایتون عبارت (2) را صرفاً به عنوان عدد صحیح 2 ارزیابی می کند و یک شی int ایجاد می کند. برای اینکه به پایتون بگویید که واقعاً میخواهید یک تاپل تکتنه تعریف کنید، یک کاما انتهایی (,) را درست قبل از پرانتز پایانی قرار دهید:
>>> t = (2,)
>>> type(t)
<class 'tuple'>
>>> t[0]
2
>>> t[-1]
2
احتمالاً نیازی به تعریف یک تاپل تک قلو ندارید، اما باید راهی وجود داشته باشد.
وقتی یک تاپل تک تنی را نمایش می دهید، پایتون کاما را اضافه می کند تا به شما یادآوری کند که تاپل است:
>>> print(t)
(2,)
همانطور که قبلاً در بالا مشاهده کردید، یک تاپل حاوی چندین آیتم را می توان به یک شی اختصاص داد:
>>> t = ('foo', 'bar', 'baz', 'qux')
وقتی این اتفاق میافتد، به این صورت است که اقلام موجود در تاپل در شیء «بستهبندی» شدهاند:
>>> t
('foo', 'bar', 'baz', 'qux')
>>> t[0]
'foo'
>>> t[-1]
'qux'
اگر آن شی «بستهبندی شده» متعاقباً به یک تاپل جدید اختصاص داده شود، آیتمهای جداگانه در اشیای تاپل «بازگشایی» میشوند:
>>> (s1, s2, s3, s4) = t
>>> s1
'foo'
>>> s2
'bar'
>>> s3
'baz'
>>> s4
'qux'
هنگام باز کردن بسته بندی، تعداد متغیرهای سمت چپ باید با تعداد مقادیر موجود در تاپل مطابقت داشته باشد:
>>> (s1, s2, s3) = t
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
(s1, s2, s3) = t
ValueError: too many values to unpack (expected 3)
>>> (s1, s2, s3, s4, s5) = t
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
(s1, s2, s3, s4, s5) = t
ValueError: not enough values to unpack (expected 5, got 4)
بسته بندی و باز کردن بسته بندی را می توان در یک عبارت ترکیب کرد تا یک تخصیص ترکیبی ایجاد شود:
>>> (s1, s2, s3, s4) = ('foo', 'bar', 'baz', 'qux')
>>> s1
'foo'
>>> s2
'bar'
>>> s3
'baz'
>>> s4
'qux'
مجدداً، تعداد عناصر موجود در تاپل در سمت چپ تخصیص باید با عدد سمت راست برابر باشد:
>>> (s1, s2, s3, s4, s5) = ('foo', 'bar', 'baz', 'qux')
Traceback (most recent call last):
File "<pyshell#63>", line 1, in <module>
(s1, s2, s3, s4, s5) = ('foo', 'bar', 'baz', 'qux')
ValueError: not enough values to unpack (expected 5, got 4)
در انتسابی مانند این و تعداد کمی از موقعیتهای دیگر، پایتون اجازه میدهد پرانتزهایی که معمولاً برای نشان دادن یک تاپل استفاده میشوند کنار گذاشته شوند:
>>> t = 1, 2, 3
>>> t
(1, 2, 3)
>>> x1, x2, x3 = t
>>> x1, x2, x3
(1, 2, 3)
>>> x1, x2, x3 = 4, 5, 6
>>> x1, x2, x3
(4, 5, 6)
>>> t = 2,
>>> t
(2,)
چه پرانتزها گنجانده شوند یا نه، یکسان عمل می کند، بنابراین اگر در مورد نیاز بودن آنها شک دارید، ادامه دهید و آنها را وارد کنید.
تخصیص تاپل اجازه می دهد تا کمی عجیب از Python اصطلاحی را ارائه دهید. اغلب هنگام برنامه نویسی، دو متغیر دارید که باید مقادیر آنها را عوض کنید. در اکثر زبان های برنامه نویسی، لازم است یکی از مقادیر در یک متغیر موقت ذخیره شود، در حالی که swap به صورت زیر انجام می شود:
>>> a = 'foo'
>>> b = 'bar'
>>> a, b
('foo', 'bar')
>>># We need to define a temp variable to accomplish the swap.
>>> temp = a
>>> a = b
>>> b = temp
>>> a, b
('bar', 'foo')
در پایتون، مبادله را می توان با یک انتساب تاپل انجام داد:
>>> a = 'foo'
>>> b = 'bar'
>>> a, b
('foo', 'bar')
>>># Magic time!
>>> a, b = b, a
>>> a, b
('bar', 'foo')
همانطور که هر کسی که مجبور شده است مقادیر را با استفاده از یک متغیر موقت مبادله کند، میداند، توانایی انجام این کار در پایتون اوج دستاورد فناوری مدرن است. هرگز بهتر از این نخواهد شد.
ارسال نظر