<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:  <div class="align-center" style="display
Step2:  <div class="align-center" style="display
Step3:  <p style="text-align
Step4:  <span style="text-align
Step5:  <p style="text-align
Step6:  <span style="text-align
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:  <span style="text-align
Step13:  <p style="text-align
Step14:  <p style="text-align
Step15:  <p style="text-align
Step16:  <div class="align-center" style="display
Step17:  <span style="text-align
Step18:  <span style="text-align
Step19:  <p style="text-align
Step20:  <p style="text-align
Step21:  <p style="text-align
Step22:  <p style="text-align
Step23:  <p style="text-align
Step24:  <div class="align-center" style="display
Step25:  <p style="text-align
Step26:  <p style="text-align
Step27:  <p style="text-align
Step28:  <table style="font-size
Step29:  <p style="text-align
Step30:  <p style="text-align
Step31:  <p style="text-align
Step32:  <div class="align-center" style="display
Step33:  <p style="text-align
Step34:  <div class="align-center" style="display
Step35:  <p style="text-align
Step36:  <p style="text-align
Step37:  <span style="text-align
Step38:  <p style="text-align
Step39:  <div class="align-center" style="display
Step40:  <p style="text-align
Step41:  <p style="text-align
Step42:  <p style="text-align
Step43:  <span style="text-align
Step45:  <p style="text-align
Step46:  <span style="text-align
Step47:  <span style="text-align
<ASSISTANT_TASK:>
Python Code:
print(abs(-5))
numbers = [5, -5, 1.337, -1.337]
for number in numbers:
    print(f"abs({number:>6}) = {abs(number)}")
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>מציאת הערך הקטן או הגדול ביותר ברשימת ערכים.</li>
    <li>יצירת רשימת מספרים המתחילה בערך מסוים ומסתיימת בערך אחר.</li>
    <li>שינוי מיקום הערכים לפי סדר מסוים.</li>
    <li>המרה של ערך כלשהו למספר, למחרוזת, לבוליאני או לרשימה (נשמע מוכר?)</li>
</ul>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    כדי שלא נצטרך לכתוב שוב ושוב את אותו פתרון, שפות רבות מצוידות בכלים מוכנים מראש שמטרתם לפתור בעיות נפוצות.<br>
    פייתון מתגאה בכך שהיא שפה ש"הבטריות בה כלולות" (batteries included), היגד שנועד לתאר את העובדה שהיא מכילה פתרונות מוכנים לאותן בעיות.<br>
    במחברת זו נכיר חלק מהפונקציות שפייתון מספקת לנו במטרה להקל על חיינו.
</p>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    השם הנפוץ עבור הפונקציות הללו הוא <dfn>builtins</dfn>, ואפשר למצוא את התיעוד של כולן <a href="https://docs.python.org/3/library/functions.html">כאן</a>. 
</p>
<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>
            חלק מהפתרונות האפשריים: <span style="background: black;">len, int, float, str, list, type</span>
        </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;">
    <div style="display: flex; width: 10%; float: right; ">
        <img src="images/tip.png" style="height: 50px !important;" alt="טיפ!"> 
    </div>
    <div style="width: 90%">
        <p style="text-align: right; direction: rtl;">
            בהמשך המחברת ישנן דוגמאות עבור כל פונקציה חדשה שנכיר.<br>
            למען הבהירות אני מדפיס דוגמה בודדת, ואז אני משתמש בלולאה כדי להדפיס כמה דוגמאות ברצף.<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;">
    ישנן פעולות מתמטיות שנצטרך לעיתים תכופות, שאת חלקן אפילו מימשנו שוב ושוב לאורך הקורס.<br>
    נראה מה יש לארגז הכלים של פייתון להציע לנו.
</p>
<span style="text-align: right; direction: rtl; float: right; clear: both;">ערך מוחלט</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    הפונקציה <code>abs</code> מחזירה את הערך המוחלט של המספר שנעביר לה.<br>
    אם נעביר לה כארגומנט מספר שלם או עשרוני, היא תחזיר את המרחק של המספר מ־0 על ציר המספרים:<br>
</p>
End of explanation
numbers = [6, 7, 3, 4, 5]
words = ['apple', 'ginger', 'tomato', 'sushi']
print(max(numbers))
print(f"max(numbers) = {max(numbers)}")
print(f"min(numbers) = {min(numbers)}")
print(f"max(words) = {max(words)}")
print(f"min(words) = {min(words)}")
Explanation: <div class="align-center" style="display: flex; text-align: right; direction: rtl;">
    <div style="display: flex; width: 10%; float: right; ">
        <img src="images/tip.png" style="height: 50px !important;" alt="טיפ!"> 
    </div>
    <div style="width: 90%">
        <p style="text-align: right; direction: rtl;">
            המשמעות של <code dir="ltr" style="direction: ltr">:>6</code> ב־fstring היא "דאג שיהיו לפחות 6 תווים, וישר את הערך לימין".<br>
            אפשר להחליף את <code dir="ltr" style="direction: ltr">&gt;</code> בתו <code dir="ltr" style="direction: ltr">^</code> לצורך יישור לאמצע, או בתו <code dir="ltr" style="direction: ltr">&lt;</code> לצורך יישור לשמאל.
        </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;">
    הפונקציות <code>max</code> ו־<code>min</code> מקבלות iterable, ומחזירות את האיבר הגבוה או הנמוך ביותר ב־iterable (בהתאמה).
</p>
End of explanation
words.append('ZEBRA')
print(f"Minimum in {words} is {min(words)}??")
Explanation: <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>
    כשמדובר ב־iterable שיש בו מחרוזות, פייתון מוצאת את הערך המרבי או המזערי לפי הייצוג המספרי של האותיות באותן מחרוזות.<br>
    מהסיבה הזו, הסידור האלפבתי לא יחזיר את הערך הרצוי במצב שבו יש גם אותיות גדולות וגם אותיות וקטנות: 
        </p>
    </div>
</div>
End of explanation
numbers = [1, 1, 2, 3, 5, 8]
sum(numbers)
i = 1
while i <= len(numbers):
    sum_until_i = sum(numbers[:i])
    print(f"The sum of the first {i} items in 'numbers' is {sum_until_i}")
    i = i + 1
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    זה קורה כיוון שהערכים המספריים של אותיות גדולות קטנים מאלו של אותיות קטנות.<br>
    הערך המספרי של Z במילה <em>ZEBRA</em> הוא 90, והערך המספרי של a (במילה <em>apple</em>, שציפינו שתיחשב כקטנה ביותר) הוא 97.
</p>
<span style="text-align: right; direction: rtl; float: right; clear: both;">סכום</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    אפשר לחשב את סכום האיברים ב־iterable באמצעות הפונקציה <code>sum</code>: 
</p>
End of explanation
number = 5.9
round(number)
numbers = [6, 3.1415, 0.9, -0.9, 0.5, -0.5]
for number in numbers:
    print(f"round({number:>6}) = {round(number)}")
Explanation: <span style="text-align: right; direction: rtl; float: right; clear: both;">עיגול</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    אפשר גם לעגל מספרים בעזרת הפונקציה <code>round</code>: 
</p>
End of explanation
pi = 3.141592653589793
round(pi, 3)  # הפרמטר השני פה, 3, מייצג את הדיוק
numbers = [6, 3.1415, 0.9, -0.9, 0.5, -0.5]
round_options = [-1, 1, 2, 3]
for number in numbers:
    for round_argument in round_options:
        result = round(number, round_argument)
        print(f"round({number:>6}, {round_argument}) = {result}")
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    ואפשר להחליט על מספר הספרות אחרי הנקודה שלפיו העיגול יתבצע: 
</p>
End of explanation
list('hello')  # Iterable -> List
Explanation: <span style="text-align: right; direction: rtl; float: right; clear: both;">המרות</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    טוב, על המרות (casting) כבר למדנו.<br>
    אבל בואו בכל זאת נראה כמה דוגמאות מגניבות.
</p>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    אפשר להמיר מחרוזת לרשימה. הפעולה הזו תפריד כל אחת מהאותיות לתא נפרד ברשימה:
</p>
End of explanation
bool_checks = [
    'hello', '', 0, 1, -1, 0.0, 0.1, 1000, '\n', ' ', [], {}, [1],
]
for check in bool_checks:
    print(f"bool({check!r:>7}) is {bool(check)}")
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    עוד פרט טריוויה נחמד הוא שלכל ערך בפייתון יש ערך בוליאני שקול.<br>
    בדרך כלל, ערכים ריקים שקולים ל־<code>False</code> וערכים שאינם ריקים שקולים ל־<code>True</code>:
</p>
End of explanation
print(int(True))
print(int(False))
Explanation: <div class="align-center" style="display: flex; text-align: right; direction: rtl;">
    <div style="display: flex; width: 10%; float: right; ">
        <img src="images/tip.png" style="height: 50px !important;" alt="טיפ!"> 
    </div>
    <div style="width: 90%">
        <p style="text-align: right; direction: rtl;">
            המשמעות של <code dir="ltr" style="direction: ltr">!r</code> ב־fstring היא "הצג את הערך בתצורתו הגולמית" (raw).<br>
            לדוגמה, מחרוזות יוצגו עם הגרשיים משני צידיהן.
        </p>
    </div>
</div>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    אפשר להמיר ערכים בוליאניים למספר שלם:
</p>
End of explanation
stock = [('apples', 2), ('banana', 3), ('crembo', 4)]
print(dict(stock))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    מה בנוגע לטריקים על מילונים?<br>
    אם יש לנו iterable שמכיל זוגות של ערכים, אפשר להפוך אותו למילון:
</p>
End of explanation
print(int(5.5))
print(float('5.5'))
print(str(True))
print(bool(0))
print(dict([('name', 'Yam'), ('age', 27)]))
tuple_until_4 = (1, 2, 3, 4)
print(list(tuple_until_4))
print(tuple('yo!'))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    וכטיפ כללי, אפשר להמיר את סוג הערכים שלנו לטיפוס שונה, בעזרת הפונקציה שנקראת על שם הטיפוס שאליו אנחנו רוצים להמיר:
</p>
End of explanation
print(list(5))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    אבל צריך לזכור שלא כל טיפוס אפשר להמיר לטיפוס אחר:
</p>
End of explanation
values = ['1337', [1, 3, 3, 7], 1337, ['1', '3', '3', '7']]
for value in values:
    id_of_value = id(value)
    print(f'id({str(value):>20}) -> {id_of_value}')
Explanation: <span style="text-align: right; direction: rtl; float: right; clear: both;">מאחורי הקלעים של פייתון</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    ישנן פונקציות מובנות רבות שמטרתן להנגיש לנו דברים שקורים מאחורי הקלעים של פייתון. במחברת זו נסביר על שלוש מהן.
</p>
<span style="text-align: right; direction: rtl; float: right; clear: both;">id</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    על הפונקציה <code>id</code> כבר למדנו בעבר. היא מקבלת כארגומנט ערך, ומחזירה לנו את "הזהות" שלו – ערך אחר שמייצג רק את אותו.<br>
    בגרסת הפייתון שאנחנו משתמשים בה, מדובר בכתובת של הערך ב<a href="https://he.wikipedia.org/wiki/%D7%96%D7%99%D7%9B%D7%A8%D7%95%D7%9F_%D7%92%D7%99%D7%A9%D7%94_%D7%90%D7%A7%D7%A8%D7%90%D7%99%D7%AA">זיכרון המחשב</a>.<br>
    כל אדם שיריץ את הקוד הבא יקבל ערכים שונים, אבל לעולם לא יודפסו לו 2 ערכים זהים באותה ריצה.<br>
    הסיבה לכך שתמיד יודפסו 4 ערכים שונים היא שכל הנתונים שמופיעים ברשימה <var>values</var> שונים זה מזה.
</p>
End of explanation
song1 = ["I've", 'got', 'a', 'lovely', 'bunch', 'of', 'coconuts']
song2 = song1  # שתי הרשימות כרגע מצביעות לאותו מקום
song3 = song1[:]  # הערך זהה, אך שכפלנו את הרשימה כך שהמשתנה הזה יצביע למקום אחר
print(f"id(song1): {id(song1)}")
print(f"id(song2): {id(song2)}  # Same id!")
print(f"id(song3): {id(song3)}  # Another id!")
# נשים לב שהן מתנהגות בהתאם:
song2.append("🎵")
print(f"song1: {song1}")
print(f"song2: {song2}")
print(f"song3: {song3}")
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    אם ניצור מצב שבו 2 שמות מצביעים על אותו ערך בדיוק, <code>id</code> תחזיר את אותה התוצאה עבור שני הערכים:
</p>
End of explanation
collections_of_numbers = [[0, 0, 0]] * 3  # ניצור 3 רשימות של 3 איברים בכל אחת
print(collections_of_numbers)
collections_of_numbers[0].append(100)  # נוסיף את האיבר 100 לרשימה הראשונה בלבד
print(collections_of_numbers)
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    הפונקציה הזו יכולה לסייע לנו להגיע לתובנות בנוגע לדרך שבה פייתון עובדת בכל מיני מצבים.<br>
    קשה להבין, לדוגמה, מה קורה בקוד הבא:
</p>
End of explanation
print(id(collections_of_numbers[0]))
print(id(collections_of_numbers[1]))
print(id(collections_of_numbers[2]))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    בדיקה בעזרת <code>id</code> תעזור לנו לראות שהרשימות הפנימיות בתוך <var>collections_of_numbers</var> מצביעות לאותו מקום:
</p>
End of explanation
dir('hello')
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;">
            נסו לכתוב קוד של שורה אחת או יותר, שיחליף את השורה הראשונה בקוד שלמעלה.<br>
            גרמו לכך שהקוד שמוסיף את הערך 100 לרשימה הראשונה לא ישפיע על שאר הרשימות.
        </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;">dir</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    גם על הפונקציה <code>dir</code> כבר למדנו. ראיתם אותה לאחרונה במחברת שעסקה בדוקומנטציה.<br>
    הפונקציה <code>dir</code> תחזיר לנו את כל הפעולות שאפשר לבצע על משתנה מסוים או על טיפוס מסוים.<br>
    נוכל להעביר לה כארגומנט את הערך שנרצה להבין מה הפעולות שאפשר לבצע עליו:
</p>
End of explanation
dir(str)
Explanation: <span style="text-align: right; direction: rtl; float: right; clear: both;">או שנוכל להעביר לה ממש שם של טיפוס:</span>
End of explanation
x = []
eval("x.append('So lonely')")
print(x)
Explanation: <span style="text-align: right; direction: rtl; float: right; clear: both;">eval</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    על <code>eval</code> אנחנו מלמדים בעיקר כדי להזהיר ממנה –  זו פונקציה שאחראית למחדלי אבטחה בכל שפת תכנות שבה היא קיימת.<br>
    אתם לא אמורים להשתמש בה בקורס, וכדאי לזכור שכשהתשובה היא <code>eval</code>, ברוב המוחלט של המקרים שאלתם את השאלה הלא נכונה.
</p>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    אחרי ההקדמה המלודרמטית, נספר לכם ש־<code>eval</code> (מלשון evaluation) פשוט מקבלת קוד כמחרוזת, ומריצה אותו בעזרת פייתון.
</p>
End of explanation
# לנסות בבית עם כפפות – בסדר. לא לכתוב בשום קוד אחר
print(eval(input("Please enter any mathematical expression: ")))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    לעיתים קרובות הפיתוי להשתמש ב־<code>eval</code> הוא גדול.<br>
    אפשר לתכנת, לדוגמה, את המחשבון מהתרגול בשבוע השני בצורה הפשוטה הבאה:
</p>
End of explanation
max_number = int(input())
current_number = 0
total = 0
while current_number <= max_number:
    total = total + current_number
    current_number = current_number + 1
print(total)
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    אבל כשחושבים על זה – המשתמש שמתבקש להכניס תרגיל מתמטי, יכול להריץ כל קוד שיתחשק לו, והקוד הזה יבוצע!<br>
    הוא יכול לקרוא קבצים שנמצאים על מחשב או למחוק אותם, לחטט בסיסמאות, ולמעשה – לעשות ככל העולה על רוחו.<br>
    לקריאה נוספת על הסכנות, חפשו על <a href="https://en.wikipedia.org/wiki/Code_injection">code injection</a>.
</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;">
    פעמים רבות אנחנו נתקלים במצבים שבהם אנחנו רוצים לעבור על כל המספרים מ־0 ועד ערך מסוים.<br>
    לדוגמה, כך פתרנו את התרגיל שמחשב את סכום המספרים עד מספר שהתקבל כקלט:
</p>
End of explanation
for i in range(5):
    print(i)
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    מטרת הפונקציה <code>range</code> היא לפתור לנו את הבעיה הזו בקלות.<br>
    תנו ל־<code>range</code> מספר כארגומנט, והיא תחזיר לכם iterable שמכיל את כל המספרים הטבעיים עד המספר שנתתם לה, ללא המספר האחרון:
</p>
End of explanation
for i in range(12, 14):
    print(i)
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    הפונקציה יודעת גם לקבל ערך שממנו היא תתחיל לספור:
</p>
End of explanation
for i in range(0, 101, 10):
    print(i)
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    וגם ערך דילוג, שקובע על כמה מספרים <code>range</code> תדלג בכל פעם:
</p>
End of explanation
sorted('spoilage')
Explanation: <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;">
            הפונקציה <code>range</code> מזכירה את פעולת החיתוך מהשבוע השלישי, שבה משתמשים בסוגריים מרובעים ובנקודתיים.<br>
            <code>range</code>, לעומת חיתוך, היא פונקציה – קוראים לה בעזרת סוגריים עגולים, ומפרידים בין הארגומנטים שנשלחים אליה בעזרת פסיקים.
        </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;">
            כתבו בעצמכם קוד שמחשב את סכום המספרים מ־0 ועד המספר שהתקבל כקלט.<br>
            השתמשו ב־<code>range</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>
<span style="text-align: right; direction: rtl; float: right; clear: both;">סידור</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    עד כה ארגז הכלים שלנו כלל רק את פעולת הסידור ששייכת לרשימות, <code>sort</code>.<br>
    אף שמעשית רוב פעולות הסידור מבוצעות על רשימות, לפעמים יעלה הצורך לסדר טיפוסי נתונים אחרים.<br>
    במקרים האלה נשתמש בפונקציה המובנית <code>sorted</code>:
</p>
End of explanation
numbers = (612314, 4113, 1, 11, 31)
sorted(numbers)
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    <code>sorted</code> מקבלת iterable, ומחזירה רשימה מסודרת של האיברים ב־iterable.
</p>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    נראה דוגמה נוספת של סידור tuple.<br>
    שימו לב שטיפוס הנתונים שמוחזר מ־<code>sorted</code> הוא תמיד רשימה:
</p>
End of explanation
sorted('deflow', reverse=True)
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    גם ל־<code>sorted</code> וגם לפעולה <code>sort</code> שיכולה להתבצע על רשימות, יש 2 פרמטרים שלא למדנו עליהם.<br>
    לפרמטר הראשון קוראים <em>reverse</em>, והוא הפשוט להבנה מבין השניים – ברגע שמועבר אליו <var>True</var>, הוא מחזיר את הרשימה מסודרת בסדר יורד:</p>
End of explanation
staff = ["Dafi", "Efrat", "Ido", "Itamar", "Yam"]
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    הפרמטר השני, <em>key</em>, מסובך קצת יותר להבנה.<br>
    כשנעביר לפרמטר הזה פונקציה, הסידור של איברי ה־iterable יתבצע לפי הערך שחוזר מהפונקציה הזו עבור כל אחד מהאיברים שצריך למיין.<br>
    מבולבלים? נראה, לדוגמה, את הרשימה הבאה, שמורכבת משמות אנשי הסגל של אחד מהמחזורים הקודמים:
</p>
End of explanation
staff = sorted(staff, key=len)
print(staff)
Explanation: <table style="font-size: 2rem; border: 0px solid black; border-spacing: 0px;">
    <tr>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-bottom: 1px solid;">0</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">1</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">2</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">3</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">4</td>
    </tr>
    <tbody>
        <tr>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Dafi"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Efrat"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Ido"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Itamar"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Yam"</td>
        </tr>
        <tr style="background: #f5f5f5;">
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777; text-align: right;">-5</td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777; text-align: right; border-left: 1px solid #555555;">-4</td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777; text-align: right; border-left: 1px solid #555555;">-3</td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777; text-align: right; border-left: 1px solid #555555;">-2</td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777; text-align: right; border-left: 1px solid #555555;">-1</td>
        </tr>
    </tbody>
</table>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    אם ארצה לסדר את הרשימה הזו לפי האורך (<code>len</code>) של שמות כל אחד מאנשי הסגל, אשתמש ב־key בצורה הבאה:
</p>
End of explanation
paintings = ['Mona Lisa', 'The Creation of Adam', 'The Scream', 'The Starry Night']
artists = ['Leonardo da Vinci', 'Michelangelo', 'Edvard Munch', 'Vincent van Gogh']
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    מה קרה שם בפועל?<br>
    הפונקציה <code>len</code> הופעלה על כל אחד מהאיברים. התוצאות מופיעות בתרשים הבא:
</p>
<table style="font-size: 2rem; border: 0px solid black; border-spacing: 0px;">
    <tr>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-bottom: 1px solid;">0</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">1</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">2</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">3</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">4</td>
    </tr>
    <tbody>
        <tr>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Dafi"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Efrat"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Ido"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Itamar"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Yam"</td>
        </tr>
        <tr style="background: #f5f5f5; color: black;">
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center;"><strong>4</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>5</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>3</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>6</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>3</strong></td>
        </tr>
    </tbody>
</table>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    בפועל, אנחנו מחזיקים עכשיו רשימה ראשית (שמות אנשי הסגל), ועוד רשימה משנית שבה מאוחסנים אורכי האיברים שברשימה הראשית.<br>
    פייתון תמיין את הרשימה המשנית, ובכל פעם שהיא תזיז את אחד האיברים בה, היא תזיז איתו את האיבר התואם ברשימה המקורית:
</p>
<table style="font-size: 2rem; border: 0px solid black; border-spacing: 0px;">
    <tr>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-bottom: 1px solid;">0</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">1</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid; border-bottom: 1px solid; background: #d1d1d1;">2</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">3</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">4</td>
    </tr>
    <tbody>
        <tr>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Dafi"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Efrat"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid; background: #d1d1d1">"Ido"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Itamar"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Yam"</td>
        </tr>
        <tr style="background: #f5f5f5; color: black;">
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center;"><strong>4</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>5</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555; background: #d1d1d1"><strong>3</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>6</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>3</strong></td>
        </tr>
    </tbody>
</table>
<table style="font-size: 2rem; border: 0px solid black; border-spacing: 0px;">
    <tr>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid; border-bottom: 1px solid; background: #d1d1d1;">0</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-bottom: 1px solid; border-left: 1px solid #555555;">1</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">2</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">3</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">4</td>
    </tr>
    <tbody>
        <tr>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid; background: #d1d1d1">"Ido"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Dafi"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Efrat"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Itamar"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Yam"</td>
        </tr>
        <tr style="background: #f5f5f5; color: black;">
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555; background: #d1d1d1"><strong>3</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>4</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>5</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>6</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>3</strong></td>
        </tr>
    </tbody>
</table>
<span style="text-align: right; direction: rtl; float: right; clear: both;">הרשימה המשנית עדיין לא מסודרת. נמשיך:</span>
<table style="font-size: 2rem; border: 0px solid black; border-spacing: 0px;">
    <tr>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-bottom: 1px solid;">0</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-bottom: 1px solid; border-left: 1px solid #555555;;">1</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">2</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">3</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid; background: #d1d1d1;">4</td>
    </tr>
    <tbody>
        <tr>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid; border-left: 2px solid #555555;">"Ido"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Dafi"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Efrat"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Itamar"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid; background: #d1d1d1">"Yam"</td>
        </tr>
        <tr style="background: #f5f5f5; color: black;">
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 0px solid #555555;"><strong>3</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>4</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>5</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>6</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555; background: #d1d1d1"><strong>3</strong></td>
        </tr>
    </tbody>
</table>
<table style="font-size: 2rem; border: 0px solid black; border-spacing: 0px;">
    <tr>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-bottom: 1px solid;">0</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-bottom: 1px solid; border-left: 1px solid #555555; background: #d1d1d1;">1</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">2</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">3</td>
        <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; color: #777;  text-align: left; border-left: 1px solid #555555; border-bottom: 1px solid;">4</td>
    </tr>
    <tbody>
        <tr>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid; border-left: 2px solid #555555;">"Ido"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid; background: #d1d1d1;">"Yam"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Dafi"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Efrat"</td>
            <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; vertical-align: bottom; border: 2px solid;">"Itamar"</td>
        </tr>
        <tr style="background: #f5f5f5; color: black;">
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 0px solid #555555;"><strong>3</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555; background: #d1d1d1"><strong>3</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>4</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>5</strong></td>
            <td style="padding-left: 4px; padding-top: 2px; padding-bottom: 3px; font-size: 1.3rem; text-align: center; border-left: 1px solid #555555;"><strong>6</strong></td>
        </tr>
    </tbody>
</table>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    עכשיו הרשימה המשנית מסודרת, ואפשר להפסיק את פעולת הסידור.<br>
    הקסם הוא שאפשר להכניס ל־<code>key</code> כל פונקציה, ולקבל iterable מסודר לפי ערכי ההחזרה של אותה פונקציה עבור הערכים ב־iterable.
</p>
<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>
<span style="text-align: right; direction: rtl; float: right; clear: both;">צימוד ערכים</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    הרבה פעמים נגיע למצב שבו יש לנו 2 iterables ואנחנו מעוניינים לעבור על הערכים שלהם, זה לצד זה.<br>
    נניח שיש לנו רשימה של ציורים, ורשימה של הציירים שציירו אותם:
</p>
End of explanation
i = 0
max_iterations = len(paintings)
while i < max_iterations:
    artist = artists[i]
    painting = paintings[i]
    print(f"{artist} painted '{painting}'.")
    i = i + 1
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    צורה אחת לעבור על שתי הרשימות תהיה כזו:
</p>
End of explanation
zipped_values = zip(paintings, artists)
print(list(zipped_values))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
אבל אפשר להסכים על כך שהדרך הזו לא נוחה במיוחד.<br>
אפשרות אחרת היא להשתמש ב־<code>zip</code>, שיצמיד בין שני הערכים ויצור לנו את המבנה הבא:
</p>
End of explanation
for artist, painting in zip(artists, paintings):
    print(f"{artist} painted '{painting}'.")
Explanation: <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;">
            אם שתי הרשימות אינן זהות באורכן, <code>zip</code> לא יתייחס לאיברים העודפים של הרשימה הארוכה יותר.
        </p>
    </div>
</div>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
אחד השימושים האפשריים ל־<code>zip</code> הוא unpacking בתוך לולאת <code>for</code>:
</p>
End of explanation
paintings = ['Mona Lisa', 'The Creation of Adam', 'The Scream', 'The Starry Night']
artists = ['Leonardo da Vinci', 'Michelangelo', 'Edvard Munch', 'Vincent van Gogh']
years = [1503, 1512, 1893, 1889]
for artist, painting, year in zip(artists, paintings, years):
    print(f"{artist} painted '{painting}' in {year}.")
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
והיא אפילו לא מוגבלת ל־2 ארגומנטים בלבד:
</p>
End of explanation
paintings = ['Mona Lisa', 'The Creation of Adam', 'The Scream', 'The Starry Night']
artists = ['Leonardo da Vinci', 'Michelangelo', 'Edvard Munch', 'Vincent van Gogh']
artists_from_paintings = dict(zip(paintings, artists))
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;">
            יש טיפוס נתונים שהיה מתאים יותר למקרה הזה מאשר 2 רשימות. מהו לדעתכם?
        </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;">
שימוש נפוץ ל־<code>zip</code> הוא במקרה שיש לנו שתי רשימות שמתאימות זו לזו, ויחד יכולות ליצור מילון.<br>
אם רשימה אחת מתאימה להיות המפתחות במילון, והאחרת להיות הערכים באותו מילון, נוכל להשתמש ב־<code>zip</code> כדי לבצע את ההמרה:
</p>
End of explanation
print(artists_from_paintings.get('Mona Lisa'))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    עכשיו נוכל לשאול מי צייר את המונה ליזה:
</p>
End of explanation
for painting, artist in artists_from_paintings.items():
    print(f"{artist} painted '{painting}'.")
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    או לעבור על המילון ולהדפיס את הערכים, כמו שעשינו לפני כן:
</p>
End of explanation
print(ord('A'))
chars = 'a !א'
for char in chars:
    print(f"ord({char!r}) = {ord(char)}")
Explanation: <span style="text-align: right; direction: rtl; float: right; clear: both;">המרת תווים למספרים ולהפך</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    כפי שהסברנו במחברת קבצים בשבוע שעבר, לכל תו מוצמד מספר שמזהה אותו.<br>
    בעזרת הפונקציה <code>ord</code> נוכל לאחזר את הערך הזה:
</p>
End of explanation
ascii_numbers = [97, 32, 33, 1488]
for ascii_number in ascii_numbers:
    # המקפים שם כדי שתראו את הרווח :)
    print(f"chr({ascii_number:>4}) = -{chr(ascii_number)}-")
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    ויש גם דרך לעשות את הפעולה ההפוכה!<br>
    בעזרת הפונקציה <code>chr</code> נוכל לקבל את התו לפי המספר שמייצג אותו:
</p>
End of explanation
with open('resources/haiku.txt') as haiku:
    haiku_text = haiku.readlines()
line_number = 0
for line in haiku_text:
    print(f"{line_number}:\t{line.rstrip()}")
    line_number = line_number + 1
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;">
            כתבו תוכנית שמדפיסה זוג ערכים עבור כל מספר מ־9,760 ועד 10,100.<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>
<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
haiku_text_enumerated = enumerate(haiku_text)
print(list(haiku_text_enumerated))
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    חייבת להיות דרך טובה יותר!<br>
    הפונקציה המובנית <code>enumerate</code> מאפשרת למתכנת להצמיד מספר רץ ל־iterable:
</p>
End of explanation
for line_number, line in enumerate(haiku_text):
    print(f"{line_number}:\t{line.rstrip()}")
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    השימוש הנפוץ ביותר ל־<code>enumerate</code> הוא בלולאות <code>for</code>:
</p>
End of explanation
for line_number, line in enumerate(haiku_text, 1):
    print(f"{line_number}:\t{line.rstrip()}")
    line_number = line_number + 1
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    טריק מדליק: אם בא לנו להתחיל למספר ממספר שהוא לא 0, אפשר להעביר ל־<code>enumerate</code> את המספר הזה כפרמטר:
</p>
End of explanation
def create_chars_from_numbers(numbers):
    chars = []
    for number in numbers:
        chars.append(chr(number))
    return chars
def get_all_english_letters():
    first_letter = ord('a')
    last_letter = ord('z')
    all_letters_by_number = range(first_letter, last_letter + 1)
    all_letters = create_chars_from_numbers(all_letters_by_number)
    return all_letters
def get_ceaser_map():
    letters = get_all_english_letters()
    shifted_letters = letters[3:] + letters[:3]
    return dict(zip(letters, shifted_letters))
get_ceaser_map()
Explanation: <span style="text-align: right; direction: rtl; float: right; clear: both;">דוגמאות לשימושים</span>
<span style="text-align: right; direction: rtl; float: right;">מפת צופן קיסר</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    צופן קיסר היא שיטת הצפנה, שבה כל תו מוחלף בתו שנמצא 3 תווים אחריו באלף־בית של השפה.<br>
    בעברית, לדוגמה, האות א' תוחלף באות ד', האות ג' באות ו' והאות ת' באות ג'.<br>
    נבנה מפת פענוח לצופן קיסר בעזרת הפונקציות שלמדנו במחברת:
</p>
End of explanation
def encrypt(message, encryption_map):
    encrypted = ''
    for char in message.lower():
        # If we can't find the character, assume it is not encrypted.
        encrypted = encrypted + encryption_map.get(char, char)
    return encrypted
encryption_map = get_ceaser_map()
encrypted_message = encrypt('This is the encrypted message!', encryption_map)
print(encrypted_message)
def create_decryption_map(encryption_map):
    Actually just flip the keys and the values of the dictionary
    decryption_map = {}
    for key, value in encryption_map.items():
        decryption_map[value] = key
    return decryption_map
def decrypt(message, decryption_map):
    decrypted = ''
    for char in message.lower():
        # If we can't find the character, assume it is not encrypted.
        decrypted = decrypted + decryption_map.get(char, char)
    return decrypted
decryption_map = create_decryption_map(encryption_map)
decrypted_message = decrypt(encrypted_message, decryption_map)
print(decrypted_message)
Explanation: <p style="text-align: right; direction: rtl; float: right; clear: both;">
    ורק בשביל הכיף, נבנה קוד שיאפשר לנו להשתמש במפה כדי להצפין מסרים:
</p>
End of explanation
def convert_to_integers(numbers):
    integers = []
    for number in numbers:
        integers.append(int(number))
    
    return integers
numbers = input("Please enter numbers splitted by ',': ").split(',')
integers = convert_to_integers(numbers)
integers.sort(reverse=True)
for i, number in enumerate(integers):
    current_sum = sum(integers[:i+1])
    print(f"The sum until {number} is {current_sum}")
Explanation: <span style="text-align: right; direction: rtl; float: right;">סכימה מדורגת</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    נבנה תוכנה קצרה שמאפשרת למשתמש להזין מספרים, מסדרת אותם בסדר הפוך, ומדפיסה עבור כל איבר את סכום האיברים עד המיקום של אותו איבר:
</p>
End of explanation
def get_grades(student_name):
    grades = []
    grade = input(f'Please enter a grade for {student_name}: ')
    while grade.isdecimal():
        grades.append(int(grade))
        grade = input(f'Please enter another grade for {student_name}: ')
    return grades
def get_students():
    students = []
    student = input('Please enter a student: ')
    while student != '':
        students.append(student)
        student = input('Please enter another student: ')
    return students
def get_students_and_grades():
    grades = []
    students = get_students()
    for student in students:
        student_grades = get_grades(student)
        grades.append(student_grades)
    return zip(students, grades)
def get_average_grade(student_and_his_grades):
    grades = student_and_his_grades[1]
    if len(grades) == 0:
        return 0
    return sum(grades) / len(grades)
students_and_grades = get_students_and_grades()
students_sorted_by_grades = sorted(  # מפצלים שורה כדי שלא יהיו שורות ארוכות מדי
    students_and_grades, key=get_average_grade, reverse=True
)
best_student_name, best_grade = students_sorted_by_grades[0]
print(f"The best student is {best_student_name} with the grades: {best_grade}")
Explanation: <span style="text-align: right; direction: rtl; float: right;">ממוצע ציונים</span>
<p style="text-align: right; direction: rtl; float: right; clear: both;">
    קבלו רשימת שמות תלמידים, ועבור כל תלמיד את רשימת הציונים שלו.<br>
    הדפיסו את שם התלמיד שממוצע הציונים שלו הוא הגבוה ביותר, לצד הציונים שלו.
</p>
End of explanation
<END_TASK>