پایتون کلید ورود به دنیای هوش مصنوعی! (گام دوم- قسمت سیزدهم: تاپل ها)

برای ورود به دنیای هوش مصنوعی نیازه که اول پایتون رو به عنوان ابزار قدرتمند بلد باشیم اگه تازه می خوای شروع کنی کافی از این لینک برای سراغ مقدمات آموزش پایتون. در گام اول آموزش در مورد مباحث مقدماتی آموزش پایتون صحبت کردیم.

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

خصوصیات تاپل ها به لیست ها نزدیکه و به همین خاطر کار باهاشون راحته اگه هیچی راجبشون نمی دونی در درس چهارم راجبش صحبت کردیم که اینجا می تونی بخونی.

المان های یک تاپل‌ با کاما (,) از هم جدا می‌شن:

t =1, 2, 3

شما می تونید برای تشخیص راحت و زیبایی کدتون از پرانتز ( ) استفاده کنین و داده‌ها رو داخل پرانتز قرار بدین اما به این نکته توجه کنید که علامت ( ) نشان‌دهندۀ تاپل بودن داده نیست. ولی بهتره که پرانتزو بذارین.

t = (1, 2, 3)

برای ساختن تاپل تک عضوی باید به صورت پایین عمل کنیم:

t1 = 3,            # اين يک داده از نوع تاپل است

t2 = 3            # اين يک متغیر ساده است

t2 = (3,)         # اين يک داده از نوع تاپل است

t2 = (3)         # اين يک متغیر ساده است

اگر بخواهیم یک تاپل خالی داشته باشیم از ( ) استفاده می کنیم مثله:

t0 = ( )

یه راه دیگه واسه ساختن تاپل اینه که از طریق توابع توکار تاپل رو بسازیم مثلا:

t = tuple('lupins')
 print(t)           # ('l', 'u', 'p', 'i', 'n', 's')
 t = tuple(range(3))
 print(t)          # (0, 1, 2)

تغییرناپذیری تاپل­ ها- immutable

تاپل ها از نوع داده‌های immutable هستن. یعنی تغییرناپذیرند و شما نمی‌تونید مقادیر آن‌ها را ویرایش کنین. مقادیر اولیه که برای تاپل­ ها تعیین می‌کنید، تا موقعی که ما تاپل رو حذف کنیم یا تا آخر برنامه ثابت باقی میمونن و قابل تغییر نیستن.

مثلا:

>>> t = (1, 4, 9)
 >>> t[0] = 2
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 TypeError: 'tuple' object does not support item assignment

همانطور که توی مثال نشون داده شده وقتی خواستیم تاپل رو تغییر بدیم خطا گرفته !

اما یک راهی برای تغییر تاپل وجود داره. می­تونیم اول تاپل رو به لیست تبدیل کنیم بعد تغییرش بدیم و دوباره به تاپل تبدیل کنیم.

اول اومدیم تاپل رو تبدیل به لیست کردیم بعد مقدار رو تغییر دادیم دوباره لیست رو تبدیل به تاپل کردیم:

x = ("apple", "banana", "cherry")
y = list(x)
y[1] = "kiwi"
x = tuple(y)
print(x)

البته یه کار دیگه هم می تونیم انجام بدیم. از =+ استفاده کنیم. چون اینجوری خود تاپل رو تغییر نمیدیم و یک تاپل جدید می سازیم که شامل تاپل قبلی هم هست:

>>> t = (1, 2)
>>> q = t
>>> t += (3, 4)
>>> t
(1, 2, 3, 4)
>>> q
(1, 2)

با این کار در واقع یه تاپل جدید ایجاد کردیم ولی تاپل قبلی تغییری نکرده.


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

یک تاپل به اسم t تعریف کردیم که سه تا عدد داخلشه.

t = (1, 2, 3)

کد زیر تاپل رو پرینت می­کنه(خروجی ازش می گیریم):

>>> t
(1, 2, 3)
>>> print(t)
(1, 2, 3)

برای دسترسی به مقادیر در یک تاپل از اسم تاپل به همراه شماره اندیس (index) آن استفاده می‌کنیم. مثل کد زیر عنصر اول رو پرینت می­کنه:

print(t [0])

کد زیر عنصر دوم تا آخر رو پرینت می­کنه:

print(t [1:])

عمل Packing و Unpacking تاپل ها

وقتی می نویسیم t =1, 2, 3 و مقادیر 3 ,2 ,1 رو به t نسبت میدیم، اسم این کار packing هست. چون داریم مقادیرمون رو تو یک تاپل pack می کنیم بسته بندی می کنیم.

حالا برای unpack کردن مقادیر می تونیم مثل پایین عمل کنیم دو واقع داریم یکی یکی عدد های ۱ و۲ و۳ رو به متغیر های X و y و z نسبت می دهیم:

x, y, z = (1, 2, 3)
# x == 1
# y == 2
# z == 3

اگر فقط بعضی از مقادیر تاپل رو نیاز داشته باشیم می تونیم از نماد _ استفاده کنیم یعنی با این نماد در نظرشون نمی گیریم:

a = 1, 2, 3, 4
_, x, y, _ = a
# x == 2
# y == 3

حذف المان های یک تاپل

حذف المان های یک تاپل به صورت تکی نمیشه چرا؟!.

اما با دستور del می تونیم تاپل رو به طور کلی حذف کنیم:

tup = 1, 2, 3
del tup;

توابع داخلی تاپل ها

مقایسه Comparison

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

tuple1 = ('a', 'b', 'c', 'd', 'e')
tuple2 = ('1','2','3')
tuple3 = ('a', 'b', 'c', 'd', 'e')
cmp(tuple1, tuple2)
out: 1
cmp(tuple2, tuple1)
out: -1
cmp(tuple1, tuple3)
out: 0

اگر تاپل اول از تاپل دوم بیشتر باشه، خروجی 1 میشه. اگر تاپل اول از تاپل دوم کمتر باشه، خروجی 1- میشه. اگر هر دو تاپل یکی باشن خروجی 0 میشه.


طول تاپل Length

دستور len طول تاپل یعنی تعداد کل المان های تاپل رو برمی­گردونه:

len(tuple1)
out: 5


ماکسیمم در تاپل Max

آیتمی که بیشترین مقدار رو بین المان های تاپل داره برمی گردونه:

max(tuple1)
out: 'e'
max(tuple2)
out: '3'


مینیمم در تاپل Min

اینم که واضحه! آیتمی که کمترین مقدار رو بین المان های تاپل داره برمی گردونه:

min(tuple1)
out: 'a'
min(tuple2)
out: '1'


تبدیل لیست به تاپل

تبدیل لیست به تاپل به همین راحتیه:

list = [1,2,3,4,5]
tuple(list)
Out: (1, 2, 3, 4, 5)


متصل کردن دو تاپل concatenation

از عملگر + برای متصل کردن دو تاپل یا بیشتر استفاده می­ کنیم:

tuple1 + tuple2
 out: ('a', 'b', 'c', 'd', 'e', '1', '2', '3')

تاپل ها hashable و equatable هستند

قبل این که وارد بحث hashable بشیم، می خوام به طور خلاصه راجع به hash و hashing توضیح بدم که اصلا چی هستن؟ hashing یه مفهوم تو علوم کامپیوتره که برای بالا بردن کارایی، ساختمان داده هایی با دسترسی تصادفی که در اون حجم زیادی از داده ها ذخیره و به سرعت قابل دسترسی هستن،استفاده میشه. hash: به پیاده سازی تابع hash روی اطلاعات ورودی با اندازه دلخواه می‌گویند که خروجی با طول مشخص و ثابتی داره، که بدون کد مشخص از آن هیچ اطلاعاتی را نمی‌توان بازیابی کرد. حالا تابع hash چیه؟ به هر تابعی که اطلاعات با اندازه دلخواه را به اطلاعاتی با اندازه ثابت، آدرس دهی کند تابع hash می‌گویند.

داده هایی Hashable هستند که مقدار Hash آن ها در طول عمرشون تغییر نکنه و بتونیم با عناصر دیگه مقایسون کنیم. برای مقایسه هم باید مقدار hash آن ها یکسان باشه. اگر همۀ اعضای تاپل Hashable باشن تاپل Hashable میشه. hashable و Equatable دست به دست هم میدن تا ما بتونیم دو تا عنصر رو با هم مقایسه کنیم.

hash( (1, 2) )                   #  هست hashable # ok
hash( ([ ], {"hello"})        # not ok

دومی Hashable نیست، چون لیست و مجموعه Hashable نیستن.

اندیس گذاری تاپل Indexing

اندیس در تاپل ها از صفر شروع میشه:

x = (1, 2, 3)
 x[0]         # 1
 x[1]         # 2
 x[2]         # 3
 x[3]         # IndexError: tuple index out of range

با اعداد منفی هم میشه اندیس ­گذاری کرد. اندیس آخرین عنصر میشه 1- ، قبلی 2- ، ... تا برسه به اولین عنصر یعنی اندیس منفی یک نشون دهنده عدد سه هست :

x[-1]  # 3
 x[-2]  # 2
 x[-3]  # 1
 x[-4]  # IndexError: tuple index out of range

می­تونیم داخل یک محدوده اندیس ­گذاری کنیم:

print(x[:-1])  # (1, 2)
 print(x[-1:])  # (3,)
 print(x[1:3])  # (2, 3)

وارونه کردن المان ها Reversing

برای وارونه کردن المان ها تو یک تاپل به صورت زیر عمل می کنیم:

colors = "red", "green", "blue"
 rev = colors[::-1]
 # rev: ("blue", "green", "red")
 colors = rev
 # colors: ("blue", "green", "red")

یا:

rev = tuple(reversed(colors))
 # rev: ("blue", "green", "red")
 colors = rev 
 # colors: ("blue", "green", "red")

حرف آخر

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

اگر سوالی داشتید کامنت کنید