بهنام خالق خِرد مبانی برنامه سازی F UNDAMENTALS OF P ROGRAMMING مدرس : بینظیر بیگلری جلسه :11 لیستها نیمسال دوم 1392-1393 مبانی برنامهسازی - دانشگاه صنعتی شریف عناوین 2 آدرسدهی.
Download
Report
Transcript بهنام خالق خِرد مبانی برنامه سازی F UNDAMENTALS OF P ROGRAMMING مدرس : بینظیر بیگلری جلسه :11 لیستها نیمسال دوم 1392-1393 مبانی برنامهسازی - دانشگاه صنعتی شریف عناوین 2 آدرسدهی.
بهنام خالق خِرد
مبانی برنامه سازی
F UNDAMENTALS OF P ROGRAMMING
مدرس :بینظیر بیگلری
جلسه :11لیستها
نیمسال دوم 1392-1393
مبانی برنامهسازی -دانشگاه صنعتی
شریف
عناوین
2
آدرسدهی و برش لیستها
تغییر لیستها
توابع و متدهای لیستی
لیستهای تودرتو
ماتریسها
چندتاییها (فصل )9
(فصل 9و 11از کتاب اصلی)
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
لیست ها
3
یک لیست مجموعهای از مقادیر مرتب است به این مقادیر ،اعضا ( )elementیا آیتمها
میگویند .لیستها مانند رشتهها هستند به جز اینکه اعضای لیست میتوانند هر نوعی
باشند؛ به لیستها و رشتهها دنباله ( )sequenceمیگویند.
راههای مختلفی برای ایجاد یک لیست جدید وجود دارد و آسانترین راه ،ذکر هر عضو
در بین یک جفت کروشه است.
به لیستی که عضوی از یک لیست است تودرتو میگویند.
یک لیست بدون عضو ،یک لیست خالی است ][.
یک لیست را میتوان به متغیر تخصیص داد یا به عنوان پارامتر به تابع فرستاد.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
دسترسی به اعضا
4
گرامر دستیابی به اعضای یک لیست مثل دستیابی به کاراکترهای یک رشته توسط
عملگر اندیس است که با یک عدد صحیح مشخص میشود.
به انتخاب تکتک اعضای لیست و انجام عمل مشخصی روی آنها در یک حلقهloop ،
teraversalمیگویند.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
طول لیست
5
تابع lenطول یک لیست را برمیگرداند که برابر است با تعداد اعضای لیست .وقتی در
یک حلقه میخواهید توسط اندیس به اعضای آن دسترسی داشته باشید خوب است این
تابع را به عنوان حد باالی تکرار حلقه ،به جای استفاده از یک عدد ثابت بهکار گیرید
که اگر اندازه لیست تغییر کرد الزم نباشد حلقه را تغییر دهید.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
عضویت در لیست
6
عملگرهای بولی inو not inعضویت را در دنباله کنترل میکنند.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
عملگرهای لیست
7
عملگر +دو یا چند لیست را به هم میچسباند (الحاق میکند)
به طور مشابه عملگر * اعضای یک لیست را به تعداد عدد مشخص شده در یک لیست
جدید تکرار میکند.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
برش های لیست
8
همانطور که قبلا در مورد رشتهها دیدید با استفاده از برشها میتوان با زیررشتهها
کار کرد:
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
تغییرپذیری لیست ها
9
برخلف رشتهها ،لیستها قابل تغییراند؛ به عبارت دقیقتر میتوان اعضای آنها را به
کمک عملگر اندیس و دستور مقداردهی تغییر داد.
اگر عملگر کروشه در سمت چپ مقداردهی بود به معنای تغییر یکی از اعضای لیست
است .به یک مقداردهی یک عنصر لیست item assignmentمیگویند که برای رشتهها
کار نمیکرد.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
تغییرپذیری لیست ها
( ادامه )
10
عملگر برش میتواند قسمتی از لیست را تغییر دهد:
میتوانیم اعضای لیست را با کمک یک لیست خالی حذف کنیم:
به کمک یک برش خالی میتوانیم اعضای جدیدی را در نقطه دلخواه لیست درج کنیم:
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
حذف اعضای لیست
11
پایتون یک روش خواناتر برای عضو یک عنصر لیست یا یک زیرلیست فراهم
کردهاست( .دستور )del
امّا این دستور اگر اندیسی خارج از بازه به آن دادهشود خطای زمان اجرا تولید میکند.
دقت کنید که طبق معمول ،عدد انتهای بازه را شامل نمیشود!
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
اشیاء و ارجاعات
12
بعد از اجرای دستور زیر میدانیم aو bبه یک شیء رشته با مقدار ”“banana
برمیگردند امّا آیا هر دوی آنها به یک شیء اشاره میکنند یا خیر؟
دو راه برای سازماندهی این حافظه ،برای مترجم پایتون وجود دارد:
میتوانیم به کمک عملگر isچک کنیم که آیا دو نام به یک شیء اشاره میکنند:
از آنجایی که رشته تغییر ناپذیر بود پایتون از منابع به طور بهینه استفاده میکند پس هر
دو نام به یک رشته اشاره دارند ولی در مورد لیستها اینگونه نیست:
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
نام مستعار
( ) ALIASING
13
چون متغیرها به اشیاء اشاره دارند ،اگر یک متغیر را به دیگری نسبت دهیم ()assign
هر دو متغیر به یک شیء واحد برمیگردند:
این موضوع باعث میشود که اگر در یک متغیر تغییری ایجاد شود متغیر دوم نیز تأثیر
میپذیرد:
اگرچه این رفتار میتواند مفید باشد امّا گاهی به اتفاقات ناخواسته و نامناسب منجر
میشود .بهتر است وقتی با اشیاء تغییرپذیر کار میکنید از نام مستعار پرهیز نمایید.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
CLONEکردن لیست ها
14
اگر بخواهیم یک لیست را تغییر دهیم درحالیکه یک کپی از نسخه اصلی آن داشته
باشیم و نه فقط یک ارجاع به آن ،به این فرایند cloningمیگویند تا با copyاشتباه
گرفته نشود.
آسانترین روش آن استفاده از برش است:
حاال میتوان هر تغییری به bاعمال کرد بدون آنکه نگران تغییر ناخواسته aباشیم.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
لیست ها و حلقه های
FOR
15
گرامر تعمیمیافته حلقه forبه صورت زیر است:
لیستها تغییرپذیرند؛ میخواهیم درحین پیمایش یک لیست اعضای آن را نیز تغییر
دهیم.
یک راه
خواناتر و
سادهتر
enumerateدوتاییهای (مقدار و اندیس) در پیمایش
لیست ایجاد میکند.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
لیست در نقش پارامتر
16
ارسال یک لیست به عنوان آرگومان در حقیقت یک ارجاع به لیست را به تابع ارسال
میکند و نه یک کپی یا cloneاز آن را!
در این کد ،متغیرهای thingsو a_listبه یک
شیء اشاره دارند پس اگر تابع ،شیء لیست را
تغییر اعمالشده را
تغییر دهد آنگاه فراخوانندة تابع،
ِ
میبیند.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
متدهای لیست
17
عملگر .که برای استفاده از متدها بهکار میرود در اینجا نیز کاربرد دارد.
اضافه کردن عضو جدید به انتهای لیست (:)append
اضافه کردن عضو جدید به یک نقطه دلخواه از لیست (:)insert
چند عضو با مقدار تعیین شده در لیست وجود دارد (:)count
اضافه کردن یک لیست به انتهای یک لیست دیگر (:)extend
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
متدهای لیست
( ادامه )
18
اولین اندیسی که مقدار تعیینشده در آن قرار دارد (:)index
معکوس کردن ترتیب قرارگیری اعضای لیست (:)reverse
مرتبکردن اعضای لیست براساس مقدار آنها (:)sort
حذف اولین عنصر با مقدار تعیینشده (:)remove
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
تغییردهنده ها و توابع خالص
19
توابعی که آرگومانهایی از نوع لیست دریافت میکنند و در حین اجرا ،آنها را تغییر
میدهند تغییردهنده ( )modifierنام دارند و به تغییر ایجاد شده اثرجانبی ()side effect
میگویند.
یک تابع خالص ( )pure functionاثرجانبی ایجاد نمیکند یعنی آنچه که به عنوان
ورودی دریافت میکند را تغییر نمیدهد بلکه مقدار خروجی تابع به کمک یک متغیر
محلی تولید شدهاست.
تمام کارهایی را که میتوان با modifierها انجام داد با توابع خاص نیز قابل انجام
است .شواهدی وجود دارد که نشان میدهد برنامههایی که از توابع خالص استفاده
میکنند سریعتر تولید شده و کمتر مستعد خطا هستند ولی به لحاظ زمان اجرا و
کارایی modifierها بهتر هستند .پس هر وقت مجبور بودید از modifierها استفاده
کنید.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
توابعی که لیست می سازند
20
وقتی به تابعی نیازدارید که یک لیست بسازد و آن را برگرداند معموالا از این الگو
استفاده میشود:
مثال :فرض کنید تابع ) is_prime(xرا دارید میخواهیم تابعی بنویسیم که لیست تمام
اعداد اول کوچکتر از nرا برگرداند.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
رشته ها و لیست ها
21
دو متد مفید روی رشتهها ،رشته را به لیست یا زیررشته تبدیل میکرد :متد splitرشته
را به لیستی از کلمات تقسیم میکرد؛ به طور پیشفرض هر تعداد کاراکتر سفید محدودة
کلمات را مشخص میکنند.
آرگومان اختیاری این متد ،حائل ( )delimiterاست که رشتهای را که تعیینکننده
محدوده زیررشتههاست مشخص میکند:
واضح است که حائل ،در نتیجه تابع نمیآید.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
رشته ها و لیست ها
( ادامه )
22
عکس متد ،splitمتد joinاست .شما رشته تفکیککننده ( )separatorکه گاهی به آن
چسب میگویند را انتخاب میکنید و بعد اعضای یک لیست را با چسب که بین هر دو
عضو متوالی میآید به هم متصل میکنید.
توجه داشته باشید که لیستی که شما اعضایش را به هم متصل کردهاید تغییر نکردهاست.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
لیست و
RANGE
23
پایتون یک تابع تغییر گونه built-inدارد که هر چه به آن بدهید تبدیل به لیست میکند:
در پایتون 3به بعد ،تابع rangeدر اصطلح تنبل است یعنی تمام مقادیر را از ابتدا
تولید نمیکند بلکه قول میدهد که هروقت الزم شد آن را ایجاد کند .اگر تعداد اعضای
تولید شده خیلی زیاد باشد با مشکل کمبود حافظه روبهرو خواهیم بود.
برای آنکه پایتون را مجبور کنیم که rangeتنبل نباشد و لیست را کامل ایجاد کند:
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
لیست های تودرتو
24
لیست تودرتو لیستی است که خودش عضوی از یک لیست دیگر است؛ در کد زیر
عضو موجود در اندیس ،3یک لیست تودرتو است.
برای نمایش این لیست تودرتو:
برای دستیابی به اعضای لیست تودرتو:
یا میتوان آنها را ترکیب کرد:
عملگر کروشه ،از چپ به راست ارزیابی میشود پس این عبارت ،عنصر اندیس سوم
از nestedرا انتخاب کرده و بعد عنصر اندیس یکم را برمیگرداند.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
ماتریس ها
25
لیستهای تودرتو گاهی نمایانگر ماتریسها هستند:
mxیک لیست با سه عضو است که هر عضو ،یک سطر از ماتریس خواهد بود و
میتوانیم یک سطر از ماتریس را به صورت زیر انتخاب کنیم:
برای دستیابی به یک درایه از ماتریس دو اندیس بهکار میبریم:
پس اندیس اول سطر را انتخاب میکند و اندیس دوم ستون را؛ با این حال این تنها راه
نمایش ماتریس نیست مثلا دیکشنریها.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
چندتایی ها ( رکوردها )
26
چندتاییها ( )tuplesبرای دستهبندی دادهها به کار میروند .این کار برای سادهسازی
استفاده از دادههاست (نوعی ساختمان داده = )data structure
عمومیسازی آن به این معنا است که هر تعداد قلم دادهای را در یک چندتایی بتوان
قرار داد( .پرانتز اجباری نیست اما کاما اجباری است)
به کمک عملگر اندیس به هر قلم دادهای از یک چندتایی میتوان دسترسی داشت:
اما چندتاییها تغییرناپذیراند پس:
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
مقداردهی چندتایی ها
27
مقداردهی در این گونه دادهای بسیار قدرتمند است چون یک چندتایی از متغیرها در
سمت چپ عملگر انتساب را با مقادیر موجود در یک چندتایی در سمت راست عملگر،
مقداردهی میکند:
هفت مقداردهی در یک خط انجام شدهاست.
عملگر= مثل باز و بسته کردن چندتایی رفتار میکند ()packing/ unpacking
مهم است که تعداد مقادیر با تعداد متغیرهای سمت چپ انتساب برابر باشد.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
چندتایی ها در نقش خروجی تاب ع
28
تا به حال دیدید که توابع یک مقدار را به عنوان خروجی برمیگردانند اما اگر خروجی
تابع چند مقدار باشد میتوانیم آنها را در قالب یک چندتایی برگردانیم.
محیط و مساحت دایره را با هم در یک تابع برمیگردانیم:
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
قابلیت ترکیب ساختارداده ها
29
همانطور که قبلا هم دیدیم میتوانیم لیستی از چندتاییها داشته باشیم که یکی از اجزای
چندتایی هم یک لیست باشد:
یا هر جزء یک چندتایی میتواند خودش چندتایی باشد:
به این خاصیت ناهمگن
بودن()heterogenous
میگویند یعنی اجزاء
میتوانند انواع مختلف
داشته باشند.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
عملگرهای چندتایی ها
30
اصوالا روی دنبالهها سه عملگر اصلی وجود دارد + :و * و ][
+ عملگر الحاق است که دو یا چند چندتایی را به هم میچسباند.
* عملگر تکرار است که چندتایی را به تعداد ضربشده در آن در یک چندتایی جدید
تکرار میکند.
[] عملگر اندیس یا برش است.
همچنین عملگرهای مقایسهای روی چندتاییها همان معنی را که برای رشتهها داشت را
دارد.
None میتواند یکی از اعضای دنباله باشد ولی دو کامای پشتسرهم برابر با دنباله
نیست.
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف
تمرین
31
صفحه 161تمرین 5
صفحه 161تمرین 10
نیمسال دوم 1392-1393
جلسه 11
مبانی برنامهسازی -دانشگاه صنعتی شریف