سلام به دوستان عزیز
قسمت دوازدهم آموزش پایتون
همونطور که در پست بالا گفته بودیم تواین پست میخواهیم درباره ی انواع ساختمان داده*ها در پایتون بحث کنیم. دوستان این مبحث چون خیلی مهم هست نمیخوام به طور مختصر توضیح بدم برای همین از توضیحات دوست خوبم آقای مهدی بیاضی در مورد ساختمان داده*ها در پایتون استفاده میکنیم.
ساختمان داده چیست؟
در اصطلح کامپیوتری، ساختمان داده به روشهایی از ذخیره اطلعات گفته می شود که برای استفادهبهینه از اطلعات ذخیره شده اتخاذ می شود. غالبا ًانتخاب یک ساختمان داده موجب ایجاد الگوریتم (الخوارزمی) های متناسب با آن خواهد شد که این دو در کنار هم موجب افزایش سرعت انجام یکوظیفه یا کاهش مصرف حافظه برای پردازش داده می شود؛ سنگ بنای ساختمان های داده انواع دادهو اشاره گرهای گوناگون است. که با توجه به چگونگی تعریف کاربرد آنها در هر زبان برنامه نویسی پیاده سازی آنها متفاوت خواهد بود. ما اکنون به پیاده سازی ساختمان های داده نمی پردازیم بلکه به توضیح انواع داده موجود در زبان پایتون می پردازیم؛ به دلیل سطح بالی این زبان انواع داده موجوددر آن دارای ساختار پیچیده ای هستند که باعث شد ماازاین انواع به عنوان ساختمانهای داده یاد کنیم. در زبان های سطح پایین تر که اکثر آنها از پایه های پایتون به حساب می آیند انواع داده پیش فرض انواعی ابتدایی هستند که در زبان اسمبلی نیز قابل تعریف هستند. مثل ً در زبان Cاز انواع int,char,float, double, long ,shortاستفاده می شود که همه آنها دارای خاصیتی مشترک هستند و این خاصیت این است که بر روی پردازنده به طور مستقیم دارای دستور العمل هایی هستند که می توان باآنهاکار کرد. همچنین برای ایجاد یک زنجیره)آرایه( از این انواع از علمت "[]" استفاده می شد، ولی ازاین انواع داده غیر از عملیات ریاضی کاری بر نمی آید ، مگر اینکه از آنها با قرار دادهای خاصی ساختمان داده هایی بسازیم.
انواع ساختمان داده در پایتون:
1
.یکی از مهمترین و پرکاربرد ترین این ساختمان های داده رشته های کاراکتری می باشند که در واقع یک زنجیره ) (Sequenceاز بایت ها می باشند که درکار با ورودی ها، خروجی ها و ارتباطات گوناگون نقش مهمی ایفا می کنند، زیرا یکی از راههای محدود فهم انسان از دنیای کامپیوتر ارتباط متنی با این جهان می باشد.
2.دیگر ساختمان داده ای مهم در این زبان لیست ها (آرایه ها) هستند. در واقع این نوع داده یک نوع بسیار پیشرفته از آرایه های زبانهای سطح پایین است که علاوه بر خاصیت اندیس پذیری ، خاصیت تغییر اندازه و نگهداری انواع داده را بطور هم زمان دارا می باشد.
3.چند تایی های مرتب ((Tupleدر پایتون نوعی از داده با شباهت هایی به لیست می باشد که در بخش مربوطه به تفاوت ها و شباهت های این دو نوع خواهیم پرداخت.
4. یک نوع دیگر داده در پایتون چرخنده((Iteratorاست که به عنوان یک فریم یا واحد چرخنده در طول لیست ها ، چند تایی ها و رشته ها محسوب می شود.
ساختمان داده های دیگر:
در جملات فوقالذکر مشاهده کردید که ما با تعداد محدودی ساختمان داده روبرو هستیم. اما ما مجبورنیستیم که با این ساختمان داده ها بسوزیم و بسازیم. بلکه این ساختمانهای داده سنگ بنای چندین ساختمان داده دیگر هستند که هر کدام کاربرد و پیچیدگیهای خاص خود را دارند از آنجمله می توان موارد زیر را نام برد:
1.لیست های پیوندی
1.یکطرفه
2.دوطرفه
3.حلقوی
2.صف ها
1.صف های دو طرفه
2.صفهای با اولویت
3.درختها
1.دودویی
2.دودویی جستجو
3.درختهای دو-سه
و موارد بسیاری که در مورد آنها مقاله هایی گذاشته خواهد شد....
لیست ها:
لیست ها نوعی متغیر می باشند که می توان در آن ها داده ها و اطلاعات از انواع مختلف را ذخیره کرد به طور مثال در کد زیر لیستی به نام L طراحی شده است که در آن یک متغیر از نوع رشته یا string و یک float یا عدد اعشاری و یک integer یا عدد صحیح در آن وجود دارد
کد PHP:
>>>L=[ 'mahdy' , 20 , 1.2 ]
دسترسی به داده های درون لیست :
در هر لیست هر کدام از داده ها یا مقدار ها دارای شماره یا اندیسی می باشند که این عدد به طور خودکار از سمت چپ لیست به هر مقدار داده می شود عدد اندیس بین صفر و بی نهایت است و به ترتیب از چپ به راست به مقدار های درون لیست داده می شود.
کد PHP:
[ 'mahdy' , 20 , 1.2 ]
در مثال بالا رشته ی 'mahdy' با اندیس 0 و عدد 20 با اندیس 1 و عدد اعشاری 1.2 با اندیس 2 مشخص می شوند برای بدست آوردن داده ی یک اندیس کافی است فقط اندیس مورد نظر را درون [] جلوی نام لیست قرار دهیم.
کد PHP:
>>>L=[ 'mahdy' , 20 , 1.2 ]
>>>L[1]
20
باید دانست که همیشه لیست ها همانند نمونه بالا ساده نیستند و ممکن است یک لیست درون لیست دیگری قرار داشته باشد. برای دستیابی به داده ی لیست درونی تر باید از روش پیچیده تری استفاده نمایید. برای روشنتر شدن مطلب لطفا به مثال زیر توجه کنید:
کد PHP:
>>>L=[ 'mahdy' , 20 , [ 'ali' , 99 ] , 1.2]
>>>L[2][0]
'ali'
در مثال بالا دیدید که اندیس اول([2]L) به داده ای اشاره دارد که خود یک لیست می باشد([ ali' , 99' ]) و اندیس دوم ([0][2]L)به داده ی درون این لیست اشاره دارد('ali'). این روش قابل تعمیم به لیست هایی با پیچیدگی بیشتر است.
نکته 1: اگر درون [] عبارت محاسبه ای قرار بگیرد ابتدا عبارت محاسبه می شود و سپس بقیه عملیات طبق روال توضیح داده شده در بالا انجام می پذیرند. ن
کته 2: اگر اندیس قرار گرفته در [] در محدوده شماره ی اندیس ها نباشد پیغام خطا ظاهر می شود.
نکته 3: از خواص لیست ها انتساب هر یک از داده های درون لیست به متغیرهایی است که همگی تشکیل یک لیست می دهند.
نکته 4: در شماره گزاری اندیس ها درلیست برنامه نویس دخیل نیست بدین ترتیب که می توان از راست به چپ هم به داده ها درون لیست دسترسی داشت. در این صورت اندیس از -1 شروع شده و به صورت نزولی اندیسها شماره گزاری میشوند.البته انتخاب هر روش به دلخواه برنامه نویس است.
نکته 5: فقط اپراتورهای + و * بر روی لیست ها تعریف شده اند که اپراتور + بین یک لیست و لیستی دیگر تعریف شده و اپراتور * بین یک لیست و یک عدد تعریف شده است که نیازی به توضیح بیشتر نیست.
دسترسی به مجموعه ای از داده های درون لیست:
خوب شاید ما بخواهیم به چندتا از داده های درون لیست دسترسی داشته باشیم برای این کار به جای [] از [:] استفاده می کنیم به مثال زیر توجه کنید.
کد PHP:
>>>L=[ 'mahdy' , 'ali' , 100 , 99 , 'reza' , 20 ]
>>>L[1:5]
['ali', 100, 99, 'reza']
خوب دیدید که L[1:5] از داده ای که اندیسش 1 است تا ماقبل 5 را درون یک لیست قرار میدهد نکته1:اگر در سمت راست علامت : عددی بیشتر از محدوده قرار بگیرد یا عددی نوشته نشود پیغام خطایی ظاهر نمی شود بلکه تا آخرین خانه ی لیست در نظر گرفته می شود و برعکس. نکته2:اگر شماره طوری باشند که از چپ به راست آخرین داده برابر یا قبل از داده ی اولی باشد حاصل یک لیست تهی است .
کد PHP:
>>>L=[ 'mahdy' , 'ali' , 100 , 99 , 'reza' , 20 ]
>>>L[1:]
[ 'ali' , 100 , 99 , 'reza' , 20 ]
>>>L[1:1]
[]
تغییر مقادیر درون لیست:
خوب لیست ها از داده های تغییر پذیرند و می توان با استفاده از عمل انتساب (=) مقادیر یک لیست را تغییر داد
کد PHP:
>>>L=[ 'mahdy' , 'ali' , 100 , 99 , 'reza' , 20 ]
>>>L[1] = 'boys'
>>>L[1]
'boys'
>>>L
['mahdy' , 'boys' , 100 , 99 , 'reza' , 20 ]
اضافه کردن داده در لیست:
بدون استفاده از عملیات محاسباتی می توان داده ای را به لیست اضافه کرد
کد PHP:
>>>L=[ 1 , 2 , 3 ]
>>>L[3:3] = [4]
>>>L
[ 1 , 2 , 3 , 4 ]
حذف داده از لیست :
برای حذف داده می توانیم از عمل انتساب استفاده کنیم بدین ترتیب که داده را به [] انتساب بدهیم
کد PHP:
>>>L=[ 1 , 2 , 3 , 4 ]
>>>L[1:2] = []
>>>L
[ 1 , 3 , 4 ]
نكته مهم در اين قسمت اين است كه L[1:2] تنها بخشي از ليست را حذف مي كند كه انديس آن 1 است . حال اگر بنويسم L[0:2] بخشهايي كه انديس آن 0 و 1 است حذف مي شود . يعني پارامترهاي ما از ابتدا تا قبل از انتها با استفاده از دستور del می توان هر داده یا کل لیست را حذف کرد
متدهای مهم لیست (با فرض اینکه L لیست باشد) :
۱ L.append(x) داده ی x را به انتهای لیست L اضافه کن
۲ L.remove(x) داده ی x را از لیست L حذف کن
۳ L.index(x) اندیس x در لیست L را برمی گرداند
۴ L.count(x) تعداد دفعات تکرار x را در لیست L را برمی گرداند
۵ L.extend(x) لیست x را با لیست L الحاق می کند
۶ L.insert(I,x) داده ی x را درشماره اندیس I به لیست اضافه می کند
یا علی