<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 <img src="images/logo.jpg" style="display
Step1:  <p style="text-align
Step2:  <p style="text-align
Step3:  <p style="text-align
Step4:  <p style="text-align
Step5:  <p style="text-align
Step6:  <div class="align-center" style="display
Step7:  <p style="text-align
Step8:  <div class="align-center" style="display
Step9:  <p style="text-align
Step10:  <p style="text-align
Step11:  <p style="text-align
Step12:  <p style="text-align
Step13:  <p style="text-align
Step14:  <span style="text-align
Step15:  <p style="text-align
Step16:  <p style="text-align
Step17:  <p style="text-align
Step18:  <p style="text-align
Step19:  <div class="align-center" style="display
Step20:  <span style="text-align
Step21:  <p style="text-align
Step22:  <p style="text-align
Step23:  <p style="text-align
Step24:  <p style="text-align
Step25:  <p style="text-align
Step27:  <div class="align-center" style="display
Step29:  <span style="align
<ASSISTANT_TASK:>
Python Code:
items = ['banana', 'apple', 'carrot']
stock = [2, 3, 4]
Explanation: <img src="images/logo.jpg" style="display: block; margin-left: auto; margin-right: auto;" alt="לוגו של מיזם לימוד הפייתון. נחש מצויר בצבעי צהוב וכחול, הנע בין האותיות של שם הקורס: לומדים פייתון. הסלוגן המופיע מעל לשם הקורס הוא מיזם חינמי ללימוד תכנות בעברית.">
<span style="text-align: right; direction: rtl; float: right;">מילונים</span>
<span style="text-align: right; direction: rtl; float: right; clear: both;">הקדמה</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    ברשימה הבאה, כל תבליט מייצג אוסף של נתונים:
</p>
<ul style="text-align: right; direction: rtl; float: right; clear: both;">
    <li>בחנות של האדון קשטן יש 2 בננות, 3 תפוחים ו־4 גזרים.</li>
    <li>מספר הזהות של ג'ני הוא 086753092, של קווין 133713370, של איינשטיין 071091797 ושל מנחם 111111118.</li>
    <li>לקווין מהסעיף הקודם יש צוללות בצבע אדום וכחול. הצוללות של ג'ני מהסעיף הקודם בצבע שחור וירוק. הצוללת שלי צהובה.</li>
    <li>המחיר של פאי בחנות של קשטן הוא 3.141 ש"ח. המחיר של אווז מחמד בחנות של קשטן הוא 9.0053 ש"ח.</li>
</ul>
<div class="align-center" style="display: flex; text-align: right; direction: rtl; clear: both;">
    <div style="display: flex; width: 10%; float: right; clear: both;">
        <img src="images/exercise.svg" style="height: 50px !important;" alt="תרגול"> 
    </div>
    <div style="width: 70%">
        <p style="text-align: right; direction: rtl; float: right; clear: both;">
            נסו למצוא מאפיינים משותפים לאוספים שהופיעו מעלה.
        </p>
    </div>
    <div style="display: flex; width: 20%; border-right: 0.1rem solid #A5A5A5; padding: 1rem 2rem;">
        <p style="text-align: center; direction: rtl; justify-content: center; align-items: center; clear: both;">
            <strong>חשוב!</strong><br>
            פתרו לפני שתמשיכו!
        </p>
    </div>
</div>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    אפשר לחלק כל אחד מהאוספים שכתבנו למעלה ל־2 קבוצות ערכים.<br>
    הראשונה – הנושאים של האוסף. עבור החנות של קשטן, לדוגמה, הפריט שאנחנו מחזיקים בחנות.<br>
    השנייה – הפריטים שהם <em>נתון כלשהו</em> בנוגע לפריט הראשון: המלאי של אותו פריט, לדוגמה.<br>
</p>
<figure>
    <img src="images/dictionary_groups.svg?n=5" style="max-width:100%; margin-right: auto; margin-left: auto; text-align: center;" alt="בתמונה מופיעים 4 עיגולים בימין ו־4 עיגולים בשמאל. העיגולים בימין, בעלי הכותרת 'נושא', מצביעים על העיגולים בשמאל שכותרתם 'נתון לגבי הנושא'. כל עיגול בימין מצביע לעיגול בשמאל. 'פריט בחנות' מצביע ל'מלאי של הפריט', 'מספר תעודת זהות' מצביע ל'השם שמשויך למספר', 'בן אדם' מצביע ל'צבעי הצוללות שבבעלותו' ו'פריט בחנות' (עיגול נוסף באותו שם כמו העיגול הראשון) מצביע ל'מחיר הפריט'."/>
    <figcaption style="text-align: center; direction: rtl;">חלוקת האוספים ל־2 קבוצות של ערכים.</figcaption>
</figure>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    פריטים מהקבוצה הראשונה לעולם לא יחזרו על עצמם – אין היגיון בכך ש"תפוח ירוק" יופיע פעמיים ברשימת המלאי בחנות, ולא ייתכן מצב של שני מספרי זהות זהים.<br> 
    הפריטים מהקבוצה השנייה, לעומת זאת, יכולים לחזור על עצמם – הגיוני שתהיה אותה כמות של בננות ותפוחים בחנות, או שיהיו אנשים בעלי מספרי זהות שונים שנקראים "משה כהן".
</p>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    נבחן לעומק את המאפיינים המשותפים בדוגמאות שלעיל.
</p>
<table style="text-align: right; direction: rtl; clear: both; font-size: 1.3rem">
    <caption style="text-align: center; direction: rtl; clear: both; font-size: 2rem; padding-bottom: 2rem;">המשותף לאוספים</caption>
    <thead>
        <tr>
            <th>אוסף</th>
            <th>הערך הקושר (קבוצה ראשונה)</th>
            <th>הערך המתאים לו (קבוצה שנייה)</th>
            <th>הסבר</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>מוצרים והמלאי שלהם בחנות</td>
            <td>המוצר שנמכר בחנות</td>
            <td>המלאי מאותו מוצר</td>
            <td>יכולים להיות בחנות 5 תפוזים ו־5 תפוחים, אבל אין משמעות לחנות שיש בה 5 תפוחים וגם 3 תפוחים.</td>
        </tr>
        <tr>
            <td>מספרי הזהות של אזרחים</td>
            <td>תעודת הזהות</td>
            <td>השם של בעל מספר הזהות</td>
            <td>יכולים להיות הרבה אזרחים העונים לשם משה לוי, ולכל אחד מהם יהיה מספר זהות שונה. לא ייתכן שמספר זהות מסוים ישויך ליותר מאדם אחד.</td>
        </tr>
        <tr>
            <td>בעלות על צוללות צבעוניות</td>
            <td>בעל הצוללות</td>
            <td>צבע הצוללות</td>
            <td>יכול להיות שגם לקווין וגם לג'ני יש צוללות בצבעים זהים. ג'ני, קווין ואני הם אנשים ספציפיים, שאין יותר מ־1 מהם בעולם (עד שנמציא דרך לשבט אנשים).</td>
        </tr>
        <tr>
            <td>מוצרים ומחיריהם</td>
            <td>שם המוצר</td>
            <td>מחיר המוצר</td>
            <td>לכל מוצר מחיר נקוב. עבור שני מוצרים שונים בחנות יכול להיות מחיר זהה.</td>
        </tr>
    </tbody>
</table>
<span style="text-align: right; direction: rtl; float: right; clear: both;">מיפוי ערכים</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    כמו שראינו בדוגמאות, מצב נפוץ במיוחד הוא הצורך לאחסן <em>מיפוי בין ערכים</em>.<br>
    נחשוב על המיפוי בחנות של קשטן, שבה הוא סופר את המלאי עבור כל מוצר.<br>
    נוכל לייצג את מלאי המוצרים בחנות של קשטן באמצעות הידע שכבר יש לנו. נשתמש בקוד הבא:
</p>
End of explanation
def get_stock(item_name, items, stock):
    item_index = items.index(item_name)
    how_many = stock[item_index]
    return how_many
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    עבור כל תא ברשימת <var>items</var>, שמרנו במקום התואם ברשימת <var>stock</var> את הכמות שנמצאת ממנו בחנות.<br>
    יש 4 גזרים, 3 תפוחים ו־2 בננות על המדף בחנות של אדון קשטן.<br>
    שליפה של כמות המלאי עבור מוצר כלשהו בחנות תתבצע בצורה הבאה:
</p>
End of explanation
print(get_stock('apple', items, stock))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    בשורה הראשונה בגוף הפונקציה מצאנו את מיקום המוצר שאנחנו מחפשים במלאי. נניח, "תפוח" מוחזק במקום 1 ברשימה.<br>
    בשורה השנייה פנינו לרשימה השנייה, זו שמאחסנת את המלאי עבור כל מוצר, ומצאנו את המלאי שנמצא באותו מיקום.<br>
    כמות היחידות של מוצר מאוחסנת במספר תא מסוים, התואם למספר התא ברשימה של שמות המוצרים. זו הסיבה לכך שהרעיון עובד.<br>
</p>
End of explanation
items = [('banana', 2), ('apple', 3), ('carrot', 4)]
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    צורה נוספת למימוש אותו רעיון תהיה שמירה של זוגות סדורים בתוך רשימה של tuple־ים:
</p>
End of explanation
def get_stock(item_name_to_find, items_with_stock):
    for item_to_stock in items_with_stock:
        item_name = item_to_stock[0]
        stock = item_to_stock[1]
        if item_name == item_name_to_find:
            return stock
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    ברשימה הזו הרעיון נראה מובן יותר. בואו נממש דרך לחלץ איבר מסוים מתוך הרשימה:
</p>
End of explanation
get_stock('apple', items)
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    עבור כל tuple ברשימה, בדקנו אם שם הפריט שהוא מכיל תואם לשם הפריט שחיפשנו.<br>
    אם כן, החזרנו את הכמות של אותו פריט במלאי.<br>
    שימוש בפונקציה הזו נראה כך:
</p>
End of explanation
ages = {'Yam': 27, 'Methuselah': 969, 'Baby Groot': 3}
Explanation: <div class="align-center" style="display: flex; text-align: right; direction: rtl; clear: both;">
    <div style="display: flex; width: 10%; float: right; clear: both;">
        <img src="images/exercise.svg" style="height: 50px !important;" alt="תרגול"> 
    </div>
    <div style="width: 70%">
        <p style="text-align: right; direction: rtl; float: right; clear: both;">
            השתמשו ב־unpacking שלמדנו במחברת הקודמת כדי לפשט את לולאת ה־<code>for</code> בקוד של <code>get_stock</code>.
        </p>
    </div>
    <div style="display: flex; width: 20%; border-right: 0.1rem solid #A5A5A5; padding: 1rem 2rem;">
        <p style="text-align: center; direction: rtl; justify-content: center; align-items: center; clear: both;">
            <strong>חשוב!</strong><br>
            פתרו לפני שתמשיכו!
        </p>
    </div>
</div>
<div class="align-center" style="display: flex; text-align: right; direction: rtl; clear: both;">
    <div style="display: flex; width: 10%; float: right; clear: both;">
        <img src="images/exercise.svg" style="height: 50px !important;" alt="תרגול"> 
    </div>
    <div style="width: 70%">
        <p style="text-align: right; direction: rtl; float: right; clear: both;">
            שני קטעי הקוד שנתנו כדוגמה פישטו את המצב יתר על המידה, והם אינם מתייחסים למצב שבו הפריט חסר במלאי.<br>
            הרחיבו את הפונקציות <code>get_stock</code> כך שיחזירו 0 אם הפריט חסר במלאי.
        </p>
    </div>
    <div style="display: flex; width: 20%; border-right: 0.1rem solid #A5A5A5; padding: 1rem 2rem;">
        <p style="text-align: center; direction: rtl; justify-content: center; align-items: center; clear: both;">
            <strong>חשוב!</strong><br>
            פתרו לפני שתמשיכו!
        </p>
    </div>
</div>
<span style="text-align: right; direction: rtl; float: right; clear: both;">הגדרה</span>
<span style="text-align: right; direction: rtl; float: right; clear: both;">מה זה מילון?</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
מילון הוא סוג ערך בפייתון.<br>
תכליתו היא ליצור קשר בין סדרה של נתונים שנקראת <dfn>מפתחות</dfn>, לבין סדרה אחרת של נתונים שנקראת <dfn>ערכים</dfn>.<br>
לכל מפתח יש ערך שעליו הוא מצביע.<br>
</p>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    ישנן דוגמאות אפשריות רבות לקשרים כאלו:
</p>
<ol style="text-align: right; direction: rtl; float: right; clear: both;">
    <li>קשר בין ערים בעולם לבין מספר האנשים שחיים בהן.</li>
    <li>קשר בין ברקוד של מוצרים בחנות לבין מספר הפריטים במלאי מכל מוצר.</li> 
    <li>קשר בין מילים לבין רשימת הפירושים שלהן במילון אבן־שושן.</li>
</ol>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
לערך המצביע נקרא <dfn>מפתח</dfn> (<dfn>key</dfn>). זה האיבר מבין זוג האיברים שעל פיו נשמע הגיוני יותר לעשות חיפוש:<br>
</p>
<ol style="text-align: right; direction: rtl; float: right; clear: both;">
    <li>העיר שאנחנו רוצים לדעת את מספר התושבים בה.</li>
    <li>הברקוד שאנחנו רוצים לדעת כמה פריטים ממנו קיימים במלאי.</li>
    <li>המילה שאת הפירושים שלה אנחנו רוצים למצוא.</li>
</ol>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
לערך השני מבין שני הערכים בזוג, נקרא... ובכן, <dfn>ערך</dfn> (<dfn>value</dfn>). זה הנתון שנרצה למצוא לפי המפתח:<br>
</p>
<ol style="text-align: right; direction: rtl; float: right; clear: both;">
    <li>מספר התושבים בעיר.</li>
    <li>מספר הפריטים הקיימים במלאי עבור ברקוד מסוים.</li>
    <li>הפירושים של המילה במילון.</li>
</ol>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
אם כך, מילון הוא בסך הכול אוסף של זוגות שכאלו: מפתחות וערכים.</p>
<span style="text-align: right; direction: rtl; float: right; clear: both;">הבסיס</span>
<span style="text-align: right; direction: rtl; float: right; clear: both;">יצירת מילון</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
ניצור מילון חדש:</p>
End of explanation
age_of_my_elephants = {}
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
במילון הזה ישנם שלושה ערכים: הגיל של ים, של מתושלח ושל בייבי־גרוט.<br>
המפתחות במילון הזה הם <em>Yam</em> (הערך הקשור למפתח הזה הוא 27), <em>Methuselah</em> (עם הערך 969) ו־<em>Baby Groot</em> (אליו הוצמד הערך 3).
</p>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
יצרנו את המילון כך:
</p>
<ol style="text-align: right; direction: rtl; float: right; clear: both;">
    <li>פתחנו סוגריים מסולסלים.</li>
    <li>יצרנו זוגות של מפתחות וערכים, מופרדים בפסיק:
        <ol>
            <li>המפתח.</li>
            <li>הפרדה בנקודתיים.</li>
            <li>הערך.</li>
        </ol>
    </li>
    <li>סגרנו סוגריים מסולסלים.</li>
</ol>
<figure>
    <img src="images/dictionary.svg?v=2" style="max-width:100%; margin-right: auto; margin-left: auto; text-align: center;" alt="בתמונה מופיעים 3 ריבועים בימין ו־3 ריבועים בשמאל. הריבועים בימין, שמתויגים כ'מפתח', מצביעים על הריבועים בשמאל שמתויגים כ'ערך'. כל ריבוע בימין מצביע לריבוע בשמאל. בריבוע הימני העליון כתוב Yam, והוא מצביע על ריבוע בו כתוב 27. כך גם עבור ריבוע שבו כתוב Methuselah ומצביע לריבוע בו כתוב 969, וריבוע בו כתוב Baby Groot ומצביע לריבוע בו כתוב 3."/>
    <figcaption style="text-align: center; direction: rtl;">המחשה למילון שבו 3 מפתחות ו־3 ערכים.</figcaption>
</figure>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
אפשר ליצור מילון ריק בעזרת פתיחה וסגירה של סוגריים מסולסלים:</p>
End of explanation
names = ['Yam', 'Mathuselah', 'Baby Groot']
Explanation: <div class="align-center" style="display: flex; text-align: right; direction: rtl; clear: both;">
    <div style="display: flex; width: 10%; float: right; clear: both;">
        <img src="images/exercise.svg" style="height: 50px !important;" alt="תרגול"> 
    </div>
    <div style="width: 70%">
        <p style="text-align: right; direction: rtl; float: right; clear: both;">
            צרו מילון עבור המלאי בחנות של אדון קשטן.
        </p>
    </div>
    <div style="display: flex; width: 20%; border-right: 0.1rem solid #A5A5A5; padding: 1rem 2rem;">
        <p style="text-align: center; direction: rtl; justify-content: center; align-items: center; clear: both;">
            <strong>חשוב!</strong><br>
            פתרו לפני שתמשיכו!
        </p>
    </div>
</div>
<span style="text-align: right; direction: rtl; float: right; clear: both;">אחזור ערך</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
ניזכר כיצד מאחזרים ערך מתוך רשימה:
</p>
End of explanation
names[2]
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
כדי לחלץ את הערך שנמצא <em>במקום 2</em> ברשימה <var>names</var>, נכתוב:
</p>
End of explanation
items = {'banana': 2, 'apple': 3, 'carrot': 4}
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
עד כאן הכול מוכר.<br>
ניקח את המילון שמייצג את המלאי בחנות של אדון קשטן:
</p>
End of explanation
items['banana']
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
כדי לחלץ את ערך המלאי שנמצא <em>במקום שבו המפתח הוא 'banana'</em>, נרשום את הביטוי הבא:
</p>
End of explanation
items['melon'] = 1
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
כיוון שבמילון המפתח הוא זה שמצביע על הערך ולא להפך, אפשר לאחזר ערך לפי מפתח, אבל אי־אפשר לאחזר מפתח לפי ערך.</p>
<div class="align-center" style="display: flex; text-align: right; direction: rtl;">
    <div style="display: flex; width: 10%; ">
        <img src="images/tip.png" style="height: 50px !important;" alt="אזהרה!"> 
    </div>
    <div style="width: 90%">
        <p style="text-align: right; direction: rtl;">
            ביום־יום, השתמשו במילה "בְּמָקוֹם" (b'e-ma-qom) כתחליף למילים סוגריים מרובעים.<br>
            לדוגמה: עבור שורת הקוד האחרונה, אימרו <em><q>items במקום banana</q></em>.
        </p>
    </div>
</div>
<span style="text-align: right; direction: rtl; float: right; clear: both;">הוספה ועדכון</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
אפשר להוסיף מפתח וערך למילון, באמצעות השמת הערך אל המילון במקום של המפתח.<br>
ניקח כדוגמה מקרה שבו יש לנו במלאי מלון אחד.<br>
המפתח הוא <em>melon</em> והערך הוא <em>1</em>, ולכן נשתמש בהשמה הבאה: 
</p>
End of explanation
items['melon'] = items['melon'] + 4
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
אם הגיעו עוד 4 מלונים לחנות של אדון קשטן, נוכל לעדכן את מלאי המלונים באמצעות השמה למקום הנכון במילון:
</p>
End of explanation
favorite_animals = {'Alice': 'Cat', 'Mad hatter': 'Hare', 'Achiles': 'Tortoise'}
for something in favorite_animals:
    print(something)
Explanation: <span style="text-align: right; direction: rtl; float: right; clear: both;">כללי המשחק</span>
<ul style="text-align: right; direction: rtl; float: right; clear: both;">
    <li>לא יכולים להיות 2 מפתחות זהים במילון.</li>
    <li>המפתחות במילון חייבים להיות immutables.</li>
    <li>אנחנו נתייחס למילון כאל מבנה ללא סדר מסוים (אין "איבר ראשון" או "איבר אחרון").</li> 
</ul>
<div class="align-center" style="display: flex; text-align: right; direction: rtl;">
    <div style="display: flex; width: 10%; ">
        <img src="images/deeper.svg?a=1" style="height: 50px !important;" alt="העמקה"> 
    </div>
    <div style="width: 90%">
        <p style="text-align: right; direction: rtl;">
            בגרסאות האחרונות של פייתון הפך מילון להיות מבנה סדור, שבו סדר האיברים הוא סדר ההכנסה שלהם למילון.<br>
            למרות זאת, רק במצבים נדירים נצטרך להתייחס לסדר שבו האיברים מסודרים במילון, ובשלב זה נעדיף שלא להתייחס לתכונה הזו.
        </p>
    </div>
</div>
<span style="text-align: right; direction: rtl; float: right; clear: both;">סיכום ביניים</span>
<ul style="text-align: right; direction: rtl; float: right; clear: both;">
    <li>מילון הוא מבנה שבנוי זוגות־זוגות: יש ערכים ומפתחות, ולכל מפתח יש ערך אחד שעליו הוא מצביע.</li>
    <li>נתייחס למילון כאל מבנה ללא סדר מסוים. אין "איבר ראשון" או "איבר אחרון".</li> 
    <li>בניגוד לרשימה, כאן ה"מקום" שאליו אנחנו פונים כדי לאחזר ערך הוא המפתח, ולא מספר שמייצג את המקום הסידורי של התא.</li>
    <li>בעזרת מפתח אפשר להגיע לערך המוצמד אליו, אבל לא להפך.</li>
</ul>
<div class="align-center" style="display: flex; text-align: right; direction: rtl;">
    <div style="display: flex; width: 10%; ">
        <img src="images/tip.png" style="height: 50px !important;" alt="אזהרה!"> 
    </div>
    <div style="width: 90%">
        <p style="text-align: right; direction: rtl;">
            חדי העין שמו לב שאנחנו מצליחים להוסיף ערכים למילון, ולשנות בו ערכים קיימים.<br>
            מהתכונה הזו אנחנו למדים שמילון הוא mutable.
        </p>
    </div>
</div>
<span style="text-align: right; direction: rtl; float: right; clear: both;">מעבר על מילון</span>
<span style="text-align: right; direction: rtl; float: right; clear: both;">לולאת for</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
כיוון שמילון הוא iterable, דרך מקובלת לעבור עליו היא באמצעות לולאת <code>for</code>.<br>
ננסה להשתמש בלולאת <code>for</code> על מילון, ונראה מה התוצאות:
</p>
End of explanation
favorite_animals = {'Alice': 'Cat', 'Mad hatter': 'Hare', 'Achiles': 'Tortoise'}
print('favorite_animals items:')
for key in favorite_animals:
    value = favorite_animals[key]
    print(f"{key:10} -----> {value}.")  # תרגיל קטן: זהו את הטריק שגורם לזה להיראות טוב כל כך בהדפסה
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    נראה שקיבלנו רק את המפתחות, בלי הערכים.<br>
    נסיק מכאן שמילון הוא אמנם iterable, אך בכל איטרציה הוא מחזיר לנו רק את המפתח, בלי הערך.
</p>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    אנחנו כבר יודעים איך מחלצים את הערך של מפתח מסוים.<br>
    נוכל להשתמש בידע הזה כדי לקבל בכל חזרור גם את המפתח, וגם את הערך:
</p>
End of explanation
print(list(favorite_animals.items()))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
אבל הפתרון הזה לא נראה אלגנטי במיוחד, ונראה שנוכל למצוא אחד טוב יותר.
</p>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
לעזרתנו נחלצת הפעולה <code>items</code>, השייכת לערכים מסוג מילון.<br>
הפעולה הזו מחזירה זוגות איברים, כאשר בכל זוג האיבר הראשון הוא המפתח והאיבר השני הוא הערך.
</p>
End of explanation
print('favorite_animals items:')
for key, value in favorite_animals.items():
    print(f"{key:10} -----> {value}.")
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
מאחר שמדובר באיברים שבאים בזוגות, נוכל להשתמש בפירוק איברים כפי שלמדנו בשיעור על לולאות <code>for</code>:
</p>
End of explanation
print('favorite_animals items:')
for character, animal in favorite_animals.items():
    print(f"{character:10} -----> {animal}.")
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
בלולאה שמופיעה למעלה ניצלנו את העובדה שהפעולה <code>items</code> מחזירה לנו איברים בזוגות: מפתח וערך.<br>
בכל חזרור, אנחנו מכניסים למשתנה <var>key</var> את האיבר הראשון בזוג, ולמשתנה <var>value</var> את האיבר השני בזוג.<br>
נוכל להיות אפילו אלגנטיים יותר ולתת למשתנים הללו שמות ראויים:
</p>
End of explanation
empty_dict = {}
empty_dict['DannyDin']
Explanation: <div class="align-center" style="display: flex; text-align: right; direction: rtl; clear: both;">
    <div style="display: flex; width: 10%; float: right; clear: both;">
        <img src="images/exercise.svg" style="height: 50px !important;" alt="תרגול"> 
    </div>
    <div style="width: 70%">
        <p style="text-align: right; direction: rtl; float: right; clear: both;">
            כתבו פונקציה שמקבלת מילון ומדפיסה עבור כל מפתח את האורך של הערך המוצמד אליו.
        </p>
    </div>
</div>
<span style="text-align: right; direction: rtl; float: right; clear: both;">מפתחות שלא קיימים</span>
<span style="text-align: right; direction: rtl; float: right; clear: both;">הבעיה</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
מילונים הם טיפוסים קצת רגישים. הם לא אוהבים כשמזכירים להם מה אין בהם.<br>
אם ננסה לפנות למילון ולבקש ממנו מפתח שאין לו, נקבל הודעת שגיאה.<br>
בפעמים הראשונות שתתעסקו עם מילונים, יש סיכוי לא מבוטל שתקבלו <code>KeyError</code> שנראה כך:<br>
</p>
End of explanation
loved_animals = {'Alice': 'Cat', 'Mad hatter': 'Hare', 'Achiles': 'Tortoise'}
print('Achiles' in loved_animals)
Explanation: <span style="text-align: right; direction: rtl; float: right; clear: both;"><code>in</code> במילונים</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
יש כמה דרכים לפתור בעיה זו.<br>
דרך אפשרית אחת היא לבדוק שהמפתח קיים לפני שאנחנו ניגשים אליו:</p>
End of explanation
loved_animals = {'Alice': 'Cat', 'Mad hatter': 'Hare', 'Achiles': 'Tortoise'}
if 'Achiles' in loved_animals:
    value = loved_animals['Achiles']
else:
    value = 'Pony'
print(value)
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
כאן השתמשנו באופרטור <code>in</code> כדי לבדוק אם מפתח מסוים נמצא במילון.<br>
נוכל גם לבקש את הערך לאחר שבדקנו שהוא קיים:
</p>
End of explanation
def get_value(dictionary, key, default_value):
    if key in dictionary:
        return dictionary[key]
    else:
        return default_value
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
בקוד שלמעלה, השתמשנו באופרטור ההשוואה <code>in</code> כדי לבדוק אם מפתח מסוים ("אכילס") קיים בתוך המילון שיצרנו בשורה הראשונה.<br>
אם הוא נמצא שם, חילצנו את הערך שמוצמד לאותו מפתח (ל"אכילס"). אם לא, המצאנו ערך משלנו – "פוני".<br>
</p>
<div class="align-center" style="display: flex; text-align: right; direction: rtl;">
    <div style="display: flex; width: 10%; float: right; ">
        <img src="images/warning.png" style="height: 50px !important;" alt="אזהרה!"> 
    </div>
    <div style="width: 90%">
        <p style="text-align: right; direction: rtl;">
            מעבר על מילון יחזיר בכל חזרור מפתח מהמילון, ללא הערך הקשור אליו.<br>
            מסיבה זו, אופרטור ההשוואה <code>in</code> יבדוק רק אם קיים <em>מפתח</em> מסוים במילון, ולא יבדוק אם ערך שכזה קיים.
        </p>
    </div>
</div>
<div class="align-center" style="display: flex; text-align: right; direction: rtl; clear: both;">
    <div style="display: flex; width: 10%; float: right; clear: both;">
        <img src="images/exercise.svg" style="height: 50px !important;" alt="תרגול"> 
    </div>
    <div style="width: 70%">
        <p style="text-align: right; direction: rtl; float: right; clear: both;">
            כתבו פונקציה שמקבלת שלושה פרמטרים: מילון, מפתח וערך ברירת מחדל.<br>
            הפונקציה תחפש את המפתח במילון, ואם הוא קיים תחזיר את הערך שלו.<br>
            אם המפתח לא קיים במילון, הפונקציה תחזיר את ערך ברירת המחדל.
        </p>
    </div>
    <div style="display: flex; width: 20%; border-right: 0.1rem solid #A5A5A5; padding: 1rem 2rem;">
        <p style="text-align: center; direction: rtl; justify-content: center; align-items: center; clear: both;">
            <strong>חשוב!</strong><br>
            פתרו לפני שתמשיכו!
        </p>
    </div>
</div>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
ננסה לכתוב את הרעיון בקוד שלמעלה כפונקציה כללית:
</p>
End of explanation
loved_animals = {'Alice': 'Cat', 'Mad hatter': 'Hare', 'Achiles': 'Tortoise'}
print("Mad hatter: " + get_value(loved_animals, 'Mad hatter', 'Pony'))
print("Queen of hearts: " + get_value(loved_animals, 'Queen of hearts', 'Pony'))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
הפונקציה שלמעלה מקבלת מילון, מפתח וערך ברירת מחדל.<br>
אם היא מוצאת את המפתח במילון, היא מחזירה את הערך של אותו מפתח.<br>
אם היא לא מוצאת את המפתח במילון, היא מחזירה את ערך ברירת המחדל שנקבע.
</p>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
נבדוק שהפונקציה עובדת:
</p>
End of explanation
loved_animals = {'Alice': 'Cat', 'Mad hatter': 'Hare', 'Achiles': 'Tortoise'}
print("Mad hatter: " + loved_animals.get('Mad hatter', 'Pony'))
print("Queen of hearts: " + loved_animals.get('Queen of hearts', 'Pony'))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
ובכן, זו פונקציה כייפית. כמה נוח היה לו היא הייתה פעולה של מילון.</p>
<span style="text-align: right; direction: rtl; float: right; clear: both;">הפעולה <code>get</code> במילונים</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
מי היה מאמין, יש פעולה כזו במילונים! ננסה להפעיל אותה על המילון שלנו.<br>
שימו לב לצורת הקריאה לפעולה, ששונה מהקריאה לפונקציה שכתבנו למעלה – שם המשתנה של המילון בא לפני שם הפעולה. מדובר בפעולה, ולא בפונקציה:
</p>
End of explanation
loved_animals = {'Alice': 'Cat', 'Mad hatter': 'Hare', 'Achiles': 'Tortoise'}
print(loved_animals.get('Mad hatter'))
print(loved_animals.get('Queen of hearts'))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
טריק קסום אחרון שנראה הוא שהפעולה <code>get</code> סלחנית ממש, ומתפקדת גם אם לא נותנים לה ערך ברירת מחדל.<br>
אם תספקו רק את שם המפתח שממנו תרצו לאחזר ערך, היא תחפש אותו ותחזיר את הערך שלו, אם הוא קיים.<br>
אם המפתח לא קיים ולא סופק ערך ברירת מחדל, היא תחזיר את הערך <code>None</code>:
</p>
End of explanation
decryption_key = {
    'O': 'A', 'D': 'B', 'F': 'C', 'I': 'D', 'H': 'E',
    'G': 'F', 'L': 'G', 'C': 'H', 'K': 'I', 'Q': 'J',
    'B': 'K', 'J': 'L', 'Z': 'M', 'V': 'N', 'S': 'O',
    'R': 'P', 'M': 'Q', 'X': 'R', 'E': 'S', 'P': 'T',
    'A': 'U', 'Y': 'V', 'W': 'W', 'T': 'X', 'U': 'Y',
    'N': 'Z',
}
SONG = 
sc, kg pchxh'e svh pckvl k covl svps
pcop lhpe zh pcxsalc pch vklcp
k okv'p lsvvo is wcop k isv'p wovp ps
k'z lsvvo jkyh zu jkgh
eckvkvl jkbh o ikozsvi, xsjjkvl wkpc pch ikfh
epovikvl sv pch jhilh, k ecsw pch wkvi csw ps gju
wchv pch wsxji lhpe kv zu gofh
k eou, coyh o vkfh iou
coyh o vkfh iou
Explanation: <div class="align-center" style="display: flex; text-align: right; direction: rtl;">
    <div style="display: flex; width: 10%; float: right; ">
        <img src="images/recall.svg" style="height: 50px !important;" alt="תזכורת"> 
    </div>
    <div style="width: 90%">
        <p style="text-align: right; direction: rtl;">
            הערך המיוחד <code>None</code> הוא דרך פייתונית להגיד "כלום".<br>
            אפשר לדמיין אותו כמו רִיק (וָקוּם). לא הערך המספרי אפס, לא <code>False</code>. פשוט כלום.
        </p>
    </div>
</div>
<span style="align: right; direction: rtl; float: right; clear: both;">מונחים</span>
<dl style="text-align: right; direction: rtl; float: right; clear: both;">
<dt>מילון</dt><dd>טיפוס פייתוני שמאפשר לנו לשמור זוגות סדורים של מפתחות וערכים, שבהם כל מפתח מצביע על ערך.</dd>
<dt>מפתח</dt><dd>הנתון שלפיו נחפש את הערך הרצוי במילון, ויופיע כאיבר הראשון בזיווג שבין מפתח לערך.</dd>
<dt>ערך</dt><dd>הנתון שעליו מצביע המפתח במילון, יתקבל כאשר נחפש במילון לפי אותו מפתח. יופיע כאיבר השני בזיווג שבין מפתח לערך.<dd>
<dt>זוג סדור</dt><dd>זוג של שני איברים הקשורים זה לזה. במקרה של מילון, מפתח וערך.</dd>
</dl>
<span style="align: right; direction: rtl; float: right; clear: both;">תרגילים</span>
<span style="align: right; direction: rtl; float: right; clear: both;">מסר של יום טוב</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
יוגב נבו קיבל מסר מוצפן מאדון יום טוב, והצליח לשים את ידו על שיטה לפענוח המסר.<br>
כדי לפענח את המסר, החליפו כל אות במסר הסודי באות התואמת לה, לפי המילון המופיע למטה.<br>
לדוגמה, דאגו שכל המופעים של האות O במסר <var>SONG</var> יוחלפו באות A.
</p>
End of explanation
encryption_key = {
    'T': '1', 'F': '6', 'W': 'c', 'Y': 'h', 'B': 'k',
    'P': '~', 'H': 'q', 'S': 's', 'E': 'w', 'Q': '@',
    'U': '$', 'M': 'i', 'I': 'l', 'N': 'o', 'J': 'y',
    'Z': 'z', 'G': '!', 'L': '#', 'A': '&', 'O': '+',
    'D': ',', 'R': '-', 'C': ':', 'V': '?', 'X': '^', 
    'K': '|',
}
SONG = 
l1's ih #l6w
l1's o+c +- ow?w-
l &lo'1 !+oo& #l?w 6+-w?w-
l y$s1 c&o1 1+ #l?w cql#w l'i &#l?w
(l1's ih #l6w)
ih qw&-1 ls #l|w &o +~wo ql!qc&h
#l|w 6-&o|lw s&l,
l ,l, l1 ih c&h
l y$s1 c&o1 1+ #l?w cql#w l'i &#l?w
l1's ih #l6w
Explanation: <span style="align: right; direction: rtl; float: right; clear: both;">מראה מראה שעל הקיר</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
חברו של יום טוב, חיים, שלח ליום טוב מסר מוצפן.<br>
למרבה הצער יוגב שם את ידיו רק על מפת ההצפנה, ולא על מפת הפענוח.<br>
צרו ממילון ההצפנה מילון פענוח, שבו:<br>
</p>
<ul style="text-align: right; direction: rtl; float: right; clear: both;">
    <li>הערכים במילון הפענוח שתיצרו הם המפתחות ממילון ההצפנה.</li>
    <li>המפתחות במילון הפענוח שתיצרו הם הערכים ממילון ההצפנה.</li> 
</ul>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
לדוגמה, המילון <code dir="ltr" style="direction: ltr;">{'a': '1', 'b': 2}</code> יהפוך למילון <code dir="ltr" style="direction: ltr;">{'1': 'a', '2': 'b'}</code>.<br>
השתמשו במילון הפענוח שיצרתם כדי לפענח את המסר שנשלח.
</p>
End of explanation
<END_TASK>