این حالت نمایش چند صفحه ای قابل پرینت این قسمت میباشد. برای پرینت کلیک کنید..
دیکشنریها
- 1: یک دیکشنری ساده
- 2: کار کردن با دیکشنری
- 3: یک دیکشنری شامل اشیای مشابه
- 4: حلقه زدن در یک دیکشنری
- 5: تودرتوکردن
- 6: خلاصه
1 - یک دیکشنری ساده
در این فصل نحوهی بهکارگیری دیکشنریها را در پایتون میآموزید که به شما امکان متّصل کردن تکههایی از اطّلاعاتِ مرتبط را میدهند. یاد میگیرید که چگونه پس از وارد کردن اطّلاعات به دیکشنری، به آن دسترسی پیدا کنید و چگونه آنها را تغییر دهید. ازآنجاییکه میتوان حجم نامحدودی از اطّلاعات را در یک دیکشنری ذخیره کرد، طریقهی حلقه زدن در دادههای یک دیکشنری را خواهید آموخت. علاوه بر این قرار دادن دیکشنریها در لیستها، لیستها داخل دیکشنریها و حتّی دیکشنریها را در دیکشنریهای دیگر میآموزید.
درک کردن دیکشنریها به شما امکان میدهد که گسترهای از مسائل دنیای واقعی را به طور دقیقتر مدل کنید.
یک دیکشنری ساده
بازیای را در نظر بگیرید که در آن تعداد موجود بیگانه با رنگها و ارزش امتیازی مختلف وجود دارد. این دیکشنری ساده اطّلاعات مربوط به یک موجود خاص را در بر میگیرد:
دیکشنری alien_0 رنگ و مقدار امتیاز حاصل از کشتن موجود بیگانه را ذخیره میکند. دو خطّ آخر به اطّلاعات دسترسی پیدا کرده و آن را نمایش میدهند:
همانندِ بیشترِ مفاهیمِ جدیدِ برنامهنویسی، به کار گرفتن دیکشنریها نیازمند تمرین است. زمانی که کمی با دیکشنریها کار کردید درخواهید یافت که آنها چگونه با کارآمدی وضعیتهای دنیای واقعی را مدل میکنند.
2 - کار کردن با دیکشنری
دیکشنری در پایتون مجموعهای از جفتهای کلید-مقدار است. هر کلید با یک مقدار مرتبط است و به کمک آن میتوانید به این مقدارِ مرتبط دسترسی پیدا کنید. مقدار یک کلید میتواند عدد، رشته، لیست یا حتّی یک دیکشنری دیگر باشد.
در پایتون یک دیکشنری با دنبالهای از کلید-مقدارها، داخل آکُلاد {} قرار میگیرد:
|
|
یک جفت کلید-مقدار مجموعهای از مقدارهای به هم مرتبط است. پایتون با ارائهی هر کلید، مقداری را که با آن در ارتباط است برمیگرداند. هر کلید با یک دونقطه به مقدار خود وصل میشود و جفتهای کلید-مقدارِ مجزّا با کاما از یکدیگر جدا میشوند.
دسترسی به مقادیر یک دیکشنری
برای گرفتن مقدار مرتبط با یک کلید، نام دیکشنری را بنویسید و سپس کلید را داخل یک جفت کروشه جلوی آن قرار دهید:
این کد مقدار مربوط به کلید ‘color’ را از دیکشنری alien_0 برمیگرداند:
|
|
شما میتوانید تعداد نامحدودی جفتِ کلید-مقدار در یک دیکشنری بگنجانید. اگر بازیکنی این موجود بیگانه را بکشد، امتیازِ کسبشدهی او با کدی به صورت زیر به دست میآید:
کد 1 میتواند بلافاصله بعد از تعریفِ دیکشنری، مقدار مرتبط با کلید ‘points’ را از آن بیرون بکشد. این مقدار در ادامه به متغیّر new_points منسوب میشود. خط 2 دربارهی تعداد امتیازی که بازیکن دریافت کرده عبارتی چاپ میکند:
|
|
افزودن جفتهای کلید-مقدار جدید
دیکشنریها ساختارهایی پویا هستند و همیشه میتوان جفتهای کلید-مقدارِ جدید را به آنها افزود. برای افزودن یک جفت کلید-مقدار، نام دیکشنری را همراه با کلید جدید، که در کروشه قرار گرفته، در کنارِ مقدار جدید مینویسید.
بیایید دو دانستهی جدید به دیکشنری alien_0 بیفزاییم: مختصّات x و y آن:
مطابق قبل از تعریف یک دیکشنری شروع میکنیم. سپس آن را چاپ میکنیم. در 1 یک جفت کلید-مقدار جدید به آن اضافه میکنیم: کلید ‘x_position’ و مقدار 0. در 2 همین کار را برای کلید ‘y_position’ تکرار میکنیم:
شروع کردن از یک دیکشنری خالی
گاهی سادهتر یا حتّی الزامی است که کار را از یک دیکشنری خالی شروع کرده و سپس موارد جدید را به آن اضافه کنیم:
نتیجه همان دیکشنریای است که در مثالهای قبلی به کار میبردیم:
|
|
معمولاً هنگام ذخیرهسازی دادههایی که کاربران ارائه میکنند یا نوشتن کدی که تعداد زیادی جفت کلید-مقدار را به طور خودکار تولید میکند، از دیکشنریهای خالی استفاده میکنیم.
تغییر دادن مقدارها در یک دیکشنری
برای تغییر دادن مقداری در یک دیکشنری، نام آن را به همراه کلید در داخل کروشه بنویسید و سپس مقدار جدیدی را بیاورید:
ابتدا دیکشنری alien_0 را تعریف میکنیم که تنها شامل رنگ آن است، سپس مقدار مرتبط با کلید ‘color’ را به ‘yellow’ تغییر میدهیم:
به عنوان یک مثال جذّابتر بیاید موقعیّت یک موجود بیگانه را که با سرعتهای مختلف حرکت میکند ردگیری کنیم:
|
|
در 1 یک زنجیرهی if-elif-else مشخّص میکند که موجود بیگانه چهقدر باید به سمت راست حرکت کند. پس از محاسبه شدن مقدارِ افزایشِ جابهجایی، آن را در 2 به مقدار x_position اضافه میکنیم:
حذف کردن جفتهای کلید-مقدار
زمانی که دیگر به اطّلاعاتِ ذخیرهشده در دیکشنری نیاز نداشتید میتوانید به کمک عبارت del، یک جفت کلید-مقدار را به کلّی حذف کنید:
خروجی نشان میدهد که کلید ‘points’ و مقدار آن، ۵، از دیکشنری حذف شده:
3 - یک دیکشنری شامل اشیای مشابه
مثال قبلی به ذخیرهسازی اطّلاعاتِ مختلفِ یک شیء میپرداخت که موجودی بیگانهای در یک بازی بود. علاوه بر این حالت شما میتوانید از دیکشنری برای ذخیره کردن یک نوع اطّلاعات در مورد اشیاء مختلف استفاده کنید. مثلاً فرض کنید میخواهید از افراد مختلف در مورد زبان برنامهنویسی موردعلاقهشان نظرسنجی کنید:
هر کدام از کلیدها نام یکی از افراد پاسخدهنده و هر مقدارْ زبان برنامهنویسی مورد علاقهی اوست.
برای استفاده از این دیکشنری، با داشتن نام فرد شرکتکننده در نظرسنجی، زبان برنامهنویسی دلخواه او به سادگی به دست میآید:
خروجی زبان مورد علاقهی سارا را نمایش میدهد:
|
|
بهکارگیری get() برای دسترسی به مقدارها
بهکارگیری کلیدها در کروشه برای بازیابی مقدار مورد نظر از دیکشنری یک خطر بالقوّه دارد: اگر کلید درخواستی شما وجود نداشته باشد به خطا برمیخورید:
برای دیکشنریها به طور خاص میتوانید از متد get() استفاده کنید تا برای مواقعی که کلید درخواستی وجود ندارد مقدارِ پیشفرضی برای بازگرداندن تعیین کنید:
اگر کلید ‘points’ در دیکشنری وجود نداشته باشد، مقدار متناظر آن برگردانده میشود. در غیر این صورت مقدار پیشفرض تعیینشده را خواهید گرفت:
|
|
خودآزمایی
فرد
از یک دیکشنری برای ذخیرهسازی اطّلاعات مربوط به فردی استفاده کنید که او را میشناسید. نام و نام خانوادگی، سن و شهرِ محل زندگی او را ضبط کنید. باید کلیدهایی مانند first_name، last_name، age و city داشته باشید. هر بخشِ اطّلاعاتی را که ذخیره کردهاید چاپ کنید.
اعداد محبوب
از یک دیکشنری برای ذخیره کردن اعداد محبوبِ افراد استفاده کنید. پنج نام در نظر بگیرید و آنها را به عنوان کلیدهای یک دیکشنری به کار بگیرید. اعدادی را به عنوان عدد محبوب هر فرد به جای مقدارهای هر کلید در دیکشنری ذخیره کنید. نام هر کس و عدد مورد علاقهی او را چاپ کنید.
واژهنامه
دیکشنری پایتون میتواند به عنوان دیکشنری (واژهنامهی) واقعی به کار رود.
- پنج واژهی مربوط به برنامهنویسی را در نظر بگیرید که در فصلهای گذشته معنی آنها را آموختهاید. از واژهها به عنوان کلید و از معنی آنها به جای مقدار استفاده کرده و آنها را در دیکشنری ذخیره کنید.
- هر واژه و معنای آن را به شکلی منظّم در خروجی چاپ کنید.
4 - حلقه زدن در یک دیکشنری
یک دیکشنری پایتون میتواند شامل تنها چند جفت کلید-مقدار یا میلیونها عدد از آنها باشد. چون دیکشنری قابلیّت ذخیرهسازی انبوهی از اطّلاعات را دارد، پایتون این امکان را برای شما فراهم میآورد تا در یک دیکشنری حلقه بزنید. میتوانید در تمام جفتهای کلید-مقدار یک دیکشنری، در کلیدها و یا در مقدارهای آن حلقه بزنید.
حلقه زدن در تمام جفتهای کلید-مقدار
دیکشنری زیر نام کاربری، نام و نام خانوادگی یک فرد را ذخیره میکند:
برای نوشتن یک حلقهی for برای دیکشنری، دو متغیّر را نامگذاری میکنیم که کلید و مقدار یک جفت کلید-مقدار را نگهداری میکند. بخش دوم عبارت for در 1، نام دیکشنری را در بر میگیرد که متد items() پس از آن آمده است. این متد لیستی از جفتهای کلید-مقدار برمیگرداند:
برای مثال favorite_languages.py که در صفحهی قبل دیدیم، اگر داخل دیکشنری favorite_languages حلقه بزنید نام هر فرد و زبان برنامهنویسی مورد علاقهی او را به دست میآورید:
حلقه زدن در تمام کلیدهای یک دیکشنری
در صورتی که مقدارهای یک دیکشنری مورد نظر نباشد، استفاده از متد keys() سودمند است:
در واقع هنگام حلقه زدن در یک دیکشنری، رفتار پیشفرض همان حلقه زدن در کلیدها است، پس اگر به جای for name in favorite_languages.keys(): این کد را مینوشتید: for name in favorite_languages: نتیجه یکسان میشد.
در داخل یک حلقه و به کمک کلید فعلی، امکان دسترسی به مقدار آن کلید وجود دارد. اکنون خطاب به دوستان خود پیامی حاوی زبان برنامهنویسی مورد علاقهی آنها چاپ میکنیم:
|
|
همچنین برای این که بفهمید فردی در نظرسنجی شرکت کرده یا نه، میتوانید از متد keys() استفاده کنید:
|
|
حلقه زدن در کلیدهای دیکشنری با یک ترتیب خاص
از پایتون ۳.۷ به بعد حلقه زدن در دیکشنری اعضای آن را به همان ترتیبِ ذخیره شدن باز میگرداند. با این حال گاهی به حلقه زدن در دیکشنری با ترتیبی متفاوت نیاز دارید:
حلقه زدن در تمام مقدارهای یک دیکشنری
اگر بررسی مقدارهای یک دیکشنری برای شما اولویّت بیشتری دارد، میتوانید از متد values() استفاده کنید:
این رویکرد تمام مقدارهای دیکشنری را بیرون میکشد بدون این که به تکراری بودن یا نبودن آنها اهمّیّتی دهد. برای این که زبانهای برنامهنویسی انتخابی را بدون تکرار ببینیم، از مجموعه استفاده میکنیم:
برای ساختن مستقیم یک مجموعه میتوانید از آکُلاد استفاده کرده و اعضا را با کاما از هم جدا کنید:
اشتباه گرفتن مجموعه و دیکشنری به سادگی امکانپذیر است زیرا هر دو در آکُلاد قرار میگیرند. اگر به آکُلادهایی برخوردید که درون آن جفتهای کلید-مقدار نبود، احتمالاً با یک مجموعه سر و کار دارید.
خودآزمایی
واژهنامه ۲
حال که حلقه زدن در دیکشنری را آموختهاید، کد تمرین ۶-۳ را تمیز کنید به طوری که به جای تعدادی print() از یک حلقه برای نمایش کلیدها و مقدارهای دیکشنری استفاده شود. پنج عبارت پایتونی دیگر به واژهنامهی خود بیفزایید.
رودخانهها
یک دیکشنری بسازید که شامل سه رودخانهی اصلی و کشوری که آن رودخانهها در آن جریان دارند، باشد.
- از یک حلقه برای چاپ کردن جملهای در مورد رودخانه استفاده کنید، مثلاً:
The Nile runs through Egypt. - از حلقهای برای چاپ نام تکتکِ رودخانههای داخل دیکشنری استفاده کنید.
- از حلقهای برای چاپ نام تکتکِ کشورهای داخل دیکشنری استفاده کنید.
نظرسنجی
از کد favorite_languages.py استفاده کنید.
- لیستی از افرادی که باید در نظرسنجی شرکت کنند، تهیه کنید که شامل چند نام موجود در دیکشنری و چند نام جدید باشد.
- در لیست افرادی که باید شرکت کنند حلقه بزنید. اگر پیش از این در نظرسنجی شرکت کرده بودند، پیام تشکری خطاب به آنها چاپ کنید. اگر نه پیامی چاپ کنید و از آنها برای شرکت در نظرسنجی دعوت به عمل آورید.
5 - تودرتوکردن
گاهی میخواهید چند دیکشنری را درون یک لیست یا لیستی از موارد را به عنوان مقدار در یک دیکشنری قرار دهیم. به این کار تودرتو کردن میگویند. میتوانید دیکشنریها را داخل یک لیست، لیستی را داخل یک دیکشنری و حتّی یک دیکشنری را داخل یک دیکشنری دیگر قرار دهید.
لیستی از دیکشنریها
دیکشنری alien_0 شامل اطّلاعات مختلفی از یک موجود بیگانه است امّا دیگر برای ذخیره کردنِ اطّلاعاتِ موجودِ بیگانهی دوم جا ندارد. یک راه ساختن لیستی از دیکشنریهاست:
یک مثال واقعیتر ساختن بیشتر از سه موجود به کمک کدی است که تولید موجودات بیگانه را به طور خودکار انجام میدهد. در مثال زیر از range() برای ساختن ناوگانی از ۳۰ موجود بیگانه استفاده میکنیم:
|
|
این موجودهای بیگانه همگی خصوصیّاتی مشترک دارند ولی پایتون هر کدام از آنها را یک شیء جدا در نظر میگیرد که امکان تغییر دادن جداگانهی هر کدام از آنها در آینده فراهم است.
چگونه میتوانید با چنین گروهی از موجودات بیگانه کار کنید؟ تصوّر کنید که بخشی از بازی موجوداتی دارد که رنگ آنها عوض میشود:
|
|
این حلقه را میتوان با افزودن یک بخش elif گسترش داد تا موجودهای زردرنگ را قرمزرنگ، سریع و ۱۵ امتیازی کند:
لیستی در یک دیکشنری
گاهی سودمند است که به جای قرار دادن یک دیکشنری درونِ یک لیست، لیستی را درون یک دیکشنری بگذاریم. برای نمونه به این فکر کنید که چگونه میتوان پیتزایی را توصیف کرد که یک نفر سفارش میدهد:
|
|
هر گاه به این نیاز داشتید که در یک دیکشنری بیش از یک مقدار را به یک کلید نسبت دهید، میتوانید لیست را در دیکشنری به کار ببرید:
|
|
یک دیکشنری در یک دیکشنری دیگر
امکان قرار دادن یک دیکشنری درون یک دیکشنری دیگر وجود دارد:
|
|
خودآزمایی
مردم
از برنامهای شروع کنید که در تمرین ۶-۱ نوشتید. دو دیکشنری جدید در مورد افراد مختلف بسازید و هر سه دیکشنری را در لیستی به نام people ذخیره کنید. در لیست حلقه بزنید و حین این کار، هر چه در مورد هر فرد میدانید چاپ کنید.
حیوانات خانگی
چند دیکشنری بسازید که هر کدام بیانگر یک حیوان خانگی باشد. در هر دیکشنری نوع حیوان و نام صاحب آن را بیاورید. این دیکشنریها را در لیستی به نام pets ذخیره کنید. سپس در لیست حلقه بزنید و همزمان هر چه در مورد هر کدام از حیوانها میدانید چاپ کنید.
مکانهای مورد علاقه
یک دیکشنری به نام favorite_places بسازید. نام سه نفر را به عنوان کلیدهای این دیکشنری و نام سه مکان دلخواه را برای هر کس به عنوان مقدار این کلیدها ذخیره کنید. در دیکشنری حلقه بزنید و نام و مکان مورد علاقهی هر کس را چاپ کنید.
نامهای مورد علاقه
برنامهی تمرین ۶-۲ را تغییر دهید به طوریکه هر فرد بتواند بیش از یک عدد دلخواه داشته باشد. سپس نام هر فرد و اعداد مورد علاقهی او را چاپ کنید.
شهرها
یک دیکشنری به نام cities بسازید. نام سه شهر را به عنوان کلیدهای آن در نظر بگیرید. برای اطّلاعات هر شهر یک دیکشنری بسازید که شامل این موارد باشد: کشوری که آن شهر در آن است، جمعیّت تقریبی و یک دانستنی در مورد آن.
توسعهها
از یکی از برنامههای نمونهی این فصل استفاده کنید و با افزودن کلیدها و مقدارها، تغییر بستر و مفهوم برنامه و بهبود شکل خروجی، آن را توسعه دهید.
6 - خلاصه
در این فصل روش تعریف کردن یک دیکشنری و نحوهی کار کردن با اطّلاعات ذخیره شده در آن را آموختید. یاد گرفتید که چگونه به اعضای دیکشنری به طور جداگانه دسترسی پیدا کنید، آنها را تغییر دهید و این که چگونه در تمام اطّلاعات یک دیکشنری حلقه بزنید. حلقه زدن در جفتهای کلید-مقدار، کلیدها و مقدارهای یک دیکشنری را آموختید. همچنین یاد گرفتید که چگونه چند دیکشنری را درون یک لیست، لیستها را درون یک دیکشنری و دیکشنری را درون یک دیکشنری دیگر قرار دهید.
در فصل بعد دربارهی حلقههای while و نحوهی دریافت اطّلاعات از کاربرانی که با برنامهی شما کار میکنند، خواهید آموخت. این فصل بسیار مهیّج خواهد بود زیرا میآموزید که تمام برنامههای خود را تعاملی کنید: همهی آنها قادر خواهند بود که به ورودی کاربر پاسخ دهند.