\n",
- "ממש בקרוב נצלול לעולם התכנות, שבו תוכלו להריץ דוגמאות קוד מעניינות. \n",
+ "
\n",
+ "ממש בקרוב נצלול לעולם התכנות, שבו תוכלו להריץ דוגמאות קוד מעניינות. \n",
"המחברת שלפניכם היא מחברת אינטראקטיבית שמאפשרת לנו להריץ קוד ולראות את התוצאות שלו בקלות.\n",
"
כדי להריץ את התוכן של תא מסוים, לחצו עליו כך שתופיע סביבו מסגרת, והקישו בו־זמנית על המקשים CTRL + ENTER במקלדת. \n",
- "לאחר שתעשו זאת, פייתון תעבד את הביטוי המופיע במשבצת ותציג לכם תשובה בהתאם. \n",
+ "
כדי להריץ את התוכן של תא מסוים, לחצו עליו כך שתופיע סביבו מסגרת, והקישו בו־זמנית על המקשים CTRL + ENTER במקלדת. \n",
+ "לאחר שתעשו זאת, פייתון תעבד את הביטוי המופיע במשבצת ותציג לכם תשובה בהתאם. \n",
"נסו את זה על המשבצת הבאה!
\n",
- "אחד הדברים שנעשה לא מעט בשבועות הקרובים זה להדפיס למסך. \n",
- "כדי לעשות את זה, נצטרך פשוט לכתוב print, לפתוח סוגריים, לכתוב ביטוי חוקי כלשהו ולסגור את הסוגריים. \n",
+ "
\n",
+ "אחד הדברים שנעשה לא מעט בשבועות הקרובים זה להדפיס למסך. \n",
+ "כדי לעשות את זה, נצטרך פשוט לכתוב print, לפתוח סוגריים, לכתוב ביטוי חוקי כלשהו ולסגור את הסוגריים. \n",
"בואו נסתכל על כמה דוגמאות:\n",
"
\n",
- " נהוג לרשום את הסוגריים סמוך למילה print, בלי רווחים לפני או אחרי הסוגריים. \n",
- " אם תשכחו סוגריים, או אם תפתחו סוגריים ותשכחו לסגור אותם, פייתון תתריע על שגיאה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " נהוג לרשום את הסוגריים סמוך למילה print, בלי רווחים לפני או אחרי הסוגריים. \n",
+ " אם תשכחו סוגריים, או אם תפתחו סוגריים ותשכחו לסגור אותם, פייתון תתריע על שגיאה. \n",
" זה לא באמת מפחיד אותנו, אבל כדאי לזכור שזו אחת הסיבות שאתם עלולים להיתקל בהודעות שגיאה.\n",
"
\n",
- "למרות השם הרשמי, מחרוזת היא בסך הכול רצף של תווים. מחרוזת יכולה להיות \"שלום עולם\", התוכן של הספר הארי פוטר ואפילו האות \"ש\" לבדה. \n",
- "במקרה שלנו, המחרוזת היא \"Hello World\". \n",
- "כדי שפייתון תזהה שמדובר במחרוזת, נהיה חייבים להקיף את המחרוזת בגרש (צ'וקו) או בגרשיים (צ'וקיים). \n",
- "פייתון נחמדה אלינו ולא באמת אכפת לה במה תשתמשו, כל עוד תתחילו בגרש ותסיימו בגרש, או תתחילו בגרשיים ותסיימו בגרשיים. \n",
+ "
\n",
+ "למרות השם הרשמי, מחרוזת היא בסך הכול רצף של תווים. מחרוזת יכולה להיות \"שלום עולם\", התוכן של הספר הארי פוטר ואפילו האות \"ש\" לבדה. \n",
+ "במקרה שלנו, המחרוזת היא \"Hello World\". \n",
+ "כדי שפייתון תזהה שמדובר במחרוזת, נהיה חייבים להקיף את המחרוזת בגרש (צ'וקו) או בגרשיים (צ'וקיים). \n",
+ "פייתון נחמדה אלינו ולא באמת אכפת לה במה תשתמשו, כל עוד תתחילו בגרש ותסיימו בגרש, או תתחילו בגרשיים ותסיימו בגרשיים. \n",
"בואו נסתכל על כמה דוגמאות:\n",
"
\n",
- " טעות נפוצה בקרב אנשים שמצטרפים לעולם התכנות, היא לשכוח את הגרש או את הגרשיים בסיום ו/או בתחילת המחרוזת. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " טעות נפוצה בקרב אנשים שמצטרפים לעולם התכנות, היא לשכוח את הגרש או את הגרשיים בסיום ו/או בתחילת המחרוזת. \n",
" אם תשכחו אותם, פייתון עלולה להתריע על שגיאה. זה לא באמת מפחיד אותנו, אבל כדאי לזכור שזו אחת הסיבות שאתם עלולים להיתקל בהודעות שגיאה.\n",
"
\n",
- "לפניכם כמה ביטויים בפייתון. מה לדעתכם מחרוזת תקינה ומה לא? \n",
- "רשמו בצד את התשובות שלכם, ורק אז עברו לתא שאחרי התרגיל כדי לבדוק אם עניתם נכונה על השאלות. \n",
+ "
\n",
+ "לפניכם כמה ביטויים בפייתון. מה לדעתכם מחרוזת תקינה ומה לא? \n",
+ "רשמו בצד את התשובות שלכם, ורק אז עברו לתא שאחרי התרגיל כדי לבדוק אם עניתם נכונה על השאלות. \n",
"זהירות! הטמנו שם כמה מוקשים ;)\n",
"
\n",
- "הוסיפו למחברת תא שבו ניתן לכתוב קוד. \n",
- "ניתן לעשות זאת בלחיצה על המשבצת הזו, ואז בלחיצה על b במקלדת. \n",
- "הלחיצה על b משמעה \"הוסף אזור קוד מתחת (below) למשבצת שסימנתי\". \n",
- "כתבו במשבצת קוד לבחירתכם. ודאו שהתא שמכיל את הקוד מסומן, ואז לחצו CTRL יחד עם ENTER כדי להריץ אותו. \n",
+ "
\n",
+ "הוסיפו למחברת תא שבו ניתן לכתוב קוד. \n",
+ "ניתן לעשות זאת בלחיצה על המשבצת הזו, ואז בלחיצה על b במקלדת. \n",
+ "הלחיצה על b משמעה \"הוסף אזור קוד מתחת (below) למשבצת שסימנתי\". \n",
+ "כתבו במשבצת קוד לבחירתכם. ודאו שהתא שמכיל את הקוד מסומן, ואז לחצו CTRL יחד עם ENTER כדי להריץ אותו. \n",
"
\n",
- "הדפיסו את הפזמון מהשיר האהוב עליכם! \n",
- "אם צריך, היעזרו בדוגמת ההדפסה שמופיעה בתחילת המחברת. \n",
- "שימו לב שניתן להדפיס יותר משורה אחת על ידי חזרה על print בכמה שורות נפרדות. \n",
+ "
\n",
+ "הדפיסו את הפזמון מהשיר האהוב עליכם! \n",
+ "אם צריך, היעזרו בדוגמת ההדפסה שמופיעה בתחילת המחברת. \n",
+ "שימו לב שניתן להדפיס יותר משורה אחת על ידי חזרה על print בכמה שורות נפרדות. \n",
"הוסיפו אזור קוד שבו תוכלו לכתוב את פתרון התרגיל.\n",
"
\n",
- "לפעמים נרצה לצרף דברי הסבר לקוד שכתבנו. \n",
- "כדי להוסיף הסברים לצד הקוד נשתמש בתו סולמית, ומייד אחריה נכתוב את ההסברים שרצינו לצרף. \n",
+ "
\n",
+ "לפעמים נרצה לצרף דברי הסבר לקוד שכתבנו. \n",
+ "כדי להוסיף הסברים לצד הקוד נשתמש בתו סולמית, ומייד אחריה נכתוב את ההסברים שרצינו לצרף. \n",
"החלקים האלו בקוד נקראים הערות, ופייתון מתעלמת מקיומם כשהיא מריצה את הקוד.\n",
"
\n",
- " הערות נועדו להסביר את הקוד שלכם למתכנתים אחרים שיקראו אותו בעתיד. \n",
- " בינתיים, אנחנו נשתמש בהערות כדי להבהיר ולהדגיש דוגמאות במחברת הקורס. \n",
+ "
\n",
+ " הערות נועדו להסביר את הקוד שלכם למתכנתים אחרים שיקראו אותו בעתיד. \n",
+ " בינתיים, אנחנו נשתמש בהערות כדי להבהיר ולהדגיש דוגמאות במחברת הקורס. \n",
" נהוג לכתוב הערות באנגלית, אבל רק לצורך הקורס שלנו, שמתקיים בעברית, נכופף קצת את החוקים.\n",
"
\n",
- " אין צורך לפחד מהמונח המאיים, מדובר פשוט בפעולות חשבון בסיסיות. בואו נראה מה פייתון יודעת לעשות. \n",
+ "
\n",
+ " אין צורך לפחד מהמונח המאיים, מדובר פשוט בפעולות חשבון בסיסיות. בואו נראה מה פייתון יודעת לעשות. \n",
" חשבו מה תהיה התוצאה בכל אחד מהתאים הבאים. לאחר שכתבתם בצד את התוצאה שעליה חשבתם, הריצו את התאים ובדקו אם צדקתם.\n",
"
חלוקת שלמים היא פעולה שתוצאתה תמיד מספר שלם, בניגוד לפעולת החילוק שאנחנו רגילים אליה (/).
\n",
- "\n",
- "
כאשר אנחנו עושים חלוקת שלמים מהצורה A // B, אנחנו למעשה מתכוונים לשאול:
\n",
- "\n",
- "
אם יש לי A משולשי פיצה, וחילקתי את כל משלושי הפיצה באופן שווה ל־B ילדים (תזהרו מלחתוך לי את המשולשים!), כמה משולשי פיצה יקבל כל ילד?
\n",
- "\n",
- "
לדוגמה: הביטוי 4 // 9, אומר שיש לנו 9 משולשי פיצה ו־4 ילדים רעבים. אם נחלק את משולשי הפיצה בין הילדים, נגלה שכל ילד יקבל 2 משולשים, ושנשאר משולש אחד שלא ניתן לחלק.
"
+ "### חלוקת שלמים\n",
+ "
חלוקת שלמים היא פעולה שתוצאתה תמיד מספר שלם, בניגוד לפעולת החילוק שאנחנו רגילים אליה (/).
\n",
+ "
כאשר אנחנו עושים חלוקת שלמים מהצורה A // B, אנחנו למעשה מתכוונים לשאול:
\n",
+ "
אם יש לי A משולשי פיצה, וחילקתי את כל משלושי הפיצה באופן שווה ל־B ילדים (תזהרו מלחתוך לי את המשולשים!), כמה משולשי פיצה יקבל כל ילד?
\n",
+ "
לדוגמה: הביטוי 4 // 9, אומר שיש לנו 9 משולשי פיצה ו־4 ילדים רעבים. אם נחלק את משולשי הפיצה בין הילדים, נגלה שכל ילד יקבל 2 משולשים, ושנשאר משולש אחד שלא ניתן לחלק.
למשולשי הפיצה שלא הצלחנו לחלק לילדים אנחנו קוראים שארית, וזו התוצאה שנקבל כשנכתוב את הסימן % במקום //. לדוגמה, אם היינו כותבים 4 % 9, היינו מקבלים 1, הרי הוא משולש הפיצה שנשאר מהדוגמה שלמעלה.
"
+ "###
שארית
\n",
+ "
למשולשי הפיצה שלא הצלחנו לחלק לילדים אנחנו קוראים שארית, וזו התוצאה שנקבל כשנכתוב את הסימן % במקום //. לדוגמה, אם היינו כותבים 4 % 9, היינו מקבלים 1, הרי הוא משולש הפיצה שנשאר מהדוגמה שלמעלה.
\n",
- "חובבי תה רציניים ידעו להגיד לכם, שחליטת התה שלכם צריכה להיעשות בטמפרטורה מסוימת מאוד, שתלויה בסוג התה שבידכם. \n",
- "כפלצן תה גדול, אני מזמין לעיתים קרובות תה ממחוזות מוזרים בעולם, שבהם מציגים את הטמפרטורה המושלמת לחליטת התה במעלות פרנהייט במקום בצלזיוס. \n",
- "לאחרונה קיבלתי תה יסמין שהיה צריך לחלוט ב־176 מעלות פרנהייט. \n",
+ "
\n",
+ "חובבי תה רציניים ידעו להגיד לכם, שחליטת התה שלכם צריכה להיעשות בטמפרטורה מסוימת מאוד, שתלויה בסוג התה שבידכם. \n",
+ "כפלצן תה גדול, אני מזמין לעיתים קרובות תה ממחוזות מוזרים בעולם, שבהם מציגים את הטמפרטורה המושלמת לחליטת התה במעלות פרנהייט במקום בצלזיוס. \n",
+ "לאחרונה קיבלתי תה יסמין שהיה צריך לחלוט ב־176 מעלות פרנהייט. \n",
"הדלקתי קומקום ועקבתי אחרי הטמפרטורה של המים. עזרו לי, והדפיסו את הטמפרטורה שאליה המים צריכים להגיע, במעלות צלזיוס.\n",
"
\n",
- "\n",
- "
\n",
- "הנוסחה להמרה מפרנהייט לצלזיוס היא (5 חלקי 9) כפול (מעלות בפרנהייט פחות 32). \n",
- "או, אם אתם מעדיפים כתיב מתמטי: $\\normalsize{C = \\frac{5}{9}\\times(F - 32)}$ \n",
- "לדוגמה, אם הייתי צריך לחלוט את התה שלי ב־212 מעלות פרנהייט, הייתי מצפה שתציגו לי 100, כיוון ש: $\\normalsize{C = \\frac{5}{9}\\times(212 - 32)} = 100$\n",
+ "
\n",
+ "הנוסחה להמרה מפרנהייט לצלזיוס היא (5 חלקי 9) כפול (מעלות בפרנהייט פחות 32). \n",
+ "או, אם אתם מעדיפים כתיב מתמטי: $\\normalsize{C = \\frac{5}{9}\\times(F - 32)}$ \n",
+ "לדוגמה, אם הייתי צריך לחלוט את התה שלי ב־212 מעלות פרנהייט, הייתי מצפה שתציגו לי 100, כיוון ש: $\\normalsize{C = \\frac{5}{9}\\times(212 - 32)} = 100$\n",
"
"
]
},
diff --git a/week1/3_Types.ipynb b/week1/3_Types.ipynb
index 22e7a6f..ecbe730 100644
--- a/week1/3_Types.ipynb
+++ b/week1/3_Types.ipynb
@@ -4,31 +4,31 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- ""
+ ""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "# סוגי ערכים (טיפוסים, או types)"
+ "# סוגי ערכים (טיפוסים, או types)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
כל ערך שאנחנו כותבים בפייתון הוא מסוג מסוים. עד כה למדנו על שלושה סוגי ערכים שקיימים בפייתון (איזה זריזים אנחנו!):
"
+ "
כל ערך שאנחנו כותבים בפייתון הוא מסוג מסוים. עד כה למדנו על שלושה סוגי ערכים שקיימים בפייתון (איזה זריזים אנחנו!):
\n",
- "טיפוסי נתונים מזכירים מצבי צבירה: כפי שניתן למצוא בטבע מים בצורות שונות (כנוזל – לשתייה, וכמוצק – קוביות קרח), \n",
- "כך בפייתון ניתן להשתמש בערך מסוים בכמה צורות. \n",
+ "
\n",
+ "טיפוסי נתונים מזכירים מצבי צבירה: כפי שניתן למצוא בטבע מים בצורות שונות (כנוזל – לשתייה, וכמוצק – קוביות קרח), \n",
+ "כך בפייתון ניתן להשתמש בערך מסוים בכמה צורות. \n",
"נניח, בערך 9.5 ניתן להשתמש גם כמספר (9.5) וגם כמחרוזת ('9.5'). השימוש בכל אחד מהם הוא למטרה אחרת.\n",
"
\n",
- " בניסוח רשמי או אקדמי משתמשים במינוח \"טיפוס\" או במינוח \"טיפוס נתונים\" כדי לסווג ערכים לקבוצות שונות. \n",
- " בתעשייה וביום־יום משתמשים במינוח \"סוג\". לדוגמה: מוישה, מאיזה סוג המשתנה age שהגדרת פה? \n",
- "
\n",
- "
\n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " בניסוח רשמי או אקדמי משתמשים במינוח \"טיפוס\" או במינוח \"טיפוס נתונים\" כדי לסווג ערכים לקבוצות שונות. \n",
+ " בתעשייה וביום־יום משתמשים במינוח \"סוג\". לדוגמה: מוישה, מאיזה סוג המשתנה age שהגדרת פה? \n",
+ "
כיוון שסוגי ערכים הם עניין מרכזי כל כך בפייתון, קיימת דרך לבדוק מה הוא הסוג של ערך מסוים. \n",
+ "
כיוון שסוגי ערכים הם עניין מרכזי כל כך בפייתון, קיימת דרך לבדוק מה הוא הסוג של ערך מסוים. \n",
"לפני שנציג לכם איך לגלות את הסוג של כל ערך (אף על פי שחשוב שתדעו לעשות את זה בעצמכם), אנחנו רוצים להציג לפניכם איך פייתון מכנה כל סוג נתונים:
\n",
- "\n",
"\n",
"\n",
"| שם בפייתון | שם באנגלית | שם בעברית |\n",
@@ -116,8 +115,8 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "\n",
- " כדי לראות את הסוג של ערך נתון, נשתמש ב־type(VALUE), כאשר במקום VALUE יופיע הערך אותו נרצה לבדוק.\n",
+ "\n",
+ " כדי לראות את הסוג של ערך נתון, נשתמש ב־type(VALUE), כאשר במקום VALUE יופיע הערך אותו נרצה לבדוק.\n",
""
]
},
@@ -125,17 +124,17 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
\n",
- " לפניכם דוגמאות אחדות של שימוש ב־type. \n",
- " קבעו מה תהיה התוצאה של כל אחת מהדוגמאות, ורק לאחר מכן הריצו ובדקו אם צדקתם. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " לפניכם דוגמאות אחדות של שימוש ב־type. \n",
+ " קבעו מה תהיה התוצאה של כל אחת מהדוגמאות, ורק לאחר מכן הריצו ובדקו אם צדקתם. \n",
" אם טעיתם – לא נורא, ממילא מדובר פה בהימורים מושכלים.\n",
"
\n",
- " פעולות המערבות סוגי ערכים שונים לא תמיד עובדות. \n",
- " לדוגמה, כשננסה לחבר מספר שלם ומספר עשרוני, נקבל מספר עשרוני. לעומת זאת, כשננסה לחבר מספר שלם למחרוזת, פייתון תתריע לפנינו על שגיאה. \n",
- " נמשיל לקערת קוביות קרח: נוכל לספור כמה קוביות קרח יש בה גם אם נוסיף מספר קוביות, אבל יהיה קשה לנו לתאר את תוכן הקערה אם נשפוך אליה כוס מים. \n",
- "
\n",
- "
\n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " פעולות המערבות סוגי ערכים שונים לא תמיד עובדות. \n",
+ " לדוגמה, כשננסה לחבר מספר שלם ומספר עשרוני, נקבל מספר עשרוני. לעומת זאת, כשננסה לחבר מספר שלם למחרוזת, פייתון תתריע לפנינו על שגיאה. \n",
+ " נמשיל לקערת קוביות קרח: נוכל לספור כמה קוביות קרח יש בה גם אם נוסיף מספר קוביות, אבל יהיה קשה לנו לתאר את תוכן הקערה אם נשפוך אליה כוס מים. \n",
+ "
\n",
- "בואו נחשב את נפח הפיצה שלנו לפי אורך המשולש ועוביו. \n",
+ "
\n",
+ "בואו נחשב את נפח הפיצה שלנו לפי אורך המשולש ועוביו. \n",
"הנוסחה לחישוב נפח פיצה היא:\n",
- " $pi \\times z \\times z \\times a$,\n",
- "כאשר $z$ הוא אורך המשולש ו־$a$ הוא עובי המשולש. \n",
- " pi, או $\\pi$, הוא מספר קבוע שנקרא בעברית פאי, וערכו קרוב ל־3.141592653589793. בפועל יש לו אין־סוף ספרות אחרי הנקודה העשרונית, אבל אנחנו נסתפק באלו. \n",
- "נניח שאורכו של המשולש הוא 5 מטרים, ועוביו הוא 2 מטרים (זו למעשה עוגת פיצה. אנחנו אוהבים!) \n",
+ " $pi \\times z \\times z \\times a$,\n",
+ "כאשר $z$ הוא אורך המשולש ו־$a$ הוא עובי המשולש. \n",
+ " pi, או $\\pi$, הוא מספר קבוע שנקרא בעברית פאי, וערכו קרוב ל־3.141592653589793. בפועל יש לו אין־סוף ספרות אחרי הנקודה העשרונית, אבל אנחנו נסתפק באלו. \n",
+ "נניח שאורכו של המשולש הוא 5 מטרים, ועוביו הוא 2 מטרים (זו למעשה עוגת פיצה. אנחנו אוהבים!) \n",
"נחשב:\n",
"
\n",
- "אך אבוי! \n",
- "מתכנת אחר שיקרא את הקוד שלכם, עלול להתבלבל מכמות המספרים הלא מובנים בעליל שכתובים שם, וקרוב לוודאי שהוא לא יבין מה הם אומרים. \n",
+ "
\n",
+ "אך אבוי! \n",
+ "מתכנת אחר שיקרא את הקוד שלכם, עלול להתבלבל מכמות המספרים הלא מובנים בעליל שכתובים שם, וקרוב לוודאי שהוא לא יבין מה הם אומרים. \n",
"יותר מזה, אם תרצו לחשב את גודלן של פיצות רבות נוספות, תצטרכו לכתוב את פאי המסורבל (סליחה פאי) פעמים רבות בקוד.\n",
"
\n",
- "למזלנו, בפייתון יש דרך לתת לערכים שם, ממש כמו תווית שכזו. ערכים עם שם נקראים משתנים, ויש להם יתרונות רבים נוספים שנגלה בהמשך. \n",
+ "
\n",
+ "למזלנו, בפייתון יש דרך לתת לערכים שם, ממש כמו תווית שכזו. ערכים עם שם נקראים משתנים, ויש להם יתרונות רבים נוספים שנגלה בהמשך. \n",
"כעת נדגים כיצד אנחנו נותנים לערך \"פאי\" שם, ואיך מייד לאחר מכן אנחנו משתמשים בו.\n",
"
\n",
- "תחילה נשים לב לכך שאף שהשתמשנו בסימן =, השורה הראשונה היא לא שוויון מהסוג שאנחנו רגילים אליו. \n",
- "משמעות הסימן בתכנות שונה לחלוטין, והעיקרון שאותו הוא מממש נקרא השמה. \n",
- "בהשמה אנחנו שמים את הערך שנמצא בצד ימין של השווה, בתוך משתנה ששמו נכתב בצד שמאל של השווה. \n",
+ "
\n",
+ "תחילה נשים לב לכך שאף שהשתמשנו בסימן =, השורה הראשונה היא לא שוויון מהסוג שאנחנו רגילים אליו. \n",
+ "משמעות הסימן בתכנות שונה לחלוטין, והעיקרון שאותו הוא מממש נקרא השמה. \n",
+ "בהשמה אנחנו שמים את הערך שנמצא בצד ימין של השווה, בתוך משתנה ששמו נכתב בצד שמאל של השווה. \n",
"אחרי שביצענו את הפעולה הזו, בכל פעם שנכתוב את שמו של המשתנה, פייתון תבין את מה שכתוב שם כאילו רשמנו את הערך שנמצא בתוכו.\n",
"
\n",
- "אם נרצה לתאר את הקוד שלנו במילים, נוכל להגיד שיצרנו שלושה משתנים שאליהם השמנו את הנתונים הדרושים לנו לחישוב נפח הפיצה. \n",
- "בסוף, חישבנו את נפח הפיצה, ואת התוצאה השמנו למשתנה נוסף בשם pizza_volume. \n",
+ "
\n",
+ "אם נרצה לתאר את הקוד שלנו במילים, נוכל להגיד שיצרנו שלושה משתנים שאליהם השמנו את הנתונים הדרושים לנו לחישוב נפח הפיצה. \n",
+ "בסוף, חישבנו את נפח הפיצה, ואת התוצאה השמנו למשתנה נוסף בשם pizza_volume. \n",
"את הערך הנמצא במשתנה הזה הדפסנו למסך.\n",
"
\n",
- "אפשר לדמיין משתנים כמצביע לייזר קטן. \n",
- "כשאתם מבצעים השמה, אתם מבקשים מפייתון ליצור לייזר בשם שבחרתם, ולהצביע בעזרתו על ערך מסוים. \n",
- "נניח, במקרה שבו pi = 3.14, אנחנו מבקשים מפייתון ליצור לייזר בשם pi שיצביע על הערך 3.14. \n",
- "בכל פעם שתציינו בהמשך הקוד את שם הלייזר, פייתון תבדוק להיכן הוא מצביע, ותיקח את הערך שנמצא שם. \n",
+ "
\n",
+ "אפשר לדמיין משתנים כמצביע לייזר קטן. \n",
+ "כשאתם מבצעים השמה, אתם מבקשים מפייתון ליצור לייזר בשם שבחרתם, ולהצביע בעזרתו על ערך מסוים. \n",
+ "נניח, במקרה שבו pi = 3.14, אנחנו מבקשים מפייתון ליצור לייזר בשם pi שיצביע על הערך 3.14. \n",
+ "בכל פעם שתציינו בהמשך הקוד את שם הלייזר, פייתון תבדוק להיכן הוא מצביע, ותיקח את הערך שנמצא שם. \n",
"אם כך, לצורך האנלוגיה הזו, הלייזר הוא שם המשתנה, שמצביע על ערך המשתנה.\n",
"
"
]
@@ -192,8 +192,8 @@
"metadata": {},
"source": [
"\n",
- " \n",
- " המחשה של שלושה לייזרים שמצביעים על משתנים.\n",
+ "\n",
+ "המחשה של שלושה לייזרים שמצביעים על משתנים.\n",
""
]
},
@@ -201,21 +201,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "##
\n",
- " עבור כל אחד משמות המשתנים שלפניכם, רשמו במחברת או בהערה האם שם המשתנה עומד בחוקים ובמוסכמות. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " עבור כל אחד משמות המשתנים שלפניכם, רשמו במחברת או בהערה האם שם המשתנה עומד בחוקים ובמוסכמות. \n",
" אחרי שרשמתם בצד, תקנו את שמות המשתנים הבעיתיים, וודאו שהרצת התא לא תגרום לשגיאה.\n",
"
\n",
- "מה קרה כאן? \n",
- "בשורה 1 עשינו השמה פשוטה, כפי שלמדנו קודם. עד כאן הכול מוכר. \n",
+ "
\n",
+ "מה קרה כאן? \n",
+ "בשורה 1 עשינו השמה פשוטה, כפי שלמדנו קודם. עד כאן הכול מוכר. \n",
"בשורה 2 הרעיון זהה. כל מה שאתם צריכים לזכור הוא שפייתון תחשב קודם את צד ימין (הערך) ורק אז תכניס אותו לתוך צד שמאל (שם המשתנה).\n",
"
\n",
- "
\n",
+ "
\n",
"בואו נעקוב אחרי דרך המחשבה של פייתון כשהיא קוראת את השורה השנייה:\n",
"
\n",
- "קניתי 5 ארגזים גדולים של קרמבו. בארגז יש 10 יחידות קרמבו בכל שורה, ו־4 יחידות קרמבו בכל עמודה. \n",
+ "
\n",
+ "קניתי 5 ארגזים גדולים של קרמבו. בארגז יש 10 יחידות קרמבו בכל שורה, ו־4 יחידות קרמבו בכל עמודה. \n",
"נסו לשים כל אחד מהנתונים שמצאתם בשאלה במשתנה, ולהדפיס כמה קרמבו יש לי.\n",
"
\n",
- "אורך הבריכה הפרטית שהייתי מת שתהיה לי הוא 50 מטר, ורוחבה 25 מטר. \n",
- "כדי להיתקע בכמה שיותר אנשים בדרך, אני מתכנן לשחות באלכסון, מהפינה האחת של הבריכה לפינה הנגדית לה. \n",
- "אני נמצא בפינה שממנה אני מתכנן לצאת. תוכלו לעזור לי להבין מה המרחק שאצטרך לשחות כדי להגיע לפינה הנגדית? \n",
- "נסו לעשות שימוש ב־3 משתנים כדי לפתור את השאלה. \n",
+ "
\n",
+ "אורך הבריכה הפרטית שהייתי מת שתהיה לי הוא 50 מטר, ורוחבה 25 מטר. \n",
+ "כדי להיתקע בכמה שיותר אנשים בדרך, אני מתכנן לשחות באלכסון, מהפינה האחת של הבריכה לפינה הנגדית לה. \n",
+ "אני נמצא בפינה שממנה אני מתכנן לצאת. תוכלו לעזור לי להבין מה המרחק שאצטרך לשחות כדי להגיע לפינה הנגדית? \n",
+ "נסו לעשות שימוש ב־3 משתנים כדי לפתור את השאלה. \n",
"טיפ: סיפרו לי שנוסחת אלכסון היא $(l^2 + w^2)^{0.5}$, כאשר \n",
" ${l}$\n",
" מציין את אורך הבריכה ו־\n",
@@ -404,9 +403,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "לאחר שיפוץ של הבריכה הפרטית שהייתי מת שתהיה לי, אורכה גדל פי 2. \n",
- "כחלק מהשיפוצים גם הוסיפו לבריכה מסלולים, כך שהרוחב שלה גדל בגודל השווה לאורך החדש של הבריכה. \n",
+ "
\n",
+ "לאחר שיפוץ של הבריכה הפרטית שהייתי מת שתהיה לי, אורכה גדל פי 2. \n",
+ "כחלק מהשיפוצים גם הוסיפו לבריכה מסלולים, כך שהרוחב שלה גדל בגודל השווה לאורך החדש של הבריכה. \n",
"הדפיסו את הגודל החדש של הבריכה. אל תשנו את הקוד למעלה; פשוט המשיכו אותו בתא הבא, והשתמשו בהשמה כדי להתאים את המשתנים למציאות החדשה.\n",
"
\n",
- " ניתן להתייחס גם למשתנים שהוגדרו בתאים אחרים במחברת. \n",
- " לדוגמה, אם הרצנו תא שבו הוגדר משתנה בשם w, מאותו רגע כל תא אחר במחברת יוכל להשתמש במשתנה w. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " ניתן להתייחס גם למשתנים שהוגדרו בתאים אחרים במחברת. \n",
+ " לדוגמה, אם הרצנו תא שבו הוגדר משתנה בשם w, מאותו רגע כל תא אחר במחברת יוכל להשתמש במשתנה w. \n",
" ערכו של משתנה מסויים בזמן נתון הוא הערך שהוגדר עבורו בתא האחרון שהורץ במחברת.\n",
"
\n",
- "אחד הדברים הכיפיים ביותר בתכנות, הוא להשתמש ולהגיב לנתונים שנאספו ממקור חיצוני. נתונים אלו נקראים במינוח מקצועי קלט. \n",
- "קלט יכול להגיע מכמה מקורות: מטקסט שהמשתמש מזין באמצעות המקלדת, או מקובץ חיצוני. \n",
+ "
\n",
+ "אחד הדברים הכיפיים ביותר בתכנות, הוא להשתמש ולהגיב לנתונים שנאספו ממקור חיצוני. נתונים אלו נקראים במינוח מקצועי קלט. \n",
+ "קלט יכול להגיע מכמה מקורות: מטקסט שהמשתמש מזין באמצעות המקלדת, או מקובץ חיצוני. \n",
"בשיעורים הקרובים נתמקד בקלט שהמשתמש מזין באמצעות המקלדת, ובעתיד נרחיב את היכולות שלנו בשיטות נוספות.\n",
"
\n",
- "כדי לקבל קלט מהמשתמש באמצעות המקלדת, נשתמש ב־input(), כשבתוך הסוגריים נכתוב מחרוזת כלשהי שתוצג למשתמש (ראו דוגמה). \n",
- "מטרת המחרוזת – להסביר למשתמש שאנחנו מצפים ממנו לקלט, ומאיזה סוג. \n",
+ "
\n",
+ "כדי לקבל קלט מהמשתמש באמצעות המקלדת, נשתמש ב־input(), כשבתוך הסוגריים נכתוב מחרוזת כלשהי שתוצג למשתמש (ראו דוגמה). \n",
+ "מטרת המחרוזת – להסביר למשתמש שאנחנו מצפים ממנו לקלט, ומאיזה סוג. \n",
"בואו נראה איך זה עובד:\n",
"
\n",
- "השורה הראשונה היא החידוש פה: בשורה זו אנחנו מבקשים קלט מהמשתמש (את השם שלו), ושומרים את הקלט שהזין במשתנה בשם name. \n",
- "ברגע שפייתון מגיעה ל־input(), היא עוצרת כל פעולה, עד שתקבל קלט מהמשתמש. \n",
- "לאחר מכן היא \"מחליפה\" את input() בקלט שקיבלה מהמשתמש. \n",
+ "
\n",
+ "השורה הראשונה היא החידוש פה: בשורה זו אנחנו מבקשים קלט מהמשתמש (את השם שלו), ושומרים את הקלט שהזין במשתנה בשם name. \n",
+ "ברגע שפייתון מגיעה ל־input(), היא עוצרת כל פעולה, עד שתקבל קלט מהמשתמש. \n",
+ "לאחר מכן היא \"מחליפה\" את input() בקלט שקיבלה מהמשתמש. \n",
"לדוגמה, אם הזנתי כקלט Moishalah, מה שיקרה בפועל אלו השורות הבאות (השוו עם הקוד מלמעלה):\n",
"
\n",
- "כתבו קוד המבקש כקלט שלושה נתונים: שם פרטי, שם משפחה ותאריך לידה. \n",
- "הקוד יציג למשתמש ברכה חביבה. \n",
+ "
\n",
+ "כתבו קוד המבקש כקלט שלושה נתונים: שם פרטי, שם משפחה ותאריך לידה. \n",
+ "הקוד יציג למשתמש ברכה חביבה. \n",
"לדוגמה, עבור הנתונים Israel, Cohen, 22/07/1992, הוא יציג:\n",
"
"
]
@@ -135,7 +135,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "> Hi Israel Cohen! Your birthday is on 22/07/1992."
+ "> Hi Israel Cohen! Your birthday is on 22/07/1992."
]
},
{
@@ -149,14 +149,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "##
\n",
- "אף על פי שרצינו להתייחס לקלט כאל נתון מספרי (int), פייתון החליטה להתייחס אליו כמחרוזת (str), ולכן חיברה בין מחרוזות ולא בין מספרים. \n",
+ "
\n",
+ "אף על פי שרצינו להתייחס לקלט כאל נתון מספרי (int), פייתון החליטה להתייחס אליו כמחרוזת (str), ולכן חיברה בין מחרוזות ולא בין מספרים. \n",
"מכאן אנחנו לומדים חוק חשוב מאוד, שאם ניטיב לזכור אותו יחסוך לנו הרבה תקלות בעתיד:\n",
"
\n",
- "שימו לב שניסיון לעשות פעולות בין טיפוסים שונים (כמו מחרוזת ומספר שלם) עלול לגרום לכם לשגיאות בתרגולים הקרובים. \n",
+ "
\n",
+ "שימו לב שניסיון לעשות פעולות בין טיפוסים שונים (כמו מחרוזת ומספר שלם) עלול לגרום לכם לשגיאות בתרגולים הקרובים. \n",
"נסו, לדוגמה, להריץ את הקוד הבא:\n",
"
\n",
- " שפכנו ליטר מים לקערה עם 5 קוביות קרח. כמה יש בה עכשיו? \n",
- " קשה לנו מאוד לענות על השאלה כיוון שהיא מנוסחת באופן גרוע ומערבת דברים מסוגים שונים. מאותה סיבה בדיוק לפייתון קשה עם הקוד מלמעלה. \n",
- " נוכל להקפיא את המים ולמדוד כמה קרח יש בקערה, או להמיס את הקרח ולמדוד כמה מים יש בה. \n",
+ "
\n",
+ " שפכנו ליטר מים לקערה עם 5 קוביות קרח. כמה יש בה עכשיו? \n",
+ " קשה לנו מאוד לענות על השאלה כיוון שהיא מנוסחת באופן גרוע ומערבת דברים מסוגים שונים. מאותה סיבה בדיוק לפייתון קשה עם הקוד מלמעלה. \n",
+ " נוכל להקפיא את המים ולמדוד כמה קרח יש בקערה, או להמיס את הקרח ולמדוד כמה מים יש בה. \n",
" בפייתון נצטרך להחליט מה אנחנו רוצים לעשות, ולהמיר את הערכים שאנחנו עובדים איתם לטיפוסים המתאימים לפני שנבצע את הפעולה.\n",
"
\n",
- "כזכור, כל עוד הקלט שלנו הוא מסוג מחרוזת, פעולות כמו חיבור שלו עם מספר ייכשלו. \n",
- "לכן נצטרך לדאוג ששניהם יהיו מאותו סוג על ידי המרה של אחד הערכים מסוג אחד לסוג אחר. \n",
- "תהליך הפיכת ערך לסוג טיפוס אחר נקרא המרת טיפוסים, או Casting / Type Conversion. \n",
+ "
\n",
+ "כזכור, כל עוד הקלט שלנו הוא מסוג מחרוזת, פעולות כמו חיבור שלו עם מספר ייכשלו. \n",
+ "לכן נצטרך לדאוג ששניהם יהיו מאותו סוג על ידי המרה של אחד הערכים מסוג אחד לסוג אחר. \n",
+ "תהליך הפיכת ערך לסוג טיפוס אחר נקרא המרת טיפוסים, או Casting / Type Conversion. \n",
"אם נבחן את בעיית התפוחים של משה מהכותרת הקודמת:\n",
"
\n",
- "נראה שהקוד לא יעבוד, כיוון שאין אפשרות לחבר בין מחרוזת (מספר התפוחים של משה מהקלט של המשתמש) לבין מספר (ה־1 שאנחנו רוצים להוסיף). \n",
- "כיוון שהמטרה היא להוסיף תפוח 1 למספר מסוים של תפוחים, נבחר להמיר את moshe_apples למספר שלם (int) במקום מחרוזת (str). \n",
+ "
\n",
+ "נראה שהקוד לא יעבוד, כיוון שאין אפשרות לחבר בין מחרוזת (מספר התפוחים של משה מהקלט של המשתמש) לבין מספר (ה־1 שאנחנו רוצים להוסיף). \n",
+ "כיוון שהמטרה היא להוסיף תפוח 1 למספר מסוים של תפוחים, נבחר להמיר את moshe_apples למספר שלם (int) במקום מחרוזת (str). \n",
"נעשה זאת כך:\n",
"
\n",
- "איזה כיף, המרנו את מספר התפוחים של משה לערך מטיפוס שלם (שורה 2), ועכשיו הקוד עובד! \n",
- "שימו לב שעכשיו אם נרצה להדפיס את מספר התפוחים לצד משפט שאומר \"למשה יש X תפוחים\", אנחנו עלולים להיתקל בבעיה. \n",
- "המשפט שאנחנו רוצים להדפיס הוא str, ומספר התפוחים שחישבנו ושננסה לשרשר אליו יהיה int. \n",
+ "
\n",
+ "איזה כיף, המרנו את מספר התפוחים של משה לערך מטיפוס שלם (שורה 2), ועכשיו הקוד עובד! \n",
+ "שימו לב שעכשיו אם נרצה להדפיס את מספר התפוחים לצד משפט שאומר \"למשה יש X תפוחים\", אנחנו עלולים להיתקל בבעיה. \n",
+ "המשפט שאנחנו רוצים להדפיס הוא str, ומספר התפוחים שחישבנו ושננסה לשרשר אליו יהיה int. \n",
"ראו איך זה ישפיע על התוכנית:\n",
"
\n",
- "פייתון התריעה לפנינו שיש פה בעיה: בשורה האחרונה, היא לא מצליחה לחבר את מספר התפוחים עם המחרוזות הנמצאות בצדדיו. \n",
- "מה הפתרון? \n",
+ "
\n",
+ "פייתון התריעה לפנינו שיש פה בעיה: בשורה האחרונה, היא לא מצליחה לחבר את מספר התפוחים עם המחרוזות הנמצאות בצדדיו. \n",
+ "מה הפתרון? \n",
"אם אמרתם להמיר את מספר התפוחים של משה למחרוזת, זה אכן יעבוד. נעשה את זה ככה:\n",
"
\n",
- "כדי להמיר לסוג מסוים, כל מה שאתם צריכים לדעת זה את הסוג שאליו אתם רוצים להמיר. \n",
+ "
\n",
+ "כדי להמיר לסוג מסוים, כל מה שאתם צריכים לדעת זה את הסוג שאליו אתם רוצים להמיר. \n",
"משם פשוט בחרו את השם הרלוונטי מהטבלה שאתם כבר מכירים:\n",
"
\n",
- "לגברת עמיטלי מחוות ביסקוויט יש מפעל משוגע לייצור קרמבו. \n",
- "אחד התפקידים במפעל הוא הרכבת קופסאות לאריזת הקרמבו ומילויה. אדון מרקוב מאייש תפקיד זה. \n",
- "מרקוב מחליט על מימדיה של כל קופסת קרמבו טעים חדשה שהוא ממלא: כמה יחידות קרמבו יכנסו לגובה, כמה יכנסו לרוחב וכמה יכנסו לאורך האריזה. \n",
- "בנו תוכנה שתעזור למרקוב לחשב את כמות הקרמבו שהוא הכניס לקופסה, לפי הנוסחה: $w \\times h \\times l$, רוחב כפול גובה כפול אורך. \n",
- "לדוגמה: התוכנה תקבל ממרקוב כקלט 3 עבור האורך, 4 עבור הרוחב ו־2.5 עבור הגובה, ותחזיר את הפלט 30, שהוא $2.5 \\times 3 \\times 4$.\n",
+ "
\n",
+ "לגברת עמיטלי מחוות ביסקוויט יש מפעל משוגע לייצור קרמבו. \n",
+ "אחד התפקידים במפעל הוא הרכבת קופסאות לאריזת הקרמבו ומילויה. אדון מרקוב מאייש תפקיד זה. \n",
+ "מרקוב מחליט על מימדיה של כל קופסת קרמבו טעים חדשה שהוא ממלא: כמה יחידות קרמבו יכנסו לגובה, כמה יכנסו לרוחב וכמה יכנסו לאורך האריזה. \n",
+ "בנו תוכנה שתעזור למרקוב לחשב את כמות הקרמבו שהוא הכניס לקופסה, לפי הנוסחה: $w \\times h \\times l$, רוחב כפול גובה כפול אורך. \n",
+ "לדוגמה: התוכנה תקבל ממרקוב כקלט 3 עבור האורך, 4 עבור הרוחב ו־2.5 עבור הגובה, ותחזיר את הפלט 30, שהוא $2.5 \\times 3 \\times 4$.\n",
"
\n",
- "חזרו למחברת 2. זוכרים את התרגיל האחרון שהיה שם, על התה והמרת מעלות פרנהייט לצלזיוס? \n",
- "בואו נבנה מחשבון פרנהייט לצלזיוס! בקשו מהמשתמש להכניס מספר בפרנהייט, והדפיסו את המספר בצלזיוס. \n",
- "להזכירכם, הנוסחה היא: (5 חלקי 9) כפול (מעלות בפרנהייט פחות 32), או בכתיב מתמטי, $C = \\frac{5}{9}\\times(F - 32)$. \n",
+ "
\n",
+ "חזרו למחברת 2. זוכרים את התרגיל האחרון שהיה שם, על התה והמרת מעלות פרנהייט לצלזיוס? \n",
+ "בואו נבנה מחשבון פרנהייט לצלזיוס! בקשו מהמשתמש להכניס מספר בפרנהייט, והדפיסו את המספר בצלזיוס. \n",
+ "להזכירכם, הנוסחה היא: (5 חלקי 9) כפול (מעלות בפרנהייט פחות 32), או בכתיב מתמטי, $C = \\frac{5}{9}\\times(F - 32)$. \n",
"לדוגמה: עבור הקלט 212 התוכנה תדפיס 100, כיוון ש־212 מעלות פרנהייט הן 100 מעלות צלזיוס.\n",
"
\n",
- "לפי מסטיק בזוקה, עד גיל 21 תגיעו לירח. אנחנו פחות אופטימיים (לנו פשוט זה פחות עבד), ומנבאים לך הצלחה עד גיל 90. \n",
- "כתוב תוכנה שמקבלת כקלט את השם שלך ואת הגיל שלך, ומחשבת בעוד כמה שנים תגיע לירח לפי הנבואה שלנו. \n",
- "התוכנה תדפיס את המשפט: X, wait another Y years., כאשר X יוחלף בשמך ו־Y יוחלף במספר השנים שתצטרך לחכות עד גיל 90. \n",
+ "
\n",
+ "לפי מסטיק בזוקה, עד גיל 21 תגיעו לירח. אנחנו פחות אופטימיים (לנו פשוט זה פחות עבד), ומנבאים לך הצלחה עד גיל 90. \n",
+ "כתוב תוכנה שמקבלת כקלט את השם שלך ואת הגיל שלך, ומחשבת בעוד כמה שנים תגיע לירח לפי הנבואה שלנו. \n",
+ "התוכנה תדפיס את המשפט: X, wait another Y years., כאשר X יוחלף בשמך ו־Y יוחלף במספר השנים שתצטרך לחכות עד גיל 90. \n",
"לדוגמה: אם הכנסת לתוכנה שגילך הוא 25 ושמך הוא ים, התוכנה תדפיס:\n",
"
\n",
- " החומר במחברת זו הוא מעט תיאורטי. אין סיבה להיות עצובים, במחברות הבאה נעשה בו שימוש רחב. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " החומר במחברת זו הוא מעט תיאורטי. אין סיבה להיות עצובים, במחברות הבאה נעשה בו שימוש רחב. \n",
" ודאו שאתם מבינים היטב את החומר במחברת זו כדי לבסס את הידע שלכם כראוי.\n",
"
\n",
- "ווהו! רק פתחנו מחברת וכבר זרקו עלינו מילים מפוצצות. מה בוליאניים עכשיו? \n",
- "בכל הנוגע לתחום שלנו, זה הרבה יותר פשוט ממה שזה נשמע. \n",
+ "
\n",
+ "ווהו! רק פתחנו מחברת וכבר זרקו עלינו מילים מפוצצות. מה בוליאניים עכשיו? \n",
+ "בכל הנוגע לתחום שלנו, זה הרבה יותר פשוט ממה שזה נשמע. \n",
"בתכנות, ביטוי נחשב ביטוי בוליאני אם תוצאתו היא אמת או שקר.\n",
"
\n",
- "לא הספקתם להתאושש מהבוליאניים האלו וכבר אני מוריד עליכם עוד מכה. קורס חסר רחמים. \n",
- "אבל גם הפעם זה ממש פשוט: אופרטור הוא בסך הכול סימן שמייצג פעולה כלשהי, כמו שווה או ועוד. אתם אולי אפילו זוכרים את אופרטור ההשמה מהשיעור על מה הם משתנים. \n",
+ "
\n",
+ "לא הספקתם להתאושש מהבוליאניים האלו וכבר אני מוריד עליכם עוד מכה. קורס חסר רחמים. \n",
+ "אבל גם הפעם זה ממש פשוט: אופרטור הוא בסך הכול סימן שמייצג פעולה כלשהי, כמו שווה או ועוד. אתם אולי אפילו זוכרים את אופרטור ההשמה מהשיעור על מה הם משתנים. \n",
"אז מהם אופרטורי השוואה? ובכן, אלו סימנים שעוזרים לנו לבצע השוואות בין איברים שונים, שלהם אנחנו קוראים אופרנדים.\n",
"
\n",
- "ווהו! אז אם התרגלנו עד עכשיו שיש 3 טיפוסים שאנחנו מכירים: str, int ו־float, הכירו את הבחור החדש בשכונה! \n",
- "bool הוא טיפוס חביב ופשוט שמייצג רק 2 ערכים אפשריים: True או False. \n",
+ "
\n",
+ "ווהו! אז אם התרגלנו עד עכשיו שיש 3 טיפוסים שאנחנו מכירים: str, int ו־float, הכירו את הבחור החדש בשכונה! \n",
+ "bool הוא טיפוס חביב ופשוט שמייצג רק 2 ערכים אפשריים: True או False. \n",
"כל אופרטור השוואה שנחיל על שני ערכים, יחזיר תמיד ערך מסוג bool (חוץ מכשפייתון תתריע על שגיאה).\n",
"
\n",
- " טעות נפוצה בעת שימוש בערכים בוליאניים היא לא להתחשב ברגישות לאותיות גדולות/קטנות. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " טעות נפוצה בעת שימוש בערכים בוליאניים היא לא להתחשב ברגישות לאותיות גדולות/קטנות. \n",
" לדוגמה: True יהיה תקין בעוד ש־true יקפיץ שגיאה.\n",
"
"
]
},
{
@@ -277,10 +277,10 @@
"|:----------|:----------|:--------|------:|\n",
"| True | 4 == 4 | האם צד שמאל שווה לצד ימין | == |\n",
"| False | 4 != 4 | האם צד שמאל שונה מצד ימין | != |\n",
- "| True | 5 > 4 | האם צד שמאל גדול יותר מצד ימין | > |\n",
- "| False | 4 > 5 | האם צד שמאל קטן יותר מצד ימין | < |\n",
- "| False | 2 >= 4 | האם צד שמאל גדול או שווה לצד ימין | >= |\n",
- "| True | 4 <= 5 | האם צד שמאל קטן או שווה לצד ימין | <= |\n",
+ "| True | 5 > 4 | האם צד שמאל גדול יותר מצד ימין | > |\n",
+ "| False | 4 > 5 | האם צד שמאל קטן יותר מצד ימין | < |\n",
+ "| False | 2 >= 4 | האם צד שמאל גדול או שווה לצד ימין | >= |\n",
+ "| True | 4 <= 5 | האם צד שמאל קטן או שווה לצד ימין | <= |\n",
"| True | 'hell' in 'hello' | האם צד שמאל נמצא ברצף בצד ימין | in |"
]
},
@@ -288,14 +288,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "###
\n",
- "רשמו בצד את התוצאות של כל אחת מהשורות הבאות. \n",
- "רק לאחר מכן הריצו ובדקו האם צדקתם בתשובתכם. \n",
+ "
\n",
+ "רשמו בצד את התוצאות של כל אחת מהשורות הבאות. \n",
+ "רק לאחר מכן הריצו ובדקו האם צדקתם בתשובתכם. \n",
"בחלק מהסעיפים (בייחוד באלו שקשורים ב־in) דרושה קצת אינטואיציה.\n",
"
\n",
- " טעות נפוצה בקרב מתחילים היא לשכוח שבהשוואה בין נתונים מספריים יש להמיר קלט מהמשתמש ל־int, ורק אז לבצע השוואה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " טעות נפוצה בקרב מתחילים היא לשכוח שבהשוואה בין נתונים מספריים יש להמיר קלט מהמשתמש ל־int, ורק אז לבצע השוואה. \n",
" פייתון לא מתריעה על טעות זו, אבל השוואה שכזו לא תיתן לכם את התוצאה שאליה התכוונתם (ראו דוגמה למעלה).\n",
"
\n",
- "הריצו את התא שנמצא למעלה: סמנו אותו ולחצו CTRL + ENTER. \n",
+ "
\n",
+ "הריצו את התא שנמצא למעלה: סמנו אותו ולחצו CTRL + ENTER. \n",
"מה יהיו התוצאות של הביטויים הבאים? כתבו אותן בצד, ואז הריצו ובדקו האם תשובתכם הייתה נכונה.\n",
"
\n",
- " טעות נפוצה היא להתבלבל בין הסימנים = ו־==. \n",
- " זכרו: סימן שיוויון אחד (=) מבצע פעולה של הכנסת הערך מימין למשתנה ששמו מופיע משמאל. \n",
- " סימן שיוויון כפול (==) היא פעולה אחרת לחלוטין, שבודקת האם הערך מימין זהה לערך משמאל. \n",
- "
\n",
- "
\n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " טעות נפוצה היא להתבלבל בין הסימנים = ו־==. \n",
+ " זכרו: סימן שיוויון אחד (=) מבצע פעולה של הכנסת הערך מימין למשתנה ששמו מופיע משמאל. \n",
+ " סימן שיוויון כפול (==) היא פעולה אחרת לחלוטין, שבודקת האם הערך מימין זהה לערך משמאל. \n",
+ "
\n",
- "במחוז בולילנד השערורייתי, מותר לאכול פיצה רק מגיל 25 ומעלה. \n",
- "קבלו כקלט את גילו של המשתמש. הדפיסו לו True אם הוא יכול לאכול פיצה בבולילנד, או False אם הוא לא יכול. \n",
+ "
\n",
+ "במחוז בולילנד השערורייתי, מותר לאכול פיצה רק מגיל 25 ומעלה. \n",
+ "קבלו כקלט את גילו של המשתמש. הדפיסו לו True אם הוא יכול לאכול פיצה בבולילנד, או False אם הוא לא יכול. \n",
"לדוגמה: אם דוד הזין שגילו הוא 23, עליכם להציג לו False.\n",
"
\n",
- " החומר במחברת זו הוא מעט תיאורטי. אין סיבה להיות עצובים, במחברת הבאה נעשה בו שימוש רחב. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " החומר במחברת זו הוא מעט תיאורטי. אין סיבה להיות עצובים, במחברת הבאה נעשה בו שימוש רחב. \n",
" ודאו שאתם מבינים היטב את החומר במחברת זו כדי לבסס את הידע שלכם כראוי.\n",
"
\n",
- "בשיעור הקודם למדנו קצת על ביטויים בוליאניים – ביטויים שתוצאתם היא בהכרח אמת או שקר. \n",
- "ראינו איך מנסחים ביטויים כאלו, ולמדנו על אופרטורי השוואה כמו == או in, שבעזרתם אנחנו מחליטים באיזו צורה אנחנו רוצים להשוות בין ביטויים. \n",
+ "
\n",
+ "בשיעור הקודם למדנו קצת על ביטויים בוליאניים – ביטויים שתוצאתם היא בהכרח אמת או שקר. \n",
+ "ראינו איך מנסחים ביטויים כאלו, ולמדנו על אופרטורי השוואה כמו == או in, שבעזרתם אנחנו מחליטים באיזו צורה אנחנו רוצים להשוות בין ביטויים. \n",
"למדנו שביטויים כאלו יכולים לעזור לנו לשאול שאלות מעניינות, כמו אם למשתמש יש יותר מ־1000 ש\"ח בבנק, או אם לבת שלו קוראים \"שמחה\".\n",
"
\n",
- "אבל מה יקרה כשנרצה לשאול שאלות מורכבות יותר? \n",
- "לדוגמה, אם התנאים להרשמה לבנק שלנו הם גם שיהיו לך יותר מ־1,000 ש\"ח, וגם שתלמד בפקולטה נחשבת? \n",
- "למרבה הצער, בכלים שיש ברשותנו כרגע לא נוכל לנסח שאלות מורכבות שכאלו. \n",
+ "
\n",
+ "אבל מה יקרה כשנרצה לשאול שאלות מורכבות יותר? \n",
+ "לדוגמה, אם התנאים להרשמה לבנק שלנו הם גם שיהיו לך יותר מ־1,000 ש\"ח, וגם שתלמד בפקולטה נחשבת? \n",
+ "למרבה הצער, בכלים שיש ברשותנו כרגע לא נוכל לנסח שאלות מורכבות שכאלו. \n",
"במחברת זו זה נלמד על כלים חדשים, אופרטורים לוגיים, שיאפשרו לנו לנסח שאלות מורכבות יותר.\n",
"
\n",
- "כאמור, לעזרתנו מתגייסים \"אופרטורים לוגיים\", שמטרתם לאפשר לנו לשאול שאלות בנוגע לקשרים בין ביטויים בוליאניים. \n",
- "ישנם שלושה אופרטורים לוגיים: and (\"וגם\"), or (\"או\") ו־not (\"לא\"). \n",
+ "
\n",
+ "כאמור, לעזרתנו מתגייסים \"אופרטורים לוגיים\", שמטרתם לאפשר לנו לשאול שאלות בנוגע לקשרים בין ביטויים בוליאניים. \n",
+ "ישנם שלושה אופרטורים לוגיים: and (\"וגם\"), or (\"או\") ו־not (\"לא\"). \n",
"
\n",
- "מהדוגמאות נוכל לשים לב לדפוס חוזר – האופרטורים הלוגיים \"וגם\" ו\"או\" מקבלים משני צידיהם ביטויים בוליאניים, ומחזירים ביטוי בוליאני אחד. \n",
- "האופרטור הלוגי \"לא\" מקבל רק ביטוי בוליאני אחד, והופך אותו. \n",
+ "
\n",
+ "מהדוגמאות נוכל לשים לב לדפוס חוזר – האופרטורים הלוגיים \"וגם\" ו\"או\" מקבלים משני צידיהם ביטויים בוליאניים, ומחזירים ביטוי בוליאני אחד. \n",
+ "האופרטור הלוגי \"לא\" מקבל רק ביטוי בוליאני אחד, והופך אותו. \n",
"לדוגמה: בשאלה האם 2 גדול מ־1 (כן) וגם 2 קטן מ־3 (כן), האופרטור הלוגי \"וגם\" מקבל \"כן\" משני צידיו, ומחזיר את התשובה הסופית כן.\n",
"
\n",
- "האופרטור הלוגי and פועל על שני ביטויים בוליאניים, אחד מימינו ואחד משמאלו, ומחזיר לנו ביטוי בוליאני אחד: \n",
- "True אם הביטויים בשני צידיו היו True, או False בכל מקרה אחר. \n",
+ "
\n",
+ "האופרטור הלוגי and פועל על שני ביטויים בוליאניים, אחד מימינו ואחד משמאלו, ומחזיר לנו ביטוי בוליאני אחד: \n",
+ "True אם הביטויים בשני צידיו היו True, או False בכל מקרה אחר. \n",
"מבחינת מינוחים, and נחשב \"האופרטור\" (operator), והביטויים שנמצאים מצידיו נקראים \"האופרנדים\".\n",
"
\n",
- "האופרטור הלוגי or פועל על שני ביטויים בוליאניים, אחד מימינו ואחד משמאלו, ומחזיר לנו ביטוי בוליאני אחד: \n",
- "True אם לפחות אחד מהביטויים, מימינו או משמאלו, הם True. \n",
- "הוא יחזיר False רק אם הביטויים בשני הצדדים שלו הם False. \n",
+ "
\n",
+ "האופרטור הלוגי or פועל על שני ביטויים בוליאניים, אחד מימינו ואחד משמאלו, ומחזיר לנו ביטוי בוליאני אחד: \n",
+ "True אם לפחות אחד מהביטויים, מימינו או משמאלו, הם True. \n",
+ "הוא יחזיר False רק אם הביטויים בשני הצדדים שלו הם False. \n",
"מבחינת מינוחים, or נחשב \"האופרטור\" (operator), והביטויים שנמצאים מצידיו נקראים \"האופרנדים\" (operands).\n",
"
\n",
- "האופרטור הלוגי not פועל על ביטוי בוליאני אחד שבא אחריו, ומחזיר לנו את הביטוי הבוליאני ההפוך לו. רוצה לומר: \n",
- "True אם הביטוי הבוליאני שאחריו הוא False. \n",
- "False אם הביטוי הבוליאני שאחריו הוא True. \n",
+ "
\n",
+ "האופרטור הלוגי not פועל על ביטוי בוליאני אחד שבא אחריו, ומחזיר לנו את הביטוי הבוליאני ההפוך לו. רוצה לומר: \n",
+ "True אם הביטוי הבוליאני שאחריו הוא False. \n",
+ "False אם הביטוי הבוליאני שאחריו הוא True. \n",
"מבחינת מינוחים, not נחשב \"האופרטור\" (operator), והביטוי שנמצא אחריו נקרא \"האופרנד\" (operand).\n",
"
\n",
- "מסיבה שמחה היא מסיבה שיש בה לפחות 20 משתתפים, וגם יותר מ־100 משולשי פיצה. \n",
+ "
\n",
+ "מסיבה שמחה היא מסיבה שיש בה לפחות 20 משתתפים, וגם יותר מ־100 משולשי פיצה. \n",
"עד עכשיו, היינו יכולים לבדוק האם מסיבה היא שמחה רק בצורה הזו, שמדפיסה לנו 2 תשובות:\n",
"
\n",
- "אפשר להגיד כאן שרק במקרה שגם בשורה הראשונה הודפס True וגם בשורה השנייה הודפס True, המסיבה היא מסיבה שמחה. \n",
- "הסיטואציה הזו, כך נראה, מתאימה לאופרטור הלוגי הראשון שדיברנו עליו – and, ובשמו העברי \"וגם\". \n",
- "השאלה ששאלנו היא \"האם מספר האנשים במסיבה הוא לפחות 20, וגם מספר משולשי הפיצה במסיבה הוא מעל 100\". \n",
+ "
\n",
+ "אפשר להגיד כאן שרק במקרה שגם בשורה הראשונה הודפס True וגם בשורה השנייה הודפס True, המסיבה היא מסיבה שמחה. \n",
+ "הסיטואציה הזו, כך נראה, מתאימה לאופרטור הלוגי הראשון שדיברנו עליו – and, ובשמו העברי \"וגם\". \n",
+ "השאלה ששאלנו היא \"האם מספר האנשים במסיבה הוא לפחות 20, וגם מספר משולשי הפיצה במסיבה הוא מעל 100\". \n",
"ננסח בקוד:\n",
"
\n",
- "\"מסיבה עצובה\" היא מסיבה שיש בה עד 5 משתתפים, או שבה אין משולש פיצה לכל משתתף. \n",
+ "
\n",
+ "\"מסיבה עצובה\" היא מסיבה שיש בה עד 5 משתתפים, או שבה אין משולש פיצה לכל משתתף. \n",
"עד עכשיו, היינו יכולים לעשות את זה רק בצורה הזו, שמדפיסה לנו 2 תשובות:\n",
"
\n",
- "אפשר להגיד כאן שבמקרה שתוצאת השורה הראשונה היא Trueאו שתוצאת השורה השנייה היא True, המסיבה היא מסיבה עצובה. \n",
- "הסיטואציה הזו, כך נראה, מתאימה לאופרטור הלוגי השני שדיברנו עליו – or, ובשמו העברי \"או\". \n",
- "השאלה ששאלנו היא \"האם מספר האנשים במסיבה קטן או שווה ל־5, או מספר משולשי הפיצה קטן ממספר האנשים במסיבה\". \n",
+ "
\n",
+ "אפשר להגיד כאן שבמקרה שתוצאת השורה הראשונה היא Trueאו שתוצאת השורה השנייה היא True, המסיבה היא מסיבה עצובה. \n",
+ "הסיטואציה הזו, כך נראה, מתאימה לאופרטור הלוגי השני שדיברנו עליו – or, ובשמו העברי \"או\". \n",
+ "השאלה ששאלנו היא \"האם מספר האנשים במסיבה קטן או שווה ל־5, או מספר משולשי הפיצה קטן ממספר האנשים במסיבה\". \n",
"ננסח בקוד:\n",
"
\n",
- "טבלאות אמת זו דרך ישנה נושנה לתאר את התוצאה של אופרטורים לוגיים בכל אחד מהמקרים האפשריים. \n",
- "נצייר טבלאות כאלו עבור and, or ו־not. \n",
+ "
\n",
+ "טבלאות אמת זו דרך ישנה נושנה לתאר את התוצאה של אופרטורים לוגיים בכל אחד מהמקרים האפשריים. \n",
+ "נצייר טבלאות כאלו עבור and, or ו־not. \n",
"אנחנו ממליצים שלא ללמוד אותן בעל פה, אלא להבין את ההיגיון שבהן.\n",
"
\n",
- "קיפיק הצב הוא הלקוח היחיד שאוכל כמה כדורי גלידה, שאחד מהם בטעם כוכבי־על (superstars). \n",
- "לגלידרייה שלכם נכנס לקוח, שמעוניין לקנות גלידה ממגוון הטעמים שיש במרכולתכם. \n",
- "קבלו את הטעמים שהוא רוצה להזמין כקלט. אם הלקוח ירצה יותר מטעם אחד, הוא יפריד את הטעמים בפסיק. \n",
+ "
\n",
+ "קיפיק הצב הוא הלקוח היחיד שאוכל כמה כדורי גלידה, שאחד מהם בטעם כוכבי־על (superstars). \n",
+ "לגלידרייה שלכם נכנס לקוח, שמעוניין לקנות גלידה ממגוון הטעמים שיש במרכולתכם. \n",
+ "קבלו את הטעמים שהוא רוצה להזמין כקלט. אם הלקוח ירצה יותר מטעם אחד, הוא יפריד את הטעמים בפסיק. \n",
"בדקו האם מדובר בקיפיק הצב.\n",
"
\n",
- "
\n",
- "לדוגמה, אם הלקוח יזין שהוא מעוניין להזמין superstars, לא מדובר בקיפיק הצב מכיוון שההזמנה כוללת כדור אחד בלבד. \n",
- "אם הלקוח יזין שהוא מעוניין להזמין pineapple, nettles, לא מדובר בקיפיק הצב מכיוון שההזמנה לא כוללת כדור בטעם המועדף על קיפיק. \n",
- "אם הלקוח יזין שהוא מעוניין להזמין superstars, creme-brulee, pineapple, נוכל להסיק שמדובר בקיפיק הצב. \n",
+ "
\n",
+ "לדוגמה, אם הלקוח יזין שהוא מעוניין להזמין superstars, לא מדובר בקיפיק הצב מכיוון שההזמנה כוללת כדור אחד בלבד. \n",
+ "אם הלקוח יזין שהוא מעוניין להזמין pineapple, nettles, לא מדובר בקיפיק הצב מכיוון שההזמנה לא כוללת כדור בטעם המועדף על קיפיק. \n",
+ "אם הלקוח יזין שהוא מעוניין להזמין superstars, creme-brulee, pineapple, נוכל להסיק שמדובר בקיפיק הצב. \n",
"
\n",
- "אם כן, ביטויים בוליאניים הם ביטויים שתוצאתם היא True או False. \n",
+ "
\n",
+ "אם כן, ביטויים בוליאניים הם ביטויים שתוצאתם היא True או False. \n",
"לעיתים קרובות ביטויים אלו יכללו אופרטורים לוגיים, כמו and, or ו־not. \n",
"
\n",
- "מה קטע הקוד הזה יעשה? \n",
- "את השורה הראשונה אנחנו כבר יודעים לקרוא: קלטנו את גיל המשתמש, המרנו אותו למספר שלם, ועכשיו המשתנה user_age מצביע עליו. \n",
+ "
\n",
+ "מה קטע הקוד הזה יעשה? \n",
+ "את השורה הראשונה אנחנו כבר יודעים לקרוא: קלטנו את גיל המשתמש, המרנו אותו למספר שלם, ועכשיו המשתנה user_age מצביע עליו. \n",
"בשורה השנייה הרוב כבר מוכר: נבדוק האם הגיל קטן מ־18. אבל מה זה ה־if הזה?\n",
"
\n",
- "כשאנחנו מעוניינים להגיד לפייתון לבצע רצף של שורות רק בתנאי שיקרה משהו מסוים, נשתמש במילת המפתח if. \n",
- "נחלק את המבנה של תנאי בפייתון ל־2 חלקים: \n",
+ "
\n",
+ "כשאנחנו מעוניינים להגיד לפייתון לבצע רצף של שורות רק בתנאי שיקרה משהו מסוים, נשתמש במילת המפתח if. \n",
+ "נחלק את המבנה של תנאי בפייתון ל־2 חלקים: \n",
"
\n",
- "\n",
- "ifהתנאי שלכם, ביטוי בוליאני: מה שאתם רוצים לעשות (גוף התנאי)\n",
+ "ifהתנאי שלכם, ביטוי בוליאני: מה שאתם רוצים לעשות (גוף התנאי)\n",
"\n",
- "\n",
- "
\n",
+ "
\n",
"נסביר:\n",
"
\n",
- "\n",
- "\n",
- "
התנאי מתחיל במילת המפתח if. אין פה מה לשנות.
\n",
- "
אחרי מילת המפתח if, יבוא ביטוי בוליאני. אם תוצאתו תהיה True, מה שנמצא בגוף התנאי יתבצע. אם False, פייתון תתעלם לגמרי מגוף התנאי.
\n",
- "
מייד אחרי הביטוי הבוליאני תבואנה נקודתיים, שמסמנות שכאן נגמרת השאלה (הביטוי הבוליאני), ומתחיל החלק הביצועי – גוף התנאי.
\n",
- "
לפני שנבקש מפייתון לבצע משהו בעקבות קיום התנאי שהיה ב־if, נצטרך להוסיף לפניו הזחה. \n",
- " הזחה היא תזוזה של השורה לימין, והיא נועדה לסמן מבניות מסוימת בקוד – נניח שהשורה הזו מתייחסת ל־if שנמצא לפניה. \n",
- " אנחנו רוצים שהקוד שנכתוב אחרי ההזחה ירוץ רק אם התנאי שלפני ההזחה התקיים. \n",
+ "\n",
+ "
התנאי מתחיל במילת המפתח if. אין פה מה לשנות.
\n",
+ "
אחרי מילת המפתח if, יבוא ביטוי בוליאני. אם תוצאתו תהיה True, מה שנמצא בגוף התנאי יתבצע. אם False, פייתון תתעלם לגמרי מגוף התנאי.
\n",
+ "
מייד אחרי הביטוי הבוליאני תבואנה נקודתיים, שמסמנות שכאן נגמרת השאלה (הביטוי הבוליאני), ומתחיל החלק הביצועי – גוף התנאי.
\n",
+ "
לפני שנבקש מפייתון לבצע משהו בעקבות קיום התנאי שהיה ב־if, נצטרך להוסיף לפניו הזחה. \n",
+ " הזחה היא תזוזה של השורה לימין, והיא נועדה לסמן מבניות מסוימת בקוד – נניח שהשורה הזו מתייחסת ל־if שנמצא לפניה. \n",
+ " אנחנו רוצים שהקוד שנכתוב אחרי ההזחה ירוץ רק אם התנאי שלפני ההזחה התקיים. \n",
" בפייתון הזחה מוגדרת כארבעה רווחים, אבל אפשר פשוט ללחוץ Tab ↹ במקלדת והמחברת תחליף לכם את הטאב ברווחים בעצמה.\n",
"
\n",
- "
וסוף סוף הגענו למטרה: אחרי ההזחה, כתבו את מה שאתם רוצים לעשות – כל פעולת פייתון שעולה על דעתכם תתאים כאן. \n",
+ "
וסוף סוף הגענו למטרה: אחרי ההזחה, כתבו את מה שאתם רוצים לעשות – כל פעולת פייתון שעולה על דעתכם תתאים כאן. \n",
"תוכלו להוסיף כמה שורות שתרצו אחרי ה־if. הקוד בשורה ירוץ כחלק מהתנאי כל עוד היא מוזחת ונמצאת ישירות אחרי ה־if, או אחרי שורות מוזחות אחרות ישירות מתחת ל־if.\n",
"
"
]
@@ -300,24 +294,23 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "#### מה התרחש בקוד הזה?\n",
- "
\n",
- "בשורה הראשונה, ביקשנו את הגיל של המשתמש וגרמנו למשתנה age להצביע אליו. \n",
+ "#### מה התרחש בקוד הזה?\n",
+ "
\n",
+ "בשורה הראשונה, ביקשנו את הגיל של המשתמש וגרמנו למשתנה age להצביע אליו. \n",
"בשורה השנייה, ביקשנו ש־allowed_to_enter יהיה False. זה קצת מרושע ומיזנטרופי, אבל אנחנו מעדיפים כברירת מחדל לא להכניס אף אחד למסיבה שלנו.\n",
"
\n",
- "
\n",
+ "
\n",
"בשלב הבא בדקנו האם age (גיל המשתמש שלנו) הוא לפחות 18, ואם כן הגדרנו שיוכל להכנס למסיבה. עד כאן זה קל.\n",
"
\n",
- "
\n",
- "עכשיו נתאר מה תהיה ההתרחשות אם הגיל נמוך מ־18. \n",
- "אנחנו מחכים לחצות, ומבקשים לדעת אם יום ההולדת של המשתמש הוא היום. \n",
+ "
\n",
+ "עכשיו נתאר מה תהיה ההתרחשות אם הגיל נמוך מ־18. \n",
+ "אנחנו מחכים לחצות, ומבקשים לדעת אם יום ההולדת של המשתמש הוא היום. \n",
"
\n",
- "
\n",
- "מכאן אנחנו פותחים תנאי נוסף, בתוך התנאי הקודם. זה אומר שרק אם age אכן קטן מ־18 הבדיקה הבאה תקרה (בגלל שאנחנו עדיין בתוך התנאי age < 18, ראו את ההזחה): \n",
- "אם המשתמש הכניס שהיום יום ההולדת שלו, והגיל שלו היה עד עכשיו 17, אז עכשיו הוא טכנית בן 18 ויכול להיכנס למסיבה שלנו. נגדיל את הגיל שלו ונרשה לו להיכנס. \n",
+ "
\n",
+ "מכאן אנחנו פותחים תנאי נוסף, בתוך התנאי הקודם. זה אומר שרק אם age אכן קטן מ־18 הבדיקה הבאה תקרה (בגלל שאנחנו עדיין בתוך התנאי age < 18, ראו את ההזחה): \n",
+ "אם המשתמש הכניס שהיום יום ההולדת שלו, והגיל שלו היה עד עכשיו 17, אז עכשיו הוא טכנית בן 18 ויכול להיכנס למסיבה שלנו. נגדיל את הגיל שלו ונרשה לו להיכנס. \n",
"
\n",
- "\n",
- "
\n",
+ "
\n",
"עכשיו נשאר רק להתייחס למשתנה allowed_to_enter שהגדרנו למעלה, לבדוק האם למשתמש מותר להכנס או לא, ולהדפיס הודעה מתאימה. יופי!\n",
"
\n",
- " טעות נפוצה היא לשכוח את הנקודתיים אחרי ה־if. \n",
- " אתם בטח אומרים לעצמכם שלא תעשו את זה, אבל אתם תעשו את זה, סמכו עליי. \n",
- " פייתון זורקת הודעות שגיאה מעצבנות ולא אינדיקטיביות כשזה קורה. נסו להיזכר באזהרה הזו 😊 \n",
- "
\n",
- "
\n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " טעות נפוצה היא לשכוח את הנקודתיים אחרי ה־if. \n",
+ " אתם בטח אומרים לעצמכם שלא תעשו את זה, אבל אתם תעשו את זה, סמכו עליי. \n",
+ " פייתון זורקת הודעות שגיאה מעצבנות ולא אינדיקטיביות כשזה קורה. נסו להיזכר באזהרה הזו 😊 \n",
+ "
\n",
- "ניזכר במחברת הקודמת, שבה למדנו על תנאים. \n",
- "למדנו שבעזרת מילת המפתח if אנחנו יכולים לבקש מהקוד שלנו לבצע סדרת פעולות, רק אם תנאי כלשהו מתקיים. \n",
+ "
\n",
+ "ניזכר במחברת הקודמת, שבה למדנו על תנאים. \n",
+ "למדנו שבעזרת מילת המפתח if אנחנו יכולים לבקש מהקוד שלנו לבצע סדרת פעולות, רק אם תנאי כלשהו מתקיים. \n",
"במילים אחרות: אנחנו יכולים לבקש מקטע קוד לרוץ, רק אם ביטוי בוליאני מסוים שווה ל־True.\n",
"
\n",
- "בקוד שלמעלה, ביקשנו מהמשתמש להזין את מספר הנעליים שיש לו, ואם המספר היה אי־זוגי הדפסנו לו שמשהו מוזר מתרחש. \n",
+ "
\n",
+ "בקוד שלמעלה, ביקשנו מהמשתמש להזין את מספר הנעליים שיש לו, ואם המספר היה אי־זוגי הדפסנו לו שמשהו מוזר מתרחש. \n",
"אבל מה קורה אם נרצה להדפיס למשתמש הודעת אישור כשאנחנו מגלים שהכול בסדר?\n",
"
\n",
- " כיצד הייתם משפרים את התוכנית שלמעלה כך שתדפיס למשתמש הודעת אישור שהכול בסדר? \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " כיצד הייתם משפרים את התוכנית שלמעלה כך שתדפיס למשתמש הודעת אישור שהכול בסדר? \n",
" השתמשו בכלים שרכשתם במחברת הקודמת. נסו לחשוב על לפחות 2 דרכים דומות.\n",
"
\n",
- "
\n",
- "
\n",
- "
\n",
- " חשוב! \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "חשוב! \n",
" פתרו לפני שתמשיכו!\n",
"
\n",
- "
\n",
+ "
\n",
"
"
]
},
@@ -90,14 +90,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## מה אם לא? על מילת המפתח else"
+ "## מה אם לא? על מילת המפתח else"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "כדי להדפיס למשתמש הודעה מתאימה בכל מצב, הוספנו תנאי הפוך מהתנאי הראשון, שידפיס למשתמש הודעה מתאימה. \n",
- "אחד הדברים המעניינים בתוכנית שלמעלה, הוא שיש לנו שני תנאים שמנוגדים זה לזה במשמעות שלהם. אחד בודק זוגיות, והשני בודק אי־זוגיות. \n",
+ "
\n",
+ "כדי להדפיס למשתמש הודעה מתאימה בכל מצב, הוספנו תנאי הפוך מהתנאי הראשון, שידפיס למשתמש הודעה מתאימה. \n",
+ "אחד הדברים המעניינים בתוכנית שלמעלה, הוא שיש לנו שני תנאים שמנוגדים זה לזה במשמעות שלהם. אחד בודק זוגיות, והשני בודק אי־זוגיות. \n",
"למעשה, אם היינו רוצים לנסח את הקוד במילים, היינו יכולים להגיד: אם מספר הנעליים הוא אי־זוגי, הדפס שיש בעיה. אחרת, הדפס שהכול בסדר.\n",
"
\n",
- " פייתון מקנה לנו כלי נוח לבטא את ה\"אחרת\" הזה, כלי שמקל על הקריאוּת של הקוד – מילת המפתח else. \n",
+ "
\n",
+ " פייתון מקנה לנו כלי נוח לבטא את ה\"אחרת\" הזה, כלי שמקל על הקריאוּת של הקוד – מילת המפתח else. \n",
" נראה איך אפשר לנסח את הקוד שלמעלה בעזרת else:\n",
"
\n",
- "שימו לב לצורת ההזחה: ה־else אינו מוזח, אך התוכן שבתוכו כן. \n",
- "נזכור גם ש־else קשור ל־if שלפניו, ומדבר על המקרה המשלים לתנאי שנמצא באותו if. \n",
+ "
\n",
+ "שימו לב לצורת ההזחה: ה־else אינו מוזח, אך התוכן שבתוכו כן. \n",
+ "נזכור גם ש־else קשור ל־if שלפניו, ומדבר על המקרה המשלים לתנאי שנמצא באותו if. \n",
"דרך נוספת לחשוב על else היא שקטע הקוד בתוך ה־else יתבצע אם תוצאתו של הביטוי הבוליאני שמופיע כתנאי של ה־if היא False.\n",
"
\n",
- " קלטו את כמות העותקים שנמכרו עבור אלבום המטאל המצליח \"רוצח או נזלת\", והדפיסו את דירוג האלבום. \n",
- " לדוגמה, אם המשתמש הכניס שמספר המכירות היה 520,196, הדפיסו \"אלבום זהב\". \n",
- " אם האלבום לא נמכר מספיק כדי לזכות בדירוג, הדפיסו \"האלבום אינו רב־מכר\". \n",
- "
\n",
- "
\n",
- "
\n",
- "
\n",
- " חשוב! \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " קלטו את כמות העותקים שנמכרו עבור אלבום המטאל המצליח \"רוצח או נזלת\", והדפיסו את דירוג האלבום. \n",
+ " לדוגמה, אם המשתמש הכניס שמספר המכירות היה 520,196, הדפיסו \"אלבום זהב\". \n",
+ " אם האלבום לא נמכר מספיק כדי לזכות בדירוג, הדפיסו \"האלבום אינו רב־מכר\". \n",
+ "
\n",
- "ודאי שמתם לב שהקוד נראה מעט מסורבל בגלל כמות ההזחות, והוא יוסיף ויסתרבל ככל שנוסיף יותר מקרים אפשריים. \n",
- "ננסה לפתור את זה בעזרת הגדרת טווחים מדויקים עבור כל דירוג. \n",
+ "
\n",
+ "ודאי שמתם לב שהקוד נראה מעט מסורבל בגלל כמות ההזחות, והוא יוסיף ויסתרבל ככל שנוסיף יותר מקרים אפשריים. \n",
+ "ננסה לפתור את זה בעזרת הגדרת טווחים מדויקים עבור כל דירוג. \n",
"הקוד המשופץ ייראה כך:\n",
"
\n",
- "הקוד נראה טוב יותר במידה ניכרת, אבל בכל if אנחנו בודקים שהתנאי שלפניו לא התקיים, וזה מסורבל מאוד. \n",
+ "
\n",
+ "הקוד נראה טוב יותר במידה ניכרת, אבל בכל if אנחנו בודקים שהתנאי שלפניו לא התקיים, וזה מסורבל מאוד. \n",
"אנחנו עושים את זה כדי למנוע הדפסה כפולה: אומנם כל אלבום זהב נמכר מספיק פעמים כדי להיות מוכתר כאלבום כסף, אבל לא נרצה להדפיס למשתמש את שתי ההודעות.
\n",
- "כדי לפתור את הבעיה שהוצגה למעלה, פייתון מעניקה לנו כלי נוסף שנקרא elif. \n",
- "מדובר בסך הכול בקיצור של else... if (תנאי), או בעברית: אם התנאי הקודם לא התקיים, בדוק אם... \n",
+ "
\n",
+ "כדי לפתור את הבעיה שהוצגה למעלה, פייתון מעניקה לנו כלי נוסף שנקרא elif. \n",
+ "מדובר בסך הכול בקיצור של else... if (תנאי), או בעברית: אם התנאי הקודם לא התקיים, בדוק אם... \n",
"ראו, לדוגמה, איך נשפר את הקוד הקודם לקוד קריא יותר במידה רבה:\n",
"
\n",
- " הטריק הוא שבשורה שבה כתוב elif, פייתון תנסה לבדוק את התנאי רק אם התנאים שלפניו לא התקיימו. \n",
- " במילים אחרות – ערכיהם של הביטויים הבוליאניים בכל התנאים שלפניו היו False. \n",
+ "###
מה קורה כאן?
\n",
+ "
\n",
+ " הטריק הוא שבשורה שבה כתוב elif, פייתון תנסה לבדוק את התנאי רק אם התנאים שלפניו לא התקיימו. \n",
+ " במילים אחרות – ערכיהם של הביטויים הבוליאניים בכל התנאים שלפניו היו False. \n",
" בכל שורה שבה יש if או elif, פייתון בודקת האם הביטוי הבוליאני שבאותה שורה מתקיים, ואז:\n",
"
\n",
- "\n",
- "\n",
- "
אם כן, היא מבצעת את הפעולות המוזחות מתחת לתנאי ומפסיקה לבדוק את התנאים הבאים.
\n",
- "
אם לא, היא עוברת לבדוק את התנאי ב־elif־ים הבאים (אם ישנם elif־ים).
\n",
- "
אם אף אחד מהתנאים לא מתקיים, יתבצע קטע הקוד ששייך ל־else (אם יש else).
\n",
+ "\n",
+ "
אם כן, היא מבצעת את הפעולות המוזחות מתחת לתנאי ומפסיקה לבדוק את התנאים הבאים.
\n",
+ "
אם לא, היא עוברת לבדוק את התנאי ב־elif־ים הבאים (אם ישנם elif־ים).
\n",
+ "
אם אף אחד מהתנאים לא מתקיים, יתבצע קטע הקוד ששייך ל־else (אם יש else).
\n",
- " ניתן לכתוב if בלי else ובלי elif־ים אחריו. \n",
- " if תמיד יהיה ראשון, ואם יש צורך להוסיף מקרים, else תמיד יהיה אחרון, וביניהם יהיו elif־ים. \n",
- "
\n",
- "
\n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " ניתן לכתוב if בלי else ובלי elif־ים אחריו. \n",
+ "if תמיד יהיה ראשון, ואם יש צורך להוסיף מקרים, else תמיד יהיה אחרון, וביניהם יהיו elif־ים. \n",
+ "
\n",
- "שם המשתמש שלי לבנק הוא wrong, והסיסמה שלי היא ads sports. \n",
+ "
\n",
+ "שם המשתמש שלי לבנק הוא wrong, והסיסמה שלי היא ads sports. \n",
"שם המשתמש של מנהל הבנק היא admin, והסיסמה שלו היא is trator.\n",
- " \n",
- "קבלו מהמשתמש שם משתמש וסיסמה, והדפיסו לו הודעה שמספרת לו לאיזה משתמש הוא הצליח להתחבר. \n",
+ " \n",
+ "קבלו מהמשתמש שם משתמש וסיסמה, והדפיסו לו הודעה שמספרת לו לאיזה משתמש הוא הצליח להתחבר. \n",
"אם לא הצליח להתחבר, הדפיסו לו הודעת שגיאה מתאימה.\n",
"
\n",
- "דני רוצה ללמוד חשבון, ולצורך כך הוא צריך מחשבון פשוט שיעזור לו. \n",
- "כתבו תוכנה שמקבלת 2 מספרים ופעולה חשבונית (+, -, *, / או **), ויודעת להחזיר את התשובה הנכונה לתרגיל. \n",
+ "
\n",
+ "דני רוצה ללמוד חשבון, ולצורך כך הוא צריך מחשבון פשוט שיעזור לו. \n",
+ "כתבו תוכנה שמקבלת 2 מספרים ופעולה חשבונית (+, -, *, / או **), ויודעת להחזיר את התשובה הנכונה לתרגיל. \n",
"
\n",
- "
\n",
+ "
\n",
"לדוגמה:\n",
"
\n",
- "
\n",
- "
עבור מספר ראשון 5, מספר שני 2 ופעולה / התוכנית תדפיס 2.5, כיוון ש־5/2 == 2.5.
\n",
- "
עבור מספר ראשון 9, מספר שני 2 ופעולה ** התוכנית תדפיס 81, כיוון ש־92 == 81.
\n",
- "
עבור מספר ראשון 3, מספר שני 7 ופעולה - התוכנית תדפיס -4, כיוון ש־3-7 == -4.
\n",
+ "
\n",
+ "
עבור מספר ראשון 5, מספר שני 2 ופעולה / התוכנית תדפיס 2.5, כיוון ש־5/2 == 2.5.
\n",
+ "
עבור מספר ראשון 9, מספר שני 2 ופעולה ** התוכנית תדפיס 81, כיוון ש־92 == 81.
\n",
+ "
עבור מספר ראשון 3, מספר שני 7 ופעולה - התוכנית תדפיס -4, כיוון ש־3-7 == -4.
\n",
- " המיסוי על הכנסה בישראל גבוה מאוד ושיעורו נקבע לפי מדרגות כדלקמן: \n",
+ "
\n",
+ " המיסוי על הכנסה בישראל גבוה מאוד ושיעורו נקבע לפי מדרגות כדלקמן: \n",
"
\n",
- "\n",
- "
מי שמרוויח עד 6,310 ש\"ח, משלם מס בשיעור 10% על הסכום הזה.
\n",
- "
מי שמרוויח עד 9,050 ש\"ח, משלם מס בשיעור 14% על הסכום הזה.
\n",
- "
מי שמרוויח עד 14,530 ש\"ח, משלם מס בשיעור 20% על הסכום הזה.
\n",
- "
מי שמרוויח עד 20,200 ש\"ח, משלם מס בשיעור 31% על הסכום הזה.
\n",
- "
מי שמרוויח עד 42,030 ש\"ח, משלם מס בשיעור 35% על הסכום הזה.
\n",
- "
מי שמרוויח עד 54,130 ש\"ח, משלם מס בשיעור 47% על הסכום הזה.
\n",
- "
מי שמרוויח מעל הסכום האחרון, משלם מס בשיעור 50% על הסכום הזה.
\n",
+ "\n",
+ "
מי שמרוויח עד 6,310 ש\"ח, משלם מס בשיעור 10% על הסכום הזה.
\n",
+ "
מי שמרוויח עד 9,050 ש\"ח, משלם מס בשיעור 14% על הסכום הזה.
\n",
+ "
מי שמרוויח עד 14,530 ש\"ח, משלם מס בשיעור 20% על הסכום הזה.
\n",
+ "
מי שמרוויח עד 20,200 ש\"ח, משלם מס בשיעור 31% על הסכום הזה.
\n",
+ "
מי שמרוויח עד 42,030 ש\"ח, משלם מס בשיעור 35% על הסכום הזה.
\n",
+ "
מי שמרוויח עד 54,130 ש\"ח, משלם מס בשיעור 47% על הסכום הזה.
\n",
+ "
מי שמרוויח מעל הסכום האחרון, משלם מס בשיעור 50% על הסכום הזה.
\n",
"\n",
- "
\n",
- " הסכום תמיד משולם על ההפרש בין המדרגות. \n",
- " לדוגמה, אם הרווחתי בחודש מסוים 10,000 ש\"ח, תשלום המיסים שלי יחושב כך: \n",
- " על 6,310 השקלים הראשונים אשלם 631 ש\"ח, שהם 10% מאותה מדרגה. \n",
- " על הסכום העודף עד 9,050 שקלים, שהוא 2,740 שקלים (9,050 - 6,310) אשלם 383.6 שקלים, שהם 14% מ־2,740 שקלים. \n",
- " על הסכום העודף בסך 950 שקלים (10,000 - 9,050) אשלם 190 ש\"ח, שהם 20% מ־950 שקלים. \n",
+ "
\n",
+ " הסכום תמיד משולם על ההפרש בין המדרגות. \n",
+ " לדוגמה, אם הרווחתי בחודש מסוים 10,000 ש\"ח, תשלום המיסים שלי יחושב כך: \n",
+ " על 6,310 השקלים הראשונים אשלם 631 ש\"ח, שהם 10% מאותה מדרגה. \n",
+ " על הסכום העודף עד 9,050 שקלים, שהוא 2,740 שקלים (9,050 - 6,310) אשלם 383.6 שקלים, שהם 14% מ־2,740 שקלים. \n",
+ " על הסכום העודף בסך 950 שקלים (10,000 - 9,050) אשלם 190 ש\"ח, שהם 20% מ־950 שקלים. \n",
" בסך הכול, אשלם למס הכנסה באותו חודש 631 + 383.6 + 190 ש\"ח, שהם 1,204.6 שקלים.\n",
"
\n",
- "\n",
- "
\n",
+ "
\n",
" כתבו קוד למחשבון שמקבל את השכר החודשי שלכם ומדפיס את סכום המס שתשלמו.\n",
- "
\n",
- "פונקציה היא קטע קוד קצר ותחום שנועד לפתור בעיה ספציפית. \n",
- "כל פונקציה היא מעין רכיב בתוכנה שלנו שנושא שם מסוים. אפשר להסתכל על פונקציה כקטע קוד שמממש משימה מוגדרת היטב. \n",
- "לדוגמה, פונקציה יכולה להיות \"המר טמפרטורה ממעלות פרנהייט לצלזיוס\". \n",
- "במובן הזה, פונקציות הן כמו תוכניות קטנות – יש להן קלט, הן עושות תהליך מסוים ומחזירות תוצאה מסוימת. \n",
+ "
\n",
+ "פונקציה היא קטע קוד קצר ותחום שנועד לפתור בעיה ספציפית. \n",
+ "כל פונקציה היא מעין רכיב בתוכנה שלנו שנושא שם מסוים. אפשר להסתכל על פונקציה כקטע קוד שמממש משימה מוגדרת היטב. \n",
+ "לדוגמה, פונקציה יכולה להיות \"המר טמפרטורה ממעלות פרנהייט לצלזיוס\". \n",
+ "במובן הזה, פונקציות הן כמו תוכניות קטנות – יש להן קלט, הן עושות תהליך מסוים ומחזירות תוצאה מסוימת. \n",
"אם ניקח את הפונקציה המדוברת מלמעלה, אפשר לתאר אותה כתוכנית קטנה כך:\n",
"
\n",
- "
\n",
- "
קלט – טמפרטורה מסוימת
\n",
- "
תהליך – המרת הטמפרטורה למעלות צלזיוס
\n",
- "
פלט – החזרת התוצאה
\n",
+ "
\n",
+ "
קלט – טמפרטורה מסוימת
\n",
+ "
תהליך – המרת הטמפרטורה למעלות צלזיוס
\n",
+ "
פלט – החזרת התוצאה
\n",
"
\n",
- "
\n",
- "פונקציות הן למעשה אבני הבניין של תוכנה – כל פונקציה שואפת למלא תפקיד מוגדר בתוכנה, ובעזרת הרבה אבני בניין שכאלו אפשר לבנות תוכנה מורכבת. \n",
+ "
\n",
+ "פונקציות הן למעשה אבני הבניין של תוכנה – כל פונקציה שואפת למלא תפקיד מוגדר בתוכנה, ובעזרת הרבה אבני בניין שכאלו אפשר לבנות תוכנה מורכבת. \n",
"התוכנות שבהן אתם משתמשים ביום־יום מורכבות בדרך כלל מכמות רבה מאוד של פונקציות. \n",
"
\n",
- "עד סוף השיעור נדע איך יוצרים פונקציה כזו ואיך משתמשים בה. \n",
- "נדמיין פונקציה כמכונה שמקבלת ערכים, ויודעת לתת לנו פלט מסוים לפי אותם ערכים. \n",
+ "
\n",
+ "עד סוף השיעור נדע איך יוצרים פונקציה כזו ואיך משתמשים בה. \n",
+ "נדמיין פונקציה כמכונה שמקבלת ערכים, ויודעת לתת לנו פלט מסוים לפי אותם ערכים. \n",
"אחרי שכתבנו פונקציה ובדקנו שהיא עובדת, נוכל להשתמש בה בלי לנסות לפענח בכל פעם מחדש את הלוגיקה שנמצאת בתוכה.\n",
"
"
]
@@ -59,9 +59,9 @@
"metadata": {},
"source": [
"\n",
- " \n",
- " \n",
- " ככה אני מדמיין פונקציה: \n",
+ "\n",
+ "\n",
+ " ככה אני מדמיין פונקציה: \n",
" מכונה שמקבלת קלט ומוציאה פלט, ושאף אחד לא צריך לדעת מה קורה בתוכה.\n",
" \n",
""
@@ -71,19 +71,19 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "##
\n",
- "אחת הפונקציות שכמעט כולם מכירים היא העלאה בריבוע. \n",
- "הקלט של הפונקציה הוא מספר כלשהו, התהליך שקורה בפונקציה הוא הכפלת המספר בעצמו, והפלט הוא תוצאת המכפלה. \n",
- "לדוגמה, הקלט של פונקציה בשם \"העלאה בריבוע\" יכול להיות 5, והפלט שלה יהיה 25. \n",
+ "
\n",
+ "אחת הפונקציות שכמעט כולם מכירים היא העלאה בריבוע. \n",
+ "הקלט של הפונקציה הוא מספר כלשהו, התהליך שקורה בפונקציה הוא הכפלת המספר בעצמו, והפלט הוא תוצאת המכפלה. \n",
+ "לדוגמה, הקלט של פונקציה בשם \"העלאה בריבוע\" יכול להיות 5, והפלט שלה יהיה 25. \n",
"דוגמאות נוספות לקלט הן -3, שעבורו הפלט יהיה 9,\n",
- "או 0.5, שעבורו הפלט יהיה 0.25. \n",
+ "או 0.5, שעבורו הפלט יהיה 0.25. \n",
"
\n",
- "ההתחלה תהיה קפיצת ראש למים העמוקים, אבל אל חשש! אני אסביר בקרוב מה קורה כאן. בינתיים אני בונה קצת מתח. \n",
+ "
\n",
+ "ההתחלה תהיה קפיצת ראש למים העמוקים, אבל אל חשש! אני אסביר בקרוב מה קורה כאן. בינתיים אני בונה קצת מתח. \n",
"דבר ראשון נזרוק את הפתרון של התרגיל בתוך פונקציה.\n",
"
\n",
- "בתא שממש פה מעל, השתמשנו במילת המפתח def ובעזרתה הגדרנו פונקציה שנקראת calculate_calories. \n",
- "לפני שניכנס לפרטים על אודות ההגדרה ומה היא עושה, הריצו את התא ונסו לשים אצבע על תופעה משונה בתא הזה... \n",
+ "
\n",
+ "בתא שממש פה מעל, השתמשנו במילת המפתח def ובעזרתה הגדרנו פונקציה שנקראת calculate_calories. \n",
+ "לפני שניכנס לפרטים על אודות ההגדרה ומה היא עושה, הריצו את התא ונסו לשים אצבע על תופעה משונה בתא הזה... \n",
"ובכן, התופעה המשונה היא שבניגוד לפתרון התרגיל בלי הפונקציה שכתבנו למעלה, התא שבו הפונקציה כתובה לא עושה כלום!\n",
"
\n",
- "ובכן, זה מאחר שפונקציות לא פועלות מייד אחרי שמגדירים אותן. \n",
- "בניגוד למסרונים בתקופת בחירות, לפונקציות צריך ממש לקרוא אקטיבית כדי שיבואו. \n",
+ "
\n",
+ "ובכן, זה מאחר שפונקציות לא פועלות מייד אחרי שמגדירים אותן. \n",
+ "בניגוד למסרונים בתקופת בחירות, לפונקציות צריך ממש לקרוא אקטיבית כדי שיבואו. \n",
"נעשה את זה, לפחות בינתיים, על ידי כתיבת השם של הפונקציה ואז סוגריים עגולים ריקים:\n",
"
\n",
- "מה שעשינו בתא שמעל נקרא קריאה לפונקציה, וזו למעשה הדרך לגרום לתוכן של הפונקציה לרוץ. \n",
+ "
\n",
+ "מה שעשינו בתא שמעל נקרא קריאה לפונקציה, וזו למעשה הדרך לגרום לתוכן של הפונקציה לרוץ. \n",
"זה ממש כמו להפעיל מעין תוכנה קטנה בתוך התוכנה שלנו.\n",
"
\n",
- " קריאה לפונקציה חייבת להופיע אחרי הגדרתה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " קריאה לפונקציה חייבת להופיע אחרי הגדרתה. \n",
" אם קודם נקרא לפונקציה ורק אז נגדיר אותה, פייתון עדיין לא תכיר את הפונקציה ותזרוק לנו שגיאה.\n",
"
\n",
- "כדי לזקק את הרעיון, ננסה להגדיר פונקציה פשוטה יחסית, ונקרא לה מייד כדי להפעיל אותה. \n",
+ "
\n",
+ "כדי לזקק את הרעיון, ננסה להגדיר פונקציה פשוטה יחסית, ונקרא לה מייד כדי להפעיל אותה. \n",
"שימו לב למינוחים החשובים: כותרת הפונקציה, גוף הפונקציה, שם הפונקציה והקריאה לפונקציה.\n",
"
\n",
- "נהוג להגיד שכל פונקציה צריכה להיות אחראית לדבר אחד בלבד. \n",
- "במילים אחרות – כמה שפחות עבודה בתוך כל פונקציה, וכמה שיותר התמקדות במה שהיא באמת צריכה לעשות, כך ייטב. \n",
+ "
\n",
+ "נהוג להגיד שכל פונקציה צריכה להיות אחראית לדבר אחד בלבד. \n",
+ "במילים אחרות – כמה שפחות עבודה בתוך כל פונקציה, וכמה שיותר התמקדות במה שהיא באמת צריכה לעשות, כך ייטב. \n",
"אחד הדברים הראשונים שנוח לנו להוציא מהפונקציה שלנו זה הקלט מהמשתמש, שביצענו בתוך הפונקציה:\n",
"
\n",
- "הקוד הזה אומנם יעבוד, אבל הוא כתוב בצורה גרועה מאוד. \n",
- "הוא מפר את העיקרון שהתחלנו איתו – פונקציה אמורה להיות יחידה עצמאית, קטנה וארוזה. \n",
+ "
\n",
+ "הקוד הזה אומנם יעבוד, אבל הוא כתוב בצורה גרועה מאוד. \n",
+ "הוא מפר את העיקרון שהתחלנו איתו – פונקציה אמורה להיות יחידה עצמאית, קטנה וארוזה. \n",
"היא אמורה להיות תלויה כמה שפחות בסביבה החיצונית.\n",
"
\n",
- "
\n",
- "בתוך הפונקציה אנחנו מתייחסים למשתנים fat, protein ו־carbs, שאינם חלק מהפונקציה. \n",
- "ייתכן שבעתיד מישהו יעתיק את הפונקציה calculate_calories לתוכנית שלו, והמשתנים הללו לא יהיו מוגדרים בגוף התוכנית. \n",
+ "
\n",
+ "בתוך הפונקציה אנחנו מתייחסים למשתנים fat, protein ו־carbs, שאינם חלק מהפונקציה. \n",
+ "ייתכן שבעתיד מישהו יעתיק את הפונקציה calculate_calories לתוכנית שלו, והמשתנים הללו לא יהיו מוגדרים בגוף התוכנית. \n",
"במקרה כזה, לפונקציה לא יהיה מאיפה לקחת את הערכים והיא תקרוס.\n",
"
\n",
- "שימו לב לכותרת הפונקציה. \n",
- "הכנסנו לשם את שמות 3 המשתנים הדרושים להרצת הפונקציה. \n",
- "אם תרצו, תוכלו להסתכל על זה כ\"הקלט שנדרש עבור הפונקציה\", או במקרה שלנו: \"הנתונים שדרושים כדי לחשב את כמות הקלוריות במוצר\". \n",
+ "
\n",
+ "שימו לב לכותרת הפונקציה. \n",
+ "הכנסנו לשם את שמות 3 המשתנים הדרושים להרצת הפונקציה. \n",
+ "אם תרצו, תוכלו להסתכל על זה כ\"הקלט שנדרש עבור הפונקציה\", או במקרה שלנו: \"הנתונים שדרושים כדי לחשב את כמות הקלוריות במוצר\". \n",
"החלק הזה שהוספנו לפונקציה נקרא הפרמטרים של הפונקציה: כל אחד מהנתונים carbs, fat ו־protein הוא פרמטר.\n",
"
\n",
- "
\n",
+ "
\n",
"השם התיאורטי והמפונפן שמתכנתים משתמשים בו עבור השילוב של שם הפונקציה עם שמות הפרמטרים שלה נקרא חתימת הפונקציה.\n",
"
\n",
- "איך תראה הקריאה לפונקציה עכשיו? \n",
- "אותו דבר, רק שבתוך הסוגריים נכתוב את הערכים שעבורם נרצה לחשב את כמות הקלוריות, לפי הסדר של הפרמטרים. \n",
+ "
\n",
+ "איך תראה הקריאה לפונקציה עכשיו? \n",
+ "אותו דבר, רק שבתוך הסוגריים נכתוב את הערכים שעבורם נרצה לחשב את כמות הקלוריות, לפי הסדר של הפרמטרים. \n",
"הערכים שנעביר בתוך הקריאה לפונקציה נקראים ארגומנטים.\n",
"
\n",
- "הפונקציה שלנו מתחילה להיראות נהדר, אבל מתכנתים מנוסים עדיין יעקמו את האף. \n",
- "כמו שאמרנו, פונקציה אמורה לעשות כמה שפחות, ולכן נעדיף שהיא גם לא תדפיס בעצמה את הערך שחישבה. \n",
- "היינו מעדיפים לקבל מהפונקציה רק את מספר הקלוריות שחישבנו, בלי טקסט מיותר. \n",
+ "
\n",
+ "הפונקציה שלנו מתחילה להיראות נהדר, אבל מתכנתים מנוסים עדיין יעקמו את האף. \n",
+ "כמו שאמרנו, פונקציה אמורה לעשות כמה שפחות, ולכן נעדיף שהיא גם לא תדפיס בעצמה את הערך שחישבה. \n",
+ "היינו מעדיפים לקבל מהפונקציה רק את מספר הקלוריות שחישבנו, בלי טקסט מיותר. \n",
"
\n",
- "יש לצורת עבודה כזו יתרונות משמעותיים. \n",
+ "
\n",
+ "יש לצורת עבודה כזו יתרונות משמעותיים. \n",
"אם הפונקציה תחזיר ערך מספרי, נוכל לעשות בו שימוש בפונקציות אחרות כדי לבצע פעולות המשך על התוצאה, כמו נניח: \n",
"
\n",
- "\n",
- "
לחשב כמה זמן אנחנו צריכים ללכת כדי לשרוף את כמות הקלוריות שצרכנו.
\n",
- "
לחשב כמה סופגניות היינו יכולים לאכול במקום הארוחה שחישבנו את כמות הקלוריות בה.
\n",
- "
לחשב אם נמכרו השנה מספיק המבורגרים של מקדונלדס כדי להשיג אנרגיה המשתווה בעוצמתה לפצצה שנחתה על הירושימה.
\n",
+ "\n",
+ "
לחשב כמה זמן אנחנו צריכים ללכת כדי לשרוף את כמות הקלוריות שצרכנו.
\n",
+ "
לחשב כמה סופגניות היינו יכולים לאכול במקום הארוחה שחישבנו את כמות הקלוריות בה.
\n",
+ "
לחשב אם נמכרו השנה מספיק המבורגרים של מקדונלדס כדי להשיג אנרגיה המשתווה בעוצמתה לפצצה שנחתה על הירושימה.
\n",
- "מממ... זה לא עבד כמצופה. \n",
- "הסיבה שלא הצלחנו לקבל את התוכן של המשתנה calories מתוך הפונקציה, היא בגלל העיקרון שפונקציה היא קופסה סגורה. \n",
- "לכן, משתנים שמוגדרים בתוך הפונקציה זמינים אך ורק בתוכה, ונעלמים כשהיא מסיימת לרוץ. \n",
+ "
\n",
+ "מממ... זה לא עבד כמצופה. \n",
+ "הסיבה שלא הצלחנו לקבל את התוכן של המשתנה calories מתוך הפונקציה, היא בגלל העיקרון שפונקציה היא קופסה סגורה. \n",
+ "לכן, משתנים שמוגדרים בתוך הפונקציה זמינים אך ורק בתוכה, ונעלמים כשהיא מסיימת לרוץ. \n",
"
\n",
- "עוד לפני שאתייחס למילת המפתח החדשה return, שימו לב כמה נעים לקרוא את הפונקציה הזו. \n",
- "הפונקציה מתמקדת אך ורק במה שהיא אמורה לעשות, ואפשר להבין בקלות מה המטרה שלה ומה היא מבצעת. \n",
+ "
\n",
+ "עוד לפני שאתייחס למילת המפתח החדשה return, שימו לב כמה נעים לקרוא את הפונקציה הזו. \n",
+ "הפונקציה מתמקדת אך ורק במה שהיא אמורה לעשות, ואפשר להבין בקלות מה המטרה שלה ומה היא מבצעת. \n",
"גם מתכנת שכלל לא מכיר את המטרה שלנו ואת התרגיל שממנו התחלנו, יכול במבט חטוף להבין מה ניסינו לעשות.\n",
"
\n",
- "אם זה עוזר לתפיסת הנושא עבורכם, תוכלו לדמיין מה קורה מאחורי הקלעים: \n",
- "פייתון רואה קריאה לפונקציה. היא מעבירה את הארגומנטים ששלחתם לתוך הפרמטרים שמופיעים בכותרת הפונקציה. \n",
- "כשהפונקציה מחזירה ערך, החלק בקוד שקרא לפונקציה ממש מתחלף בערך שחזר מהפונקציה. \n",
+ "
\n",
+ "אם זה עוזר לתפיסת הנושא עבורכם, תוכלו לדמיין מה קורה מאחורי הקלעים: \n",
+ "פייתון רואה קריאה לפונקציה. היא מעבירה את הארגומנטים ששלחתם לתוך הפרמטרים שמופיעים בכותרת הפונקציה. \n",
+ "כשהפונקציה מחזירה ערך, החלק בקוד שקרא לפונקציה ממש מתחלף בערך שחזר מהפונקציה. \n",
"כך ששלב הביניים, לפני ההדפסה למסך, נראה מבחינת פייתון כך (השוו עם המשבצת הקודמת):\n",
"
\n",
- "העיקרון האחרון שניגע בו הוא העיקרון של החזרה מיידית. \n",
- "ברגע שפונקציה מגיעה לשורה שבה כתוב return, היא תחזיר ערך ותסיים את ריצתה באותה שורה. \n",
+ "
\n",
+ "העיקרון האחרון שניגע בו הוא העיקרון של החזרה מיידית. \n",
+ "ברגע שפונקציה מגיעה לשורה שבה כתוב return, היא תחזיר ערך ותסיים את ריצתה באותה שורה. \n",
"בואו נראה דוגמה:\n",
"
\n",
- "לפניכם דוגמה של פונקציה שמחשבת את הערך המוחלט של מספר. \n",
- "לצורך הדוגמה הזו, הערך המוחלט של מספר מוגדר כמרחק שלו מהמספר אפס. \n",
+ "
\n",
+ "לפניכם דוגמה של פונקציה שמחשבת את הערך המוחלט של מספר. \n",
+ "לצורך הדוגמה הזו, הערך המוחלט של מספר מוגדר כמרחק שלו מהמספר אפס. \n",
"למשל, הערך המוחלט של 6 הוא 6, והערך המוחלט של -4 הוא 4.\n",
"
\n",
- "ייתכן שלא שמתם לב, אבל אתם כבר מכירים פונקציות מועילות ואפילו יצא לכם להשתמש בהן! \n",
- "לדוגמה, הפונקציה print שמטרתה להדפיס למסך הודעה שהיא מקבלת כארגומנט, \n",
+ "
\n",
+ "ייתכן שלא שמתם לב, אבל אתם כבר מכירים פונקציות מועילות ואפילו יצא לכם להשתמש בהן! \n",
+ "לדוגמה, הפונקציה print שמטרתה להדפיס למסך הודעה שהיא מקבלת כארגומנט, \n",
"או הפונקציה type שמטרתה להחזיר את סוג המשתנה שהיא מקבלת כארגומנט.\n",
"
\n",
- "עכשיו, כשאתם כבר מבינים איך עובדות פונקציות, הגיע הזמן להכיר פונקציה חדשה: len. \n",
- "הפונקציה הזו מקבלת מחרוזת – ומחזירה את האורך שלה. \n",
+ "
\n",
+ "עכשיו, כשאתם כבר מבינים איך עובדות פונקציות, הגיע הזמן להכיר פונקציה חדשה: len. \n",
+ "הפונקציה הזו מקבלת מחרוזת – ומחזירה את האורך שלה. \n",
"בואו ננסה:\n",
"
\n",
- "פונקציות מחלקות את הקוד שלנו לקטעים קטנים ובעלי שם, שיש מאחוריהם רעיון אחד שקל לקרוא ולתפוס. \n",
- "חלוקה לקטעים קטנים מאפשרת לנו לעקוב ביעילות אחרי מבנה התוכנית. \n",
+ "
\n",
+ "פונקציות מחלקות את הקוד שלנו לקטעים קטנים ובעלי שם, שיש מאחוריהם רעיון אחד שקל לקרוא ולתפוס. \n",
+ "חלוקה לקטעים קטנים מאפשרת לנו לעקוב ביעילות אחרי מבנה התוכנית. \n",
"כשנרצה לערוך חלק מסוים בתוכנית בשלב כלשהו – נדע בקלות ובמהירות איזה קטע בקוד צריך לשנות.\n",
"
\n",
- "פונקציות עוזרות לנו למנוע מצבים שבהם היינו צריכים לכתוב קוד כמה פעמים. \n",
- "זה מועיל מכיוון שזה מאפשר לנו להשתמש מאוד מהר בקוד שכבר כתבנו בעבר. \n",
+ "
\n",
+ "פונקציות עוזרות לנו למנוע מצבים שבהם היינו צריכים לכתוב קוד כמה פעמים. \n",
+ "זה מועיל מכיוון שזה מאפשר לנו להשתמש מאוד מהר בקוד שכבר כתבנו בעבר. \n",
"סיבה נוספת שיש להזכיר לחיוב, היא שתחזוקת הקוד קלה במידה ניכרת כשמבצעים שינוי במקום אחד מוגדר, במקום במקומות רבים ברחבי הקוד.\n",
"
\n",
- "פונקציה היא מעין יחידת תוכנה בסיסית וקטנה. \n",
- "היא עוזרת לנו לחלק את התוכנה שלנו לתתי־משימות, ועושה אותה לקריאה יותר ולקלה יותר לתחזוקה. \n",
- "את הפונקציה אנחנו מגדירים בעזרת כותרת הפונקציה, שמכילה את מילת המפתח def, ואז את שם הפונקציה ואת הפרמטרים שהיא אמורה לקבל. \n",
- "מייד לאחר כותרת הפונקציה נגדיר בהזחה את גוף הפונקציה – שכולל את החישובים או את הפעולות שהפונקציה צריכה לבצע, \n",
- "ובסוף נבצע החזרה לערך ההחזרה שיופיע אחרי מילת המפתח return. \n",
+ "
\n",
+ "פונקציה היא מעין יחידת תוכנה בסיסית וקטנה. \n",
+ "היא עוזרת לנו לחלק את התוכנה שלנו לתתי־משימות, ועושה אותה לקריאה יותר ולקלה יותר לתחזוקה. \n",
+ "את הפונקציה אנחנו מגדירים בעזרת כותרת הפונקציה, שמכילה את מילת המפתח def, ואז את שם הפונקציה ואת הפרמטרים שהיא אמורה לקבל. \n",
+ "מייד לאחר כותרת הפונקציה נגדיר בהזחה את גוף הפונקציה – שכולל את החישובים או את הפעולות שהפונקציה צריכה לבצע, \n",
+ "ובסוף נבצע החזרה לערך ההחזרה שיופיע אחרי מילת המפתח return. \n",
"כדי להשתמש בפונקציה נקרא לפונקציה בהמשך הקוד על ידי כתיבת השם שלה, ובתוך סוגריים נפרט את הארגומנטים, שהם הערכים שנרצה להעביר לפונקציה.\n",
"
\n",
- "חשוב לזכור! \n",
- "המשתנים בתוך הפונקציה אינם נגישים מבחוץ, כיוון שהיא נחשבת יחידה סגורה. \n",
+ "
\n",
+ "חשוב לזכור! \n",
+ "המשתנים בתוך הפונקציה אינם נגישים מבחוץ, כיוון שהיא נחשבת יחידה סגורה. \n",
"כמו כן, ברגע שהפונקציה מריצה שורה שבה כתוב return, היא מחזירה ערך וריצתה נפסקת.\n",
"
\n",
- "דני מתאמן למרתון הקרוב. הוא מתחיל להתכונן על אש נמוכה, ורץ אתמול 5 קילומטרים. \n",
- "כתבו פונקציה שמקבלת כמה שעות לקח לדני לגמוע את 5 הקילומטרים הללו, ומחשבת מה קצב הריצה הממוצע של דני, בקמ\"ש. \n",
- "כתבו פונקציה נוספת שבודקת אם דני יכול להשלים מרתון בתוך 3 שעות. \n",
+ "
\n",
+ "דני מתאמן למרתון הקרוב. הוא מתחיל להתכונן על אש נמוכה, ורץ אתמול 5 קילומטרים. \n",
+ "כתבו פונקציה שמקבלת כמה שעות לקח לדני לגמוע את 5 הקילומטרים הללו, ומחשבת מה קצב הריצה הממוצע של דני, בקמ\"ש. \n",
+ "כתבו פונקציה נוספת שבודקת אם דני יכול להשלים מרתון בתוך 3 שעות. \n",
"אורכו של מסלול מרתון הוא 42.195 קילומטר.\n",
"
\n",
- "ניתן לחשב באיזו מהירות (בקמ\"ש) דני רץ אם ניקח את כמות הקילומטרים שעבר, ונחלק אותה בכמות השעות שרץ. \n",
- "ניתן לחשב כמה זמן יקח לדני לרוץ מסלול מסוים, אם ניקח את המרחק בקילומטרים שרץ ונחלק אותו במהירות של דני (בקמ\"ש). \n",
+ "
\n",
+ "ניתן לחשב באיזו מהירות (בקמ\"ש) דני רץ אם ניקח את כמות הקילומטרים שעבר, ונחלק אותה בכמות השעות שרץ. \n",
+ "ניתן לחשב כמה זמן יקח לדני לרוץ מסלול מסוים, אם ניקח את המרחק בקילומטרים שרץ ונחלק אותו במהירות של דני (בקמ\"ש). \n",
"ניתן לחשב כמה קילומטרים דני ירוץ בזמן נתון, אם ניקח את המהירות שלו בקמ\"ש ונכפיל אותה בזמן שלקח לו לרוץ את המרחק הזה.\n",
"
\n",
"זוהי גרסה של תרגיל פופולרי בראיונות עבודה.\n",
"
\n",
- "
\n",
- "כתבו פונקציה שמקבלת מספר. \n",
- "אם המספר מתחלק ב־3 ללא שארית, הדפיסו Fizz. \n",
- "אם המספר מתחלק ב־5 ללא שארית, הדפיסו Buzz. \n",
- "אם המספר מתחלק גם ב־3 וגם ב־5 ללא שארית, הדפיסו FizzBuzz. \n",
+ "
\n",
+ "כתבו פונקציה שמקבלת מספר. \n",
+ "אם המספר מתחלק ב־3 ללא שארית, הדפיסו Fizz. \n",
+ "אם המספר מתחלק ב־5 ללא שארית, הדפיסו Buzz. \n",
+ "אם המספר מתחלק גם ב־3 וגם ב־5 ללא שארית, הדפיסו FizzBuzz. \n",
"אם המספר לא מתחלק ב־3 ולא מתחלק ב־5, הדפיסו את המספר עצמו.\n",
"
\n",
- "\n",
- "
\n",
+ "
\n",
" לדוגמה,\n",
- " עבור המספר 9 הדפיסו Fizz, \n",
- " עבור המספר 10 הדפיסו Buzz, \n",
- " עבור המספר 15 הדפיסו FizzBuzz, \n",
+ " עבור המספר 9 הדפיסו Fizz, \n",
+ " עבור המספר 10 הדפיסו Buzz, \n",
+ " עבור המספר 15 הדפיסו FizzBuzz, \n",
" ועבור המספר 7 הדפיסו 7.\n",
"
\n",
- "כתבו פונקציה שמקבלת מספר דו־ספרתי שספרת האחדות שלו שונה מ־0. \n",
- "הפונקציה תחזיר את המספר הפוך. \n",
+ "
\n",
+ "כתבו פונקציה שמקבלת מספר דו־ספרתי שספרת האחדות שלו שונה מ־0. \n",
+ "הפונקציה תחזיר את המספר הפוך. \n",
"לדוגמה: עבור 53 הפונקציה תחזיר 35. עבור 19 הפונקציה תחזיר 91. עבור 91 הפונקציה תחזיר 19.\n",
"
\n",
- "הצופן לכספת הביתית שלכם הוא 4812. בנו משחק בול־פגיעה שמאפשר למשתמש לנסות לנחש את הצופן. \n",
- "למשתמש יש 3 ניסיונות לנחש נכונה את הצופן שלכם לפני שמופעלת אזעקה. \n",
- "כחלק ממנגנון ההגנה מאיבוד הסיסמה של הכספת, היא מציגה כמה ספרות נכונות המשתמש הזין אחרי כל ניחוש. \n",
- "אפשרו למשתמש להזין קוד 3 פעמים, וכתבו לו בכל ניסיון כמה מתוך הספרות שהזין באמת קיימות בקוד הנכון, לאו דווקא בסדר שהקיש. \n",
- "אם לא הצליח אחרי 3 ניסיונות, הדפיסו שהאזעקה הופעלה וסיימו את התוכנית. \n",
+ "
\n",
+ "הצופן לכספת הביתית שלכם הוא 4812. בנו משחק בול־פגיעה שמאפשר למשתמש לנסות לנחש את הצופן. \n",
+ "למשתמש יש 3 ניסיונות לנחש נכונה את הצופן שלכם לפני שמופעלת אזעקה. \n",
+ "כחלק ממנגנון ההגנה מאיבוד הסיסמה של הכספת, היא מציגה כמה ספרות נכונות המשתמש הזין אחרי כל ניחוש. \n",
+ "אפשרו למשתמש להזין קוד 3 פעמים, וכתבו לו בכל ניסיון כמה מתוך הספרות שהזין באמת קיימות בקוד הנכון, לאו דווקא בסדר שהקיש. \n",
+ "אם לא הצליח אחרי 3 ניסיונות, הדפיסו שהאזעקה הופעלה וסיימו את התוכנית. \n",
"
\n",
- "
\n",
- "לדוגמה, אם המשתמש הקיש בניסיון הראשון 0634, הדפיסו לו שרק אחת הספרות שניחש נכונה. \n",
- "אם המשתמש הקיש בסיבוב השני 1234, הדפיסו לו ש־3 ספרות תואמות את הקוד המקורי. \n",
- "אם המשתמש הקיש בסיבוב השלישי 1284, הדפיסו לו ש־4 ספרות תואמות את הקוד המקורי, ואז הדפיסו לו שהופעלה האזעקה. \n",
+ "
\n",
+ "לדוגמה, אם המשתמש הקיש בניסיון הראשון 0634, הדפיסו לו שרק אחת הספרות שניחש נכונה. \n",
+ "אם המשתמש הקיש בסיבוב השני 1234, הדפיסו לו ש־3 ספרות תואמות את הקוד המקורי. \n",
+ "אם המשתמש הקיש בסיבוב השלישי 1284, הדפיסו לו ש־4 ספרות תואמות את הקוד המקורי, ואז הדפיסו לו שהופעלה האזעקה. \n",
"אם המשתמש הקיש באחד הסיבובים 4812, הדפיסו שהכספת נפתחה בהצלחה וסיימו את התוכנית מייד.\n",
"
\n",
- "קבלו מספר וחשבו את העצרת שלו – מכפלת כל המספרים עד אותו מספר. \n",
- "לדוגמה, 5 עצרת שווה ל־1 כפול 2 כפול 3 כפול 4 כפול 5, והתוצאה היא 120. \n",
- "זהירות! זה תרגיל בונוס, והוא קשה מאוד. מאוד. מאוד מאוד. אנחנו לא אומרים סתם. הוא לא חובה ומיועד לאנשים שרוצים לאתגר את עצמם. מאוד. \n",
+ "
\n",
+ "קבלו מספר וחשבו את העצרת שלו – מכפלת כל המספרים עד אותו מספר. \n",
+ "לדוגמה, 5 עצרת שווה ל־1 כפול 2 כפול 3 כפול 4 כפול 5, והתוצאה היא 120. \n",
+ "זהירות! זה תרגיל בונוס, והוא קשה מאוד. מאוד. מאוד מאוד. אנחנו לא אומרים סתם. הוא לא חובה ומיועד לאנשים שרוצים לאתגר את עצמם. מאוד. \n",
"
\n",
- "רשימה, כשמה כן היא, מייצגת אוסף מסודר של ערכים. רשימות יהיו סוג הנתונים הראשון שנכיר בפייתון, שמטרתו היא לקבץ ערכים. \n",
+ "
\n",
+ "רשימה, כשמה כן היא, מייצגת אוסף מסודר של ערכים. רשימות יהיו סוג הנתונים הראשון שנכיר בפייתון, שמטרתו היא לקבץ ערכים. \n",
"הרעיון מוכר לנו מהיום־יום: רשימת פריטים לקנייה בסופר שמסודרת לפי הא–ב, או רשימת ההופעות בקיץ הקרוב המסודרת לפי תאריך.\n",
"
\n",
- "נסו לדמיין רשימה כמסדרון ארוך, שבו עומדים בתור אחד אחרי השני איברים מסוגים שאנחנו מכירים בפייתון. \n",
+ "
\n",
+ "נסו לדמיין רשימה כמסדרון ארוך, שבו עומדים בתור אחד אחרי השני איברים מסוגים שאנחנו מכירים בפייתון. \n",
"אם נשתמש בדימוי הלייזרים שנתנו למשתנים בשבוע הקודם, אפשר להגיד שמדובר בלייזר שמצביע לשורת לייזרים, שבה כל לייזר מצביע על ערך כלשהו.\n",
"
רשימת שמות ראשי הממשלה במדינת ישראל לפי סדר כהונתם.
\n",
- "
רשימת הגילים של התלמידים בכיתה, מהמבוגר לצעיר.
\n",
- "
רשימת שמות של התקליטים שיש לי בארון, מסודרת מהתקליט השמאלי לימני.
\n",
- "
רשימה שבה כל איבר מייצג אם לראש הממשלה שנמצא בתא התואם ברשימה הקודמת היו משקפיים.
\n",
- "
האיברים 42, 8675309, 73, -40 ו־186282 בסדר הזה.
\n",
- "
רשימה של תחזית מזג האוויר ב־7 הימים הקרובים. כל איבר ברשימה הוא בפני עצמו רשימה, שמכילה שני איברים: הראשון הוא מה תהיה הטמפרטורה הממוצעת, והשני הוא מה תהיה הלחות הממוצעת.
\n",
- ""
+ "\n",
+ "
רשימת שמות ראשי הממשלה במדינת ישראל לפי סדר כהונתם.
\n",
+ "
רשימת הגילים של התלמידים בכיתה, מהמבוגר לצעיר.
\n",
+ "
רשימת שמות של התקליטים שיש לי בארון, מסודרת מהתקליט השמאלי לימני.
\n",
+ "
רשימה שבה כל איבר מייצג אם לראש הממשלה שנמצא בתא התואם ברשימה הקודמת היו משקפיים.
\n",
+ "
האיברים 42, 8675309, 73, -40 ו־186282 בסדר הזה.
\n",
+ "
רשימה של תחזית מזג האוויר ב־7 הימים הקרובים. כל איבר ברשימה הוא בפני עצמו רשימה, שמכילה שני איברים: הראשון הוא מה תהיה הטמפרטורה הממוצעת, והשני הוא מה תהיה הלחות הממוצעת.
\n",
- " תרגול:\n",
- " הרשימות שהוצגו למעלה הן רשימות הומוגניות, כאלו שכל האיברים שבהן הם מאותו סוג. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "תרגול:\n",
+ " הרשימות שהוצגו למעלה הן רשימות הומוגניות, כאלו שכל האיברים שבהן הם מאותו סוג. \n",
" כתבו עבור כל אחת מהרשימות שהוצגו בדוגמה מה סוג הנתונים שיישמר בהן.\n",
"
\n",
- "מה התרחש בקוד? \n",
- "התחלנו את הגדרת הרשימה באמצעות התו [. \n",
- "מייד אחרי התו הזה הכנסנו איברים לרשימה לפי הסדר הרצוי, כאשר כל איבר מופרד ממשנהו בפסיק (,). \n",
- "במקרה שלנו, כל איבר הוא מחרוזת המייצגת ראש ממשלה. הכנסנו את ראשי הממשלה לרשימה לפי סדר כהונתם. \n",
- "שימו לב שהרשימה מכילה איבר מסוים פעמיים – מכאן שרשימה היא מבנה נתונים שתומך בחזרות. \n",
- "לסיום, נסגור את הגדרת הרשימה באמצעות התו ]. \n",
+ "
\n",
+ "מה התרחש בקוד? \n",
+ "התחלנו את הגדרת הרשימה באמצעות התו [. \n",
+ "מייד אחרי התו הזה הכנסנו איברים לרשימה לפי הסדר הרצוי, כאשר כל איבר מופרד ממשנהו בפסיק (,). \n",
+ "במקרה שלנו, כל איבר הוא מחרוזת המייצגת ראש ממשלה. הכנסנו את ראשי הממשלה לרשימה לפי סדר כהונתם. \n",
+ "שימו לב שהרשימה מכילה איבר מסוים פעמיים – מכאן שרשימה היא מבנה נתונים שתומך בחזרות. \n",
+ "לסיום, נסגור את הגדרת הרשימה באמצעות התו ]. \n",
"
\n",
- "רשימה הומוגנית היא רשימה שבה האיברים שנמצאים בכל אחד מהתאים הם מאותו סוג. רשימות \"בעולם האמיתי\" הן בדרך כלל הומוגניות. \n",
- "רשימה הטרוגנית היא רשימה שבה איברים בתאים שונים יכולים להיות מסוגים שונים. \n",
+ "
\n",
+ "רשימה הומוגנית היא רשימה שבה האיברים שנמצאים בכל אחד מהתאים הם מאותו סוג. רשימות \"בעולם האמיתי\" הן בדרך כלל הומוגניות. \n",
+ "רשימה הטרוגנית היא רשימה שבה איברים בתאים שונים יכולים להיות מסוגים שונים. \n",
"ההבדל הוא סמנטי בלבד, ופייתון לא מבדילה בין רשימה הטרוגנית לרשימה הומוגנית.\n",
"
\n",
- "לכל תא ברשימה יש מספר, שמאפשר לנו להתייחס לאיבר שנמצא באותו תא. \n",
- "הדבר דומה ללייזר שעליו יש מדבקת שם (\"שמות ראשי ממשלה\"), והוא מצביע על שורת לייזרים שעל התווית שלהם מופיע מספר המתאר את מיקומם בשורה. \n",
- "התא השמאלי ביותר ברשימה ממוספר כ־0, התא שנמצא אחריו (מימינו) מקבל את המספר 1, וכך הלאה עד לסוף הרשימה. \n",
+ "
\n",
+ "לכל תא ברשימה יש מספר, שמאפשר לנו להתייחס לאיבר שנמצא באותו תא. \n",
+ "הדבר דומה ללייזר שעליו יש מדבקת שם (\"שמות ראשי ממשלה\"), והוא מצביע על שורת לייזרים שעל התווית שלהם מופיע מספר המתאר את מיקומם בשורה. \n",
+ "התא השמאלי ביותר ברשימה ממוספר כ־0, התא שנמצא אחריו (מימינו) מקבל את המספר 1, וכך הלאה עד לסוף הרשימה. \n",
"המספור של כל תא נקרא המיקום שלו ברשימה, או האינדקס שלו.\n",
"
\n",
- "בהנחה שאנחנו מתים על Guardians of the Galaxy, נוכל לנסות להשיג מהרשימה את Awesome Mix Vol. 1. \n",
+ "
\n",
+ "בהנחה שאנחנו מתים על Guardians of the Galaxy, נוכל לנסות להשיג מהרשימה את Awesome Mix Vol. 1. \n",
"כדי לעשות זאת, נציין את שם הרשימה שממנה אנחנו רוצים לקבל את האיבר, ומייד לאחר מכן את מיקומו ברשימה בסוגריים מרובעים.\n",
"
\n",
- " התא הראשון ממוספר 0, ולא 1. \n",
- " יש לכך סיבות טובות, אבל פעמים רבות תרגישו שהמספור הזה לא טבעי ועלול ליצור באגים, שהם קטעי קוד שמתנהגים אחרת משציפה המתכנת. \n",
- " כפועל יוצא, המיקום ברשימה של התא האחרון לא יהיה כאורך הרשימה, אלא כאורך הרשימה פחות אחד. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " התא הראשון ממוספר 0, ולא 1. \n",
+ " יש לכך סיבות טובות, אבל פעמים רבות תרגישו שהמספור הזה לא טבעי ועלול ליצור באגים, שהם קטעי קוד שמתנהגים אחרת משציפה המתכנת. \n",
+ " כפועל יוצא, המיקום ברשימה של התא האחרון לא יהיה כאורך הרשימה, אלא כאורך הרשימה פחות אחד. \n",
" משמע: ברשימה שבה 3 איברים, מספרו של התא האחרון יהיה 2.\n",
"
\n",
- "כפי שניתן לראות בתמונה, פייתון מנסה לעזור לנו ומאפשרת לנו לגשת לאיברים גם מהסוף. \n",
- "חוץ מהמספור הרגיל שראינו קודם, אפשר לגשת לאיברים מימין לשמאל באמצעות מספור שלילי. \n",
- "האיבר האחרון יקבל את המספר -1, זה שלפניו (משמאלו) יקבל -2 וכן הלאה. \n",
+ "
\n",
+ "כפי שניתן לראות בתמונה, פייתון מנסה לעזור לנו ומאפשרת לנו לגשת לאיברים גם מהסוף. \n",
+ "חוץ מהמספור הרגיל שראינו קודם, אפשר לגשת לאיברים מימין לשמאל באמצעות מספור שלילי. \n",
+ "האיבר האחרון יקבל את המספר -1, זה שלפניו (משמאלו) יקבל -2 וכן הלאה. \n",
"
\n",
- " אם ננסה לגשת לתא שאינו קיים, נקבל IndexError. \n",
- " זה בדרך כלל קורה כשאנחנו שוכחים להתחיל לספור מ־0. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " אם ננסה לגשת לתא שאינו קיים, נקבל IndexError. \n",
+ " זה בדרך כלל קורה כשאנחנו שוכחים להתחיל לספור מ־0. \n",
" אם השגיאה הזו מופיעה כשאתם מתעסקים עם רשימות, חשבו איפה בקוד פניתם לתא שאינו קיים.\n",
"
\n",
- "שימו לב שכל אופרטור שתשימו ליד הרשימה מתייחס לרשימה בלבד, ולא לאיברים שבתוכה. \n",
- "משמע + 5 לא יוסיף לכם 5 לכל אחד מהאיברים, אלא ייכשל כיוון שפייתון לא יודעת לחבר רשימה למספר שלם. \n",
+ "
\n",
+ "שימו לב שכל אופרטור שתשימו ליד הרשימה מתייחס לרשימה בלבד, ולא לאיברים שבתוכה. \n",
+ "משמע + 5 לא יוסיף לכם 5 לכל אחד מהאיברים, אלא ייכשל כיוון שפייתון לא יודעת לחבר רשימה למספר שלם. \n",
"
\n",
- "רשימות תומכות בכל אופרטורי ההשוואה שלמדנו עד כה. \n",
+ "
\n",
+ "רשימות תומכות בכל אופרטורי ההשוואה שלמדנו עד כה. \n",
"נתחיל בקל ביותר. בואו נבדוק באיזה יום הרכב התלמידים בכיתה היה זהה להרכב התלמידים שהיה בה ביום ראשון:\n",
"
\n",
- "כדי לבצע השוואה בין רשימות, פייתון מנסה להשוות את האיבר הראשון מהרשימה הראשונה לאיבר הראשון מהרשימה השנייה. \n",
+ "
\n",
+ "כדי לבצע השוואה בין רשימות, פייתון מנסה להשוות את האיבר הראשון מהרשימה הראשונה לאיבר הראשון מהרשימה השנייה. \n",
"אם יש \"תיקו\", היא תעבור לאיבר השני בכל רשימה, כך עד סוף הרשימה.\n",
"
\n",
- " לעיתים דברים בחיים האמיתיים הם מורכבים מדי מכדי לייצג אותם ברשימה סטנדרטית. \n",
- " הרבה פעמים נשים לב שיוקל לנו אם ניצור רשימה שבה כל תא הוא רשימה בפני עצמו. הרעיון הזה ייצור לנו רשימה של רשימות. \n",
+ "
\n",
+ " לעיתים דברים בחיים האמיתיים הם מורכבים מדי מכדי לייצג אותם ברשימה סטנדרטית. \n",
+ " הרבה פעמים נשים לב שיוקל לנו אם ניצור רשימה שבה כל תא הוא רשימה בפני עצמו. הרעיון הזה ייצור לנו רשימה של רשימות. \n",
" ניקח לדוגמה את הרשימות שהגדרנו למעלה, שמתארות מי נכח בכל יום בכיתה:\n",
"
\n",
- " אם קשה לכם לדמיין את זה, עשו זאת בשלבים. \n",
+ "
\n",
+ " אם קשה לכם לדמיין את זה, עשו זאת בשלבים. \n",
" בדקו מה יש ב־pupils, אחרי זה מה מחזיר pupils[0], ואז נסו לקחת ממנו את האיבר האחרון, pupils[0][-1].\n",
- "
\n",
- "כדי להבין טוב יותר איך רשימה של רשימות מתנהגת, חשוב להבין את התוצאות של הביטויים הבוליאניים הבאים. \n",
+ "
\n",
+ "כדי להבין טוב יותר איך רשימה של רשימות מתנהגת, חשוב להבין את התוצאות של הביטויים הבוליאניים הבאים. \n",
"זה קצת מבלבל, אבל אני סומך עליכם שתחזיקו מעמד:\n",
"
הביטוי הבוליאני בשורה 1 מחזיר False, כיוון שכל אחד מהאיברים ברשימה pupils הוא רשימה, ואף אחד מהם אינו המחרוזת \"Moshe\".
\n",
- "
הביטוי הבוליאני בשורה 2 מחזיר True, כיוון שהאיבר הראשון ב־pupils הוא רשימה שמכילה את המחרוזת \"Moshe\".
\n",
- "
הביטוי הבוליאני בשורה 3 מחזיר False, כיוון שאין בתוך pupils רשימה שאלו בדיוק הערכים שלה. יש אומנם רשימה שמכילה את האיברים האלו, אבל השאלה הייתה האם הרשימה הגדולה (pupils) מכילה איבר ששווה בדיוק ל־['Moshe', 'Splinter'].
\n",
- "
הביטוי הבוליאני בשורה 4 מחזיר False, כיוון שברשימה האחרונה בתוך pupils אין איבר שהוא הרשימה [\"Moshe\", \"Splinter\"].
\n",
- "
הביטוי הבוליאני בשורה 5 מחזיר True, כיוון שיש רשימה ישירות בתוך pupils שאלו הם ערכיה.
\n",
- "
הביטוי הבוליאני בשורה 6 מחזיר False, כיוון שברשימה הראשונה בתוך pupils אין איבר שהוא הרשימה הזו.
\n",
+ "\n",
+ "
הביטוי הבוליאני בשורה 1 מחזיר False, כיוון שכל אחד מהאיברים ברשימה pupils הוא רשימה, ואף אחד מהם אינו המחרוזת \"Moshe\".
\n",
+ "
הביטוי הבוליאני בשורה 2 מחזיר True, כיוון שהאיבר הראשון ב־pupils הוא רשימה שמכילה את המחרוזת \"Moshe\".
\n",
+ "
הביטוי הבוליאני בשורה 3 מחזיר False, כיוון שאין בתוך pupils רשימה שאלו בדיוק הערכים שלה. יש אומנם רשימה שמכילה את האיברים האלו, אבל השאלה הייתה האם הרשימה הגדולה (pupils) מכילה איבר ששווה בדיוק ל־['Moshe', 'Splinter'].
\n",
+ "
הביטוי הבוליאני בשורה 4 מחזיר False, כיוון שברשימה האחרונה בתוך pupils אין איבר שהוא הרשימה [\"Moshe\", \"Splinter\"].
\n",
+ "
הביטוי הבוליאני בשורה 5 מחזיר True, כיוון שיש רשימה ישירות בתוך pupils שאלו הם ערכיה.
\n",
+ "
הביטוי הבוליאני בשורה 6 מחזיר False, כיוון שברשימה הראשונה בתוך pupils אין איבר שהוא הרשימה הזו.
\n",
- "זכרו שעבור פייתון אין שום דבר מיוחד ברשימה של רשימות. היא בסך הכול רשימה רגילה, שכל אחד מאיבריה הוא רשימה. \n",
+ "
\n",
+ "זכרו שעבור פייתון אין שום דבר מיוחד ברשימה של רשימות. היא בסך הכול רשימה רגילה, שכל אחד מאיבריה הוא רשימה. \n",
"מבחינתה אין הבדל בין רשימה כזו לכל רשימה אחרת.\n",
"
\n",
- "באתרי אינטרנט ובתיעוד של פייתון אנחנו נפגש פעמים רבות עם המילה Iterable. \n",
- "בקורס נשתמש במונח הזה פעמים רבות כדי להבין טוב יותר איך פייתון מתנהגת. \n",
- "נגדיר ערך כ־iterable אם ניתן לפרק אותו לכלל האיברים שלו. \n",
+ "
\n",
+ "באתרי אינטרנט ובתיעוד של פייתון אנחנו נפגש פעמים רבות עם המילה Iterable. \n",
+ "בקורס נשתמש במונח הזה פעמים רבות כדי להבין טוב יותר איך פייתון מתנהגת. \n",
+ "נגדיר ערך כ־iterable אם ניתן לפרק אותו לכלל האיברים שלו. \n",
"
\n",
- "
\n",
- "עד כה אנחנו מכירים 2 סוגי משתנים שעונים להגדרה iterables: רשימות ומחרוזות. \n",
- "ניתן לפרק רשימה לכל האיברים שמרכיבים אותה, וניתן לפרק מחרוזת לכל התווים שמרכיבים אותה. \n",
+ "
\n",
+ "עד כה אנחנו מכירים 2 סוגי משתנים שעונים להגדרה iterables: רשימות ומחרוזות. \n",
+ "ניתן לפרק רשימה לכל האיברים שמרכיבים אותה, וניתן לפרק מחרוזת לכל התווים שמרכיבים אותה. \n",
"
\n",
- "
\n",
- "יש הרבה במשותף לכל הדברים שניתן להגיד עליהם שהם iterables: \n",
- "על חלק גדול מה־iterables אפשר להפעיל פעולות שמתייחסות לכלל האיברים שבהם, כמו len שמראה את מספר האיברים בערך. \n",
- "על חלק גדול מה־iterables יהיה אפשר גם להשתמש בסוגריים מרובעים כדי לגשת לאיבר מסוים שנמצא בהם. \n",
+ "
\n",
+ "יש הרבה במשותף לכל הדברים שניתן להגיד עליהם שהם iterables: \n",
+ "על חלק גדול מה־iterables אפשר להפעיל פעולות שמתייחסות לכלל האיברים שבהם, כמו len שמראה את מספר האיברים בערך. \n",
+ "על חלק גדול מה־iterables יהיה אפשר גם להשתמש בסוגריים מרובעים כדי לגשת לאיבר מסוים שנמצא בהם. \n",
"בעתיד נלמד על עוד דברים שמשותפים לרוב (או לכל) ה־iterables.\n",
"
\n",
- "כתבו קוד שיסדר את רשימת נשיאי בית המשפט לפי סדר אלפבתי. \n",
- "זה אכן אמור להיות מסורבל מאוד. בעתיד נלמד לכתוב קוד מוצלח יותר לבעיה הזו. \n",
+ "
\n",
+ "כתבו קוד שיסדר את רשימת נשיאי בית המשפט לפי סדר אלפבתי. \n",
+ "זה אכן אמור להיות מסורבל מאוד. בעתיד נלמד לכתוב קוד מוצלח יותר לבעיה הזו. \n",
"השתמשו באינדקסים, ושמרו ערכים בצד במשתנים.\n",
"
\n",
- "לפעמים נרצה שהמחרוזת שלנו תעשה \"דברים מיוחדים\" – כמו לרדת שורה באמצע המחרוזת או לעשות ריווח גדול באמצעות ↹ TAB (לצורך טבלאות, לדוגמה). \n",
- "המחשב מתייחס להזחה ולשורה חדשה כתווים של ממש, ועבור כל \"תו מיוחד\" שכזה יצרו רצף של תווים שמייצג אותו. \n",
+ "
\n",
+ "לפעמים נרצה שהמחרוזת שלנו תעשה \"דברים מיוחדים\" – כמו לרדת שורה באמצע המחרוזת או לעשות ריווח גדול באמצעות ↹ TAB (לצורך טבלאות, לדוגמה). \n",
+ "המחשב מתייחס להזחה ולשורה חדשה כתווים של ממש, ועבור כל \"תו מיוחד\" שכזה יצרו רצף של תווים שמייצג אותו. \n",
"לדוגמה, כשנדע מהו רצף התווים שמייצג שורה חדשה, נוכל לכתוב אותו כחלק מהמחרוזת, וכאשר נדפיס אותה נראה ירידת שורה במקום רצף התווים.\n",
"
\n",
- "נלמד את שני התווים המיוחדים שדיברנו עליהם – \\n הוא תו שמסמן ירידת שורה, ו־\\t מסמן ריווח גדול. \n",
+ "
\n",
+ "נלמד את שני התווים המיוחדים שדיברנו עליהם – \\n הוא תו שמסמן ירידת שורה, ו־\\t מסמן ריווח גדול. \n",
"איך נכניס אותם בקוד? פשוט נשלב אותם כחלק מהמחרוזת במקומות שבהם בא לנו שיופיעו:\n",
"
\n",
- "לפעמים אנחנו פשוט רוצים שפייתון תתמודד עם גוש מלל שהדבקנו. \n",
- "לפייתון יש פתרון נהדר: היא עובדת גם אם המלל מפוצל לכמה שורות (היא תכניס תווי \\n ותפצל לשורות בעצמה), וגם במקרים בהם יש תווים כמו ' או \". \n",
- "פתרון זה נקרא \"מחרוזת קשוחה\" (אוקיי, למען האמת, אף אחד לא קורא לה ככה חוץ ממני), וכדי להשתמש בה יש להקליד 3 פעמים את התו \" או את התו ' משני צידי המחרוזת. \n",
+ "
\n",
+ "לפעמים אנחנו פשוט רוצים שפייתון תתמודד עם גוש מלל שהדבקנו. \n",
+ "לפייתון יש פתרון נהדר: היא עובדת גם אם המלל מפוצל לכמה שורות (היא תכניס תווי \\n ותפצל לשורות בעצמה), וגם במקרים בהם יש תווים כמו ' או \". \n",
+ "פתרון זה נקרא \"מחרוזת קשוחה\" (אוקיי, למען האמת, אף אחד לא קורא לה ככה חוץ ממני), וכדי להשתמש בה יש להקליד 3 פעמים את התו \" או את התו ' משני צידי המחרוזת. \n",
"
\n",
- " תרגול:\n",
- " בשנת 1963 נשא ג'ון קנדי את נאומו \"אני ברלינאי\". הטקסט המלא שלו מופיע כאן. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "תרגול:\n",
+ " בשנת 1963 נשא ג'ון קנדי את נאומו \"אני ברלינאי\". הטקסט המלא שלו מופיע כאן. \n",
" השתמשו בפקודת print בודדת כדי להדפיס את הנאום כולו.\n",
"
\n",
- "עד כה שרשרנו מחרוזות בזהירות בעזרת סימן השרשור +. \n",
- "דרך נוספת לעשות זאת היא בעזרת fstring, או בשמן המלא, formatted strings. \n",
+ "
\n",
+ "עד כה שרשרנו מחרוזות בזהירות בעזרת סימן השרשור +. \n",
+ "דרך נוספת לעשות זאת היא בעזרת fstring, או בשמן המלא, formatted strings. \n",
"נראה דוגמה:\n",
"
\n",
- "עד כה למדנו פונקציות שעובדות על סוגים שונים של נתונים. אנחנו קוראים להן בשמן, ואז מעבירים להן את הנתון שעליו רוצים לפעול. \n",
- "type, לדוגמה, יודעת לעבוד על כל נתון שנעביר לה ולהחזיר לנו את הסוג שלו. \n",
- "רעיון דומה בתכנות נקרא \"פעולה\", או method (מתודה). \n",
- "בניגוד לפונקציות, שם הפעולה משויך לסוג הנתון שעליו אנחנו הולכים להפעיל את הפעולה. \n",
+ "
\n",
+ "עד כה למדנו פונקציות שעובדות על סוגים שונים של נתונים. אנחנו קוראים להן בשמן, ואז מעבירים להן את הנתון שעליו רוצים לפעול. \n",
+ "type, לדוגמה, יודעת לעבוד על כל נתון שנעביר לה ולהחזיר לנו את הסוג שלו. \n",
+ "רעיון דומה בתכנות נקרא \"פעולה\", או method (מתודה). \n",
+ "בניגוד לפונקציות, שם הפעולה משויך לסוג הנתון שעליו אנחנו הולכים להפעיל את הפעולה. \n",
"
\n",
- "בעתיד נלמד לעומק יותר על ההבדלים בין פונקציה לפעולה, והם יישמעו לנו מופשטים פחות. עד אז אתם פטורים מלדעת את הטריוויה הזו. \n",
- "דבר שכדאי לדעת הוא שהפעולות שנראה עכשיו עובדות רק על מחרוזות, ולא על טיפוסים אחרים. \n",
+ "
\n",
+ "בעתיד נלמד לעומק יותר על ההבדלים בין פונקציה לפעולה, והם יישמעו לנו מופשטים פחות. עד אז אתם פטורים מלדעת את הטריוויה הזו. \n",
+ "דבר שכדאי לדעת הוא שהפעולות שנראה עכשיו עובדות רק על מחרוזות, ולא על טיפוסים אחרים. \n",
"
\n",
- " בשורות הבאות, נשחק עם דוגמאות של פעולות ונראה מה הן עושות בתאים שיבואו לאחר מכן. \n",
+ "
\n",
+ " בשורות הבאות, נשחק עם דוגמאות של פעולות ונראה מה הן עושות בתאים שיבואו לאחר מכן. \n",
" אם נבחין בתא שיש צורך להסביר מה קרה בו – יצורף הסבר מעל התא.\n",
"
\n",
- " פעמים רבות, בין אם בקבלת קלט מהמשתמש ובין אם במחרוזות שקיבלנו ממקור חיצוני כלשהו, נתקל בתווים מיותרים שמקיפים את המחרוזת שלנו. \n",
+ "
\n",
+ " פעמים רבות, בין אם בקבלת קלט מהמשתמש ובין אם במחרוזות שקיבלנו ממקור חיצוני כלשהו, נתקל בתווים מיותרים שמקיפים את המחרוזת שלנו. \n",
" הפעולה strip עוזרת לנו להסיר אותם.\n",
"
\n",
- " אינטואיטיבית, נראה שנכון תמיד להשתמש בפעולה find, אך אליה וקוץ בה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " אינטואיטיבית, נראה שנכון תמיד להשתמש בפעולה find, אך אליה וקוץ בה. \n",
" כשאנחנו בטוחים שאמורה לחזור תוצאה, עדיף להשתמש ב־index כדי לדעת מאיפה מגיעה השגיאה בתוכנית שלנו ולטפל בה במהירות.\n",
"
\n",
- " תרגול:\n",
- " קבלו מהמשתמש שתי מחרוזות. \n",
- " אם המחרוזת השנייה נמצאת לפני אמצע המחרוזת הראשונה, הדפיסו \"Yes!\" \n",
- " אם המחרוזת השנייה לא נמצאת לפני אמצע המחרוזת הראשונה, הדפיסו \"No!\" \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "תרגול:\n",
+ " קבלו מהמשתמש שתי מחרוזות. \n",
+ " אם המחרוזת השנייה נמצאת לפני אמצע המחרוזת הראשונה, הדפיסו \"Yes!\" \n",
+ " אם המחרוזת השנייה לא נמצאת לפני אמצע המחרוזת הראשונה, הדפיסו \"No!\" \n",
" בונוס לגיבורים ולגיבורות: נסו להשתמש בשתי הפעולות, index ו־find.\n",
"
\n",
- "אם נרצה לבדוק כמה פעמים תת־מחרוזת נמצאת בתוך המחרוזת שלנו, נשתמש בפעולה count. \n",
+ "
\n",
+ "אם נרצה לבדוק כמה פעמים תת־מחרוזת נמצאת בתוך המחרוזת שלנו, נשתמש בפעולה count. \n",
"ננסה להבין כמה פעמים מילים מעניינות הופיעו בנאום גטיסברג המפורסם:\n",
"
\n",
- "ראשית, נעשה טריק מוכר. נשתמש בפעולה lower כדי להעיף את האותיות הגדולות. \n",
+ "
\n",
+ "ראשית, נעשה טריק מוכר. נשתמש בפעולה lower כדי להעיף את האותיות הגדולות. \n",
"בצורה הזו, count תספור לנו גם את המילים שנכתבו באותיות רישיות:\n",
"
\n",
- "פעולה מאוד נפוצה היא replace, שעוזרת לנו להחליף את כל המופעים של תת־מחרוזת אחת באחרת. \n",
+ "
\n",
+ "פעולה מאוד נפוצה היא replace, שעוזרת לנו להחליף את כל המופעים של תת־מחרוזת אחת באחרת. \n",
"לדוגמה, ניקח את הברידג' השני בשיר הנפלא של הביטלס, Hey Jude, ונחליף את כל המופעים של Jude ב־Dude: \n",
"
\n",
- "דרך נוספת להשתמש ב־split היא לא להעביר לה כלום ברשימת הארגומנטים. \n",
+ "
\n",
+ "דרך נוספת להשתמש ב־split היא לא להעביר לה כלום ברשימת הארגומנטים. \n",
"במקרה כזה, split תפצל לנו את המחרוזת לפי רווחים, שורות חדשות וטאבים.\n",
"
\n",
- "לפעמים אנחנו רוצים לעשות את הפעולה ההפוכה מפיצול – איחוד! \n",
- "הפעולה join מקבלת כארגומנט רשימה, ופועלת על המחרוזת שתחבר בין איבר לאיבר. \n",
+ "
\n",
+ "לפעמים אנחנו רוצים לעשות את הפעולה ההפוכה מפיצול – איחוד! \n",
+ "הפעולה join מקבלת כארגומנט רשימה, ופועלת על המחרוזת שתחבר בין איבר לאיבר. \n",
"נראה דוגמה: \n",
"
\n",
- " תרגול:\n",
- " קבלו מהמשתמש נתיב לקובץ מסוים שנמצא על המחשב שלו, ובדקו האם הסיומת שלו היא .docx \n",
- " הדפיסו לו הודעה מתאימה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "תרגול:\n",
+ " קבלו מהמשתמש נתיב לקובץ מסוים שנמצא על המחשב שלו, ובדקו האם הסיומת שלו היא .docx \n",
+ " הדפיסו לו הודעה מתאימה. \n",
" דוגמה לנתיב תקין: C:\\My Documents\\Resume.docx.\n",
"
\n",
- "השתמשו בטקסט של נאום גטיסברג ובדקו כמה מילים יש בו. \n",
+ "
\n",
+ "השתמשו בטקסט של נאום גטיסברג ובדקו כמה מילים יש בו. \n",
"בדקו כמה פעמים הופיעו המילים we, here, great, nation ו־dedicated, וחשבו מה שיעורן באחוזים בטקסט כולו. \n",
"
\n",
- "בספר המרתק של ג'ורג' אורוול, 1984, הסלוגן של מפלגת השלטון הוא מלחמה היא שלום, חירות היא עבדות, בורות היא כוח. \n",
+ "
\n",
+ "בספר המרתק של ג'ורג' אורוול, 1984, הסלוגן של מפלגת השלטון הוא מלחמה היא שלום, חירות היא עבדות, בורות היא כוח. \n",
"קבלו טקסט מהמשתמש, והחליפו את המילים לפי המילון הבא:\n",
"
\n",
- "בעולם התכנות, בניגוד לשיעורי היסטוריה בתיכון, אנחנו שמים דגש על היכולות השונות של המתכנת ופחות על הזיכרון שלו בנוגע לפרטים קטנים. \n",
+ "
\n",
+ "בעולם התכנות, בניגוד לשיעורי היסטוריה בתיכון, אנחנו שמים דגש על היכולות השונות של המתכנת ופחות על הזיכרון שלו בנוגע לפרטים קטנים. \n",
"אומנם מרשים לראות מתכנת ששולט היטב בכל רזי שפת תכנות מסוימת, אבל בעולם האמיתי כולנו משתמשים באתרים שמטרתם לסייע לנו, בין אם להבין איך לכתוב את הקוד בצורה יעילה ובין אם כדי להיזכר בפונקציה או בפעולה ששכחנו.\n",
"
\n",
- "לרוב שפות התכנות או המערכות המוכרות שבהן תתעסקו, יש מעין \"מדריך למשתמש\" שנקרא תיעוד, או דוקומנטציה. \n",
- "ככל שהמוצר שאתם משתמשים בו בשל יותר ויש לו משתמשים רבים, כך תוכלו למצוא עבורו תיעוד מפורט וברור יותר. \n",
- "תיעוד טוב הוא לעיתים רבות שיקול מכריע בהחלטה אם להשתמש בטכנולוגיה מסוימת או לא. \n",
+ "
\n",
+ "לרוב שפות התכנות או המערכות המוכרות שבהן תתעסקו, יש מעין \"מדריך למשתמש\" שנקרא תיעוד, או דוקומנטציה. \n",
+ "ככל שהמוצר שאתם משתמשים בו בשל יותר ויש לו משתמשים רבים, כך תוכלו למצוא עבורו תיעוד מפורט וברור יותר. \n",
+ "תיעוד טוב הוא לעיתים רבות שיקול מכריע בהחלטה אם להשתמש בטכנולוגיה מסוימת או לא. \n",
"לא אחת אפילו מתכנתים מעולים ומנוסים נעזרים בתיעוד ובאמצעים מקבילים במשך עבודתם.\n",
"
\n",
- "לפייתון יש אתר תיעוד מרשים ומלא במידע. רוב המידע המתועד באתר כתוב בצורה טובה ונהירה. \n",
- "באתר ישנה תיבת חיפוש, ואפילו מדריך כניסה עבור מתחילים, שמתבסס על ידע מסוים בתכנות. \n",
+ "
\n",
+ "לפייתון יש אתר תיעוד מרשים ומלא במידע. רוב המידע המתועד באתר כתוב בצורה טובה ונהירה. \n",
+ "באתר ישנה תיבת חיפוש, ואפילו מדריך כניסה עבור מתחילים, שמתבסס על ידע מסוים בתכנות. \n",
"רוב מתכנתי הפייתון משתמשים באתר התיעוד הזה כמדריך עזר, ופונים אליו כשהם צריכים פרטים נוספים בקשר לרעיון שכבר קיים אצלם בראש.\n",
"
\n",
- "בשיעור הקודם למדנו שלכל סוג נתונים (כמו str או int) יש פעולות ששייכות לו. \n",
- "עבור מחרוזות, לדוגמה, אנחנו מכירים פעולות כמו str.count ו־str.replace. \n",
+ "
\n",
+ "בשיעור הקודם למדנו שלכל סוג נתונים (כמו str או int) יש פעולות ששייכות לו. \n",
+ "עבור מחרוזות, לדוגמה, אנחנו מכירים פעולות כמו str.count ו־str.replace. \n",
"כדי לקבל את רשימת הפעולות עבור סוג נתונים מסוים נשתמש בפונקציה dir():\n",
"
\n",
- "טריק נוסף שכנראה נוח יותר, זמין בסביבות פיתוח רבות שיצא לכם לעבוד בהן. \n",
+ "
\n",
+ "טריק נוסף שכנראה נוח יותר, זמין בסביבות פיתוח רבות שיצא לכם לעבוד בהן. \n",
"הטריק הוא ציון סוג הנתון או המשתנה שאתם עובדים עליו, הסימן \"נקודה\" ואז לחיצה על ↹ TAB.\n",
"
"
]
@@ -127,15 +127,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### תיעוד על פעולה או על פונקציה"
+ "### תיעוד על פעולה או על פונקציה"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "במקרה שנרצה לחפש פרטים נוספים על אחת הפונקציות או הפעולות (נניח len, או str.upper()), התיעוד של פייתון הוא מקור מידע נהדר לכך. \n",
+ "
\n",
+ "במקרה שנרצה לחפש פרטים נוספים על אחת הפונקציות או הפעולות (נניח len, או str.upper()), התיעוד של פייתון הוא מקור מידע נהדר לכך. \n",
"אם אנחנו נמצאים בתוך המחברת, יש טריק נחמד לקבל חלק מהתיעוד הזה בצורה מהירה – פשוט נרשום בתא קוד את שם הפונקציה, ואחריו סימן שאלה:\n",
"
\n",
- "ברגע שנריץ את התא, תקפוץ לנו חלונית עם מידע נוסף על הפונקציה. \n",
+ "
\n",
+ "ברגע שנריץ את התא, תקפוץ לנו חלונית עם מידע נוסף על הפונקציה. \n",
"אם אנחנו רוצים לקבל מידע על פעולה, נכתוב את סוג הערך שעליו אנחנו רוצים לבצע אותה (נניח, str):\n",
"
\n",
- "לפניכם רשימת המספרים הטבעיים מ־1 עד 10 בסדר מבולבל. \n",
- "האם תוכלו לסדר אותה בשורה אחת של קוד, ולהדפיס אותה בשורה אחת נוספת? \n",
+ "
\n",
+ "לפניכם רשימת המספרים הטבעיים מ־1 עד 10 בסדר מבולבל. \n",
+ "האם תוכלו לסדר אותה בשורה אחת של קוד, ולהדפיס אותה בשורה אחת נוספת? \n",
"הפלט שיודפס על המסך צריך להיות: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].\n",
"
\n",
- " שיטת דיואי משמשת לחלוקת ספרים לתחומי תוכן. \n",
- " כך, קטגוריה 000 המכילה ספרות כללית הנוגעת למדעי המחשב, מידע ועבודות כלליות, 500 היא ספרות הנוגעת למדע טהור ו־700 היא ספרות הנוגעת לאומנות. \n",
- " בתוך כל קטגוריה יש תתי־קטגוריות נוספות, כמו 004 שמתעסקת בעיבוד מידע, 005 שמתעסקת בתכנות, או 755 שמתעסקת באומנות בדת. \n",
- " קבלו מהמשתמש שם ספר, ואת הקטגוריה שאליה הוא משתייך. \n",
- " אם משתמש הקליד מספר שאינו בעל 3 ספרות, כמו \"4\", הניחו שהמשתמש התכוון להקליד 004 והשלימו עבורו את המלאכה. \n",
+ "
\n",
+ "שיטת דיואי משמשת לחלוקת ספרים לתחומי תוכן. \n",
+ " כך, קטגוריה 000 המכילה ספרות כללית הנוגעת למדעי המחשב, מידע ועבודות כלליות, 500 היא ספרות הנוגעת למדע טהור ו־700 היא ספרות הנוגעת לאומנות. \n",
+ " בתוך כל קטגוריה יש תתי־קטגוריות נוספות, כמו 004 שמתעסקת בעיבוד מידע, 005 שמתעסקת בתכנות, או 755 שמתעסקת באומנות בדת. \n",
+ " קבלו מהמשתמש שם ספר, ואת הקטגוריה שאליה הוא משתייך. \n",
+ " אם משתמש הקליד מספר שאינו בעל 3 ספרות, כמו \"4\", הניחו שהמשתמש התכוון להקליד 004 והשלימו עבורו את המלאכה. \n",
" הדפיסו למשתמש את מספר הקטגוריה אחרי התיקון, או \"קטגוריה שגויה\" אם הקלט שהוזן לא היה מספרי.\n",
"
\n",
- "בתרגיל הזה נכתוב מערכת מעט חכמה יותר לבנק. \n",
- " נבנה אותה בשלבים באמצעות חלוקה לפונקציות. \n",
- "בשלב הראשון נבנה פונקציה למחולל סיסמאות, שמקבלת שם משתמש ומחזירה סיסמה. \n",
- "הסיסמה תורכב כך עבור שם משתמש נתון: \n",
- "\n",
- "
שם המשתמש באותיות קטנות ומייד אחריו שם המשתמש באותיות גדולות.\n",
+ "
\n",
+ "בתרגיל הזה נכתוב מערכת מעט חכמה יותר לבנק. \n",
+ " נבנה אותה בשלבים באמצעות חלוקה לפונקציות. \n",
+ "בשלב הראשון נבנה פונקציה למחולל סיסמאות, שמקבלת שם משתמש ומחזירה סיסמה. \n",
+ "הסיסמה תורכב כך עבור שם משתמש נתון: \n",
+ "
שם המשתמש באותיות קטנות ומייד אחריו שם המשתמש באותיות גדולות.\n",
"
הוספת האות \"X\" מימין לשם המשתמש, כמספר התווים בשם המשתמש.
\n",
"\n",
- "
שימו לב כי שם המשתמש יכול לכלול ספרות וסימנים, נוסף על אותיות. \n",
- " כמו כן, לא נאפשר שם משתמש שהוא מחרוזת ריקה. במקרה זה החזירו מחרוזת ריקה. \n",
- " לדוגמה, עבור שם המשתמש 'stam' המחולל יחזיר את הסיסמה: 'stamSTAMXXXX' הריצו את הפונקציה על 4 דוגמאות נוספות לפחות, באורכים שונים, ובדקו שקיבלתם פלט כמצופה.
"
+ "
שימו לב כי שם המשתמש יכול לכלול ספרות וסימנים, נוסף על אותיות. \n",
+ " כמו כן, לא נאפשר שם משתמש שהוא מחרוזת ריקה. במקרה זה החזירו מחרוזת ריקה. \n",
+ " לדוגמה, עבור שם המשתמש 'stam' המחולל יחזיר את הסיסמה: 'stamSTAMXXXX' הריצו את הפונקציה על 4 דוגמאות נוספות לפחות, באורכים שונים, ובדקו שקיבלתם פלט כמצופה.
כעת נקבל שם משתמש וסיסמה, ונבדוק אם השילוב הוא נכון. בדקו באמצעות מחולל הסיסמאות מהסעיף הקודם אם הסיסמה של המשתמש תואמת את הסיסמה שיוצר המחולל. הדפיסו \"ברוך הבא\" אם הסיסמה נכונה, אחרת הדפיסו \"סיסמה שגויה\".
כעת נקבל שם משתמש וסיסמה, ונבדוק אם השילוב הוא נכון. בדקו באמצעות מחולל הסיסמאות מהסעיף הקודם אם הסיסמה של המשתמש תואמת את הסיסמה שיוצר המחולל. הדפיסו \"ברוך הבא\" אם הסיסמה נכונה, אחרת הדפיסו \"סיסמה שגויה\".
כתבו פונקציה שמחזירה True\n",
- " אם בוצע חיבור מוצלח, אחרת החזירו False. \n",
- "פונקציה זו דומה מאוד לפונקציה הקודמת שכתבתם, רק שהיא אינה מדפיסה דבר. במקום ההדפסה יוחזר ערך בוליאני מתאים. לדוגמה:
כתבו פונקציה שמחזירה True\n",
+ " אם בוצע חיבור מוצלח, אחרת החזירו False. \n",
+ "פונקציה זו דומה מאוד לפונקציה הקודמת שכתבתם, רק שהיא אינה מדפיסה דבר. במקום ההדפסה יוחזר ערך בוליאני מתאים. לדוגמה:
\n",
- " כעת ענו על השאלה הקודמת באמצעות הפונקציה שכתבתם בסעיף זה, כלומר כתבו פונקציה שמשתמשת בפונקציה המחזירה ערך בוליאני ומדפיסה בהתאם להוראת מהסעיף הקודם. רמז: השתמשו בערך ההחזרה של הפונקציה מהסעיף הקודם, בתוך if.
\n"
+ "
\n",
+ " כעת ענו על השאלה הקודמת באמצעות הפונקציה שכתבתם בסעיף זה, כלומר כתבו פונקציה שמשתמשת בפונקציה המחזירה ערך בוליאני ומדפיסה בהתאם להוראת מהסעיף הקודם. רמז: השתמשו בערך ההחזרה של הפונקציה מהסעיף הקודם, בתוך if.
כעת נרחיב את מערכת הבנק שלנו. \n",
- " נניח כי לכל לקוח יש בחשבון הבנק 500 ש\"ח. \n",
- " באמצעות הפוקנציות הקודמות שכתבנו נממש את התוכנית הבאה: \n",
- "
\n",
- "
נבקש מהמשתמש שם משתמש וסיסמה.
\n",
- "
נאמת את שם המשתמש והסיסמה בעזרת מחולל הסיסמאות. אם האימות הצליח נדפיס: \n",
- " ?Login succeeded. How much you'd like to withdraw \n",
+ "
כעת נרחיב את מערכת הבנק שלנו. \n",
+ " נניח כי לכל לקוח יש בחשבון הבנק 500 ש\"ח. \n",
+ " באמצעות הפוקנציות הקודמות שכתבנו נממש את התוכנית הבאה: \n",
+ "
\n",
+ "
נבקש מהמשתמש שם משתמש וסיסמה.
\n",
+ "
נאמת את שם המשתמש והסיסמה בעזרת מחולל הסיסמאות. אם האימות הצליח נדפיס: \n",
+ " ?Login succeeded. How much you'd like to withdraw \n",
" אחרת נדפיס: .Login failed
\n",
- "
כיון שלמשתמש יש 500 ש\"ח בחשבון, עלינו לוודא שסכום המשיכה אינו גבוה מ־500 ש\"ח. אם הסכום אכן גבוה מ־500 ש\"ח נדפיס: \n",
+ "
כיון שלמשתמש יש 500 ש\"ח בחשבון, עלינו לוודא שסכום המשיכה אינו גבוה מ־500 ש\"ח. אם הסכום אכן גבוה מ־500 ש\"ח נדפיס: \n",
" .Withdrawal denied
\n",
- "
כמו כן, עלינו לוודא כי הסכום אינו שלילי או 0. במקרה זה נדפיס: \n",
+ "
כמו כן, עלינו לוודא כי הסכום אינו שלילי או 0. במקרה זה נדפיס: \n",
" .Invalid amount
\n",
- "
אם הסכום חוקי, נדפיס: \n",
+ "
אם הסכום חוקי, נדפיס: \n",
" .(Please take your money (amount asked). Your balance is: (amount left in balance
\n",
- " Insert username: stam \n",
- " Insert password: stamSTAMXXXX \n",
- " Login succeeded. How much you'd like to withdraw? 200 \n",
+ "
\n",
+ " Insert username: stam \n",
+ " Insert password: stamSTAMXXXX \n",
+ " Login succeeded. How much you'd like to withdraw? 200 \n",
" Please take your money (200NIS). Your balance is: 300NIS.\n",
"
\n",
- " לאחרונה עלתה דרישה לשכלל את הבנק שלנו, כך שרק מספר מצומצם של לקוחות יוכלו לגשת לבנק. \n",
- " הגדירו רשימה של שמות של לקוחות שעבורם יתאפשר החיבור. \n",
+ "
\n",
+ " לאחרונה עלתה דרישה לשכלל את הבנק שלנו, כך שרק מספר מצומצם של לקוחות יוכלו לגשת לבנק. \n",
+ " הגדירו רשימה של שמות של לקוחות שעבורם יתאפשר החיבור. \n",
" עבור לקוחות שאינם ברשימה יכתוב הבנק You are not a customer of the bank.\n",
"
ניזכר בכמה פעולות של מחרוזות: לכל אחד מהתרגילים הבאים הריצו את הדוגמה וכתבו בעצמכם 3 דוגמאות נוספות. הסבירו לעצמכם מה עושה כל מתודה למחרוזת שהיא מקבלת. \n",
- "אם תרצו להיזכר מה עושה מתודה מסוימת תוכלו להריץ אותה כך:
\n",
+ "
ניזכר בכמה פעולות של מחרוזות: לכל אחד מהתרגילים הבאים הריצו את הדוגמה וכתבו בעצמכם 3 דוגמאות נוספות. הסבירו לעצמכם מה עושה כל מתודה למחרוזת שהיא מקבלת. \n",
+ "אם תרצו להיזכר מה עושה מתודה מסוימת תוכלו להריץ אותה כך:
בשאלה זו נכתוב גרסה של שעון עולמי התומך ב־4 אזורי זמן: \n",
- "\n",
- "
\n",
- "
תל אביב – TLV
\n",
- "
לונדון – LDN
\n",
- "
ניו יורק – NYC
\n",
- "
טוקיו – TYO
\n",
+ "
בשאלה זו נכתוב גרסה של שעון עולמי התומך ב־4 אזורי זמן: \n",
+ "
\n",
+ "
תל אביב – TLV
\n",
+ "
לונדון – LDN
\n",
+ "
ניו יורק – NYC
\n",
+ "
טוקיו – TYO
\n",
"
\n",
- "\n",
- "
\n",
- "אם נקבל תל אביב, נחזיר את השעה בתוספת 3 שעות. \n",
- "אם נקבל ניו יורק נחזיר את השעה פחות 4. \n",
- "אם נקבל טוקיו נחזיר את השעה ועוד 9. \n",
+ "
\n",
+ "אם נקבל תל אביב, נחזיר את השעה בתוספת 3 שעות. \n",
+ "אם נקבל ניו יורק נחזיר את השעה פחות 4. \n",
+ "אם נקבל טוקיו נחזיר את השעה ועוד 9. \n",
"בכל מקרה אחר נחזיר את השעה כמו שקיבלנו אותה.\n",
- "
פונקציות שימושיות:\n",
- " split – מתודה של string. \n",
- " האופרטור % (מודולו) – חשבו עם איזה מספר צריך לעשות מודולו. \n",
- " zfill – השתמשו בה במקרה שהשעה חד־ספרתית (לדוגמה 1:05 תהפוך ל־01:05) \n",
- " \n",
- "
רמזים נוספים: \n",
- " מומלץ להמיר את השעה מ־string ל־int ואז לבצע את פעולות החשבון, ולבסוף להמיר חזרה ל־string\n",
- " \n",
- "
"
+ "
פונקציות שימושיות:\n",
+ " split – מתודה של string. \n",
+ " האופרטור % (מודולו) – חשבו עם איזה מספר צריך לעשות מודולו. \n",
+ "zfill – השתמשו בה במקרה שהשעה חד־ספרתית (לדוגמה 1:05 תהפוך ל־01:05) \n",
+ "
רמזים נוספים: \n",
+ "מומלץ להמיר את השעה מ־string ל־int ואז לבצע את פעולות החשבון, ולבסוף להמיר חזרה ל־string\n",
+ "\n",
+ "
\n",
- "כתבו פונקציה שמקבלת רשימה של רשימות. \n",
- "אם הרשימה החיצונית לא באורך 6, הפונקציה תדפיס Only lists of length 6 are allowed. \n",
+ "
\n",
+ "כתבו פונקציה שמקבלת רשימה של רשימות. \n",
+ "אם הרשימה החיצונית לא באורך 6, הפונקציה תדפיס Only lists of length 6 are allowed. \n",
"הפונקציה תדפיס \"Yes!\" אם אחד מהבאים מתקיים:\n",
"
\n",
- "\n",
- "
\n",
- "
אורך הרשימה במקום ה־0 שווה לאורך הרשימה במקום ה־4
\n",
- "
אורך הרשימה במקום ה־3 שווה לאורך הרשימה במקום ה־2 וה־1
\n",
- "
אורך הרשימה במקום ה־5 שווה לאורך הרשימה במקום ה־3
\n",
+ "
\n",
+ "
אורך הרשימה במקום ה־0 שווה לאורך הרשימה במקום ה־4
\n",
+ "
אורך הרשימה במקום ה־3 שווה לאורך הרשימה במקום ה־2 וה־1
\n",
+ "
אורך הרשימה במקום ה־5 שווה לאורך הרשימה במקום ה־3
\n",
"
\n",
- " \n",
- "
\n",
- "הפונקציה תדפיס \"Yes!\" עבור כל תנאי שמתקיים, גם אם קיים יותר מאחד כזה. \n",
- "לדוגמה, עבור: \n",
- "multi = [[0], [1], [2], [3], [4], [5]] \n",
+ "
\n",
+ "הפונקציה תדפיס \"Yes!\" עבור כל תנאי שמתקיים, גם אם קיים יותר מאחד כזה. \n",
+ "לדוגמה, עבור: \n",
+ "multi = [[0], [1], [2], [3], [4], [5]] \n",
"כל התנאים מתקיימים, ולכן נדפיס \"Yes!\" 3 פעמים.\n",
"
\n",
- " זהו בוקר אפלולי וגשום של יום ראשון. השמיים אפורים ואתם במיטה מתחת לפוך המפנק שלכם, מתפללים שאתם עדיין בתוך החלום המתוק ההוא. \n",
- " השעה היא 7:30. השעון המעורר מנגן שוב את השיר שפעם היה האהוב עליכם, והיום מעלה בכם אסוציאציות קשות שמערבות את הטלפון החכם שלכם ופטיש כבד מאוד. \n",
- " הפגישה שלכם תתקיים בשעה 9:00, ואתם יודעים בוודאות שתספיקו להגיע בזמן אם תתעוררו בשעה 8:00 ותמהרו מאוד. \n",
+ "
\n",
+ " זהו בוקר אפלולי וגשום של יום ראשון. השמיים אפורים ואתם במיטה מתחת לפוך המפנק שלכם, מתפללים שאתם עדיין בתוך החלום המתוק ההוא. \n",
+ " השעה היא 7:30. השעון המעורר מנגן שוב את השיר שפעם היה האהוב עליכם, והיום מעלה בכם אסוציאציות קשות שמערבות את הטלפון החכם שלכם ופטיש כבד מאוד. \n",
+ " הפגישה שלכם תתקיים בשעה 9:00, ואתם יודעים בוודאות שתספיקו להגיע בזמן אם תתעוררו בשעה 8:00 ותמהרו מאוד. \n",
" היד מושטת לכפתור ה\"נודניק\" שיפעיל שוב את השעון המעורר שלכם בעוד 10 דקות. ועוד פעם. ושוב.\n",
"
\n",
- " אם נתאר את האלגוריתם שלפיו פעלתם, נוכל להגיד כך: \n",
- " כל עוד השעון מצלצל, והשעה היא לפני 8:00, לחץ על כפתור הנודניק בשעון. \n",
+ "
\n",
+ " אם נתאר את האלגוריתם שלפיו פעלתם, נוכל להגיד כך: \n",
+ "כל עוד השעון מצלצל, והשעה היא לפני 8:00, לחץ על כפתור הנודניק בשעון. \n",
" נצייר את דרך הפעולה שלכם:\n",
"
\n",
- "המבנה ששרטטנו זה עתה נקרא לולאה. \n",
- "נשתמש בלולאה כשנרצה לחזור על פעולה מספר פעמים שלאו דווקא ידוע לנו מראש. \n",
+ "
\n",
+ "המבנה ששרטטנו זה עתה נקרא לולאה. \n",
+ "נשתמש בלולאה כשנרצה לחזור על פעולה מספר פעמים שלאו דווקא ידוע לנו מראש. \n",
"אם ננסה לנתח את הלולאה כרעיון, נגלה שכל לולאה מורכבת מ־4 חלקים מרכזיים:\n",
"
\n",
- "קל לחשוב על דוגמאות ללולאות מחיי היום־יום. \n",
- "כמעט בכל פעם שאנחנו אומרים \"עד ש־\" או \"כל עוד־\", אנחנו בונים לולאה במציאות. \n",
- "בכל פעם שאנחנו חוזרים על משהו שוב ושוב, אנחנו פועלים לפי לולאה מסוימת שמניעה אותנו. \n",
- "רוב חיי היום־יום שלנו מתנהלים בלולאות, וזו הסיבה שלולאות הן כלי חזק כל כך בתכנות. \n",
+ "
\n",
+ "קל לחשוב על דוגמאות ללולאות מחיי היום־יום. \n",
+ "כמעט בכל פעם שאנחנו אומרים \"עד ש־\" או \"כל עוד־\", אנחנו בונים לולאה במציאות. \n",
+ "בכל פעם שאנחנו חוזרים על משהו שוב ושוב, אנחנו פועלים לפי לולאה מסוימת שמניעה אותנו. \n",
+ "רוב חיי היום־יום שלנו מתנהלים בלולאות, וזו הסיבה שלולאות הן כלי חזק כל כך בתכנות. \n",
"
\n",
- " Two and two are four \n",
- " Four and four are eight \n",
- " Eight and eight are sixteen \n",
- " Sixteen and sixteen are thirty-two \n",
+ " Two and two are four \n",
+ " Four and four are eight \n",
+ " Eight and eight are sixteen \n",
+ " Sixteen and sixteen are thirty-two \n",
"
\n",
- "המספר שפותח את השורה האחרונה בשיר הוא 16, ולכן נרצה שהלולאה תרוץ כל עוד המספר הנוכחי ששמרנו קטן מ־16 או שווה לו. \n",
- "נרשום את מילת המפתח while, ואחריה ביטוי בוליאני שיקבע מתי גוף הלולאה ירוץ. נסיים בנקודתיים. \n",
- "בכל פעם שהביטוי הבוליאני יהיה שווה ל־True, גוף הלולאה ירוץ. \n",
- "בפעם הראשונה (והיחידה) שהביטוי הבוליאני יהיה שקול ל־False, גוף הלולאה לא יתבצע והתוכנית תמשיך לבצע את הקוד שנמצא אחרי הלולאה. \n",
+ "
\n",
+ "המספר שפותח את השורה האחרונה בשיר הוא 16, ולכן נרצה שהלולאה תרוץ כל עוד המספר הנוכחי ששמרנו קטן מ־16 או שווה לו. \n",
+ "נרשום את מילת המפתח while, ואחריה ביטוי בוליאני שיקבע מתי גוף הלולאה ירוץ. נסיים בנקודתיים. \n",
+ "בכל פעם שהביטוי הבוליאני יהיה שווה ל־True, גוף הלולאה ירוץ. \n",
+ "בפעם הראשונה (והיחידה) שהביטוי הבוליאני יהיה שקול ל־False, גוף הלולאה לא יתבצע והתוכנית תמשיך לבצע את הקוד שנמצא אחרי הלולאה. \n",
"
\n",
- "אחרי שכתבנו את התנאי, זה הזמן לכתוב מה אנחנו רוצים שיתבצע בכל פעם שהתנאי יתקיים. \n",
+ "
\n",
+ "אחרי שכתבנו את התנאי, זה הזמן לכתוב מה אנחנו רוצים שיתבצע בכל פעם שהתנאי יתקיים. \n",
"החלק הזה נקרא \"גוף הלולאה\", וכל הרצה שלו נקראת \"אִיטֶרַצְיָה\", או בעברית, \"חִזְרוּר\".\n",
"
\n",
- "
\n",
- "נתחיל בהגדרת המספר שיודפס בסוף השורה, שהוא המספר בתחילת השורה ועוד עצמו. \n",
+ "
\n",
+ "נתחיל בהגדרת המספר שיודפס בסוף השורה, שהוא המספר בתחילת השורה ועוד עצמו. \n",
"שימו לב להזחה, שמציינת שחלק הקוד הזה שייך ללולאת ה־while ושהוא ירוץ בכל פעם שהביטוי הבוליאני שבראשה שקול ל־True.\n",
"
\n",
- "לסיום, לקראת הדפסת השורה הבאה, נקדם את המשתנה שמכיל את הערך שמודפס בתחילת כל שורה בשיר. \n",
- "הפעולה הזו תכין את המשתנה לשורה הבאה, וגם תקדם את הלולאה לסופה. \n",
+ "
\n",
+ "לסיום, לקראת הדפסת השורה הבאה, נקדם את המשתנה שמכיל את הערך שמודפס בתחילת כל שורה בשיר. \n",
+ "הפעולה הזו תכין את המשתנה לשורה הבאה, וגם תקדם את הלולאה לסופה. \n",
"כיוון שתחילת כל שורה חדשה בשיר זהה לסוף השורה הקודמת, נוכל לרשום בפשטות:\n",
"
\n",
- "כפי שראינו, לולאת while משתמשת בביטוי בוליאני כדי להחליט אם להריץ קוד מסוים. \n",
- "היא בודקת אם הביטוי הבוליאני שקול ל־True, ואם כן, היא מריצה את קטע הקוד בגוף הלולאה. \n",
- "כל עוד הביטוי הבוליאני המופיע ליד המילה while שקול ל־True, גוף הלולאה ימשיך לרוץ. \n",
+ "
\n",
+ "כפי שראינו, לולאת while משתמשת בביטוי בוליאני כדי להחליט אם להריץ קוד מסוים. \n",
+ "היא בודקת אם הביטוי הבוליאני שקול ל־True, ואם כן, היא מריצה את קטע הקוד בגוף הלולאה. \n",
+ "כל עוד הביטוי הבוליאני המופיע ליד המילה while שקול ל־True, גוף הלולאה ימשיך לרוץ. \n",
"כשהביטוי יהפוך להיות שקול ל־False, הלולאה תפסיק את ריצת הקוד בגוף הלולאה, והקוד שאחריה ימשיך לרוץ.\n",
"
\n",
- "
\n",
+ "
\n",
"הרעיון של while מקביל ל־if שגופו רץ וחוזר לראש התנאי פעם אחר פעם, עד שהביטוי הבוליאני שבראש התנאי שקול ל־False.\n",
"
\n",
- "לפניכם קוד שמקבל כקלט את מספר התלמידים בכיתה. \n",
- "לאחר מכן, הוא מקבל כקלט את הציון של כל תלמיד במבחן האחרון. \n",
+ "
\n",
+ "לפניכם קוד שמקבל כקלט את מספר התלמידים בכיתה. \n",
+ "לאחר מכן, הוא מקבל כקלט את הציון של כל תלמיד במבחן האחרון. \n",
"לבסוף, הקוד מחזיר את הציון הגבוה ביותר בכיתה.\n",
"
\n",
- "
\n",
+ "
\n",
"שימו לב לשימוש שנעשה כאן בלולאות כדי לגשת למיקומי ערכים ברשימה.\n",
"
\n",
- " אם אתם חדשים בנושא הלולאות והתנסיתם בפתירת התרגילים, יש סיכוי לא רע שנתקעה לכם המחברת. \n",
- " כשאנחנו מתעסקים עם לולאת while, יש סיכון ממשי שניצור בטעות לולאה שלא תסתיים לעולם. \n",
+ "
\n",
+ " אם אתם חדשים בנושא הלולאות והתנסיתם בפתירת התרגילים, יש סיכוי לא רע שנתקעה לכם המחברת. \n",
+ " כשאנחנו מתעסקים עם לולאת while, יש סיכון ממשי שניצור בטעות לולאה שלא תסתיים לעולם. \n",
" המצב שבו לולאה לא מסתיימת נקרא \"לולאה אין־סופית\", והוא נובע מכך שתנאי הלולאה שקול תמיד ל־True.\n",
"
\n",
- " אם ליד תא במחברת שלכם מופיעה כוכבית ותאים אחרים לא יכולים לרוץ, סימן שאותו תא עדיין רץ. \n",
- " אם הוא רץ זמן רב מדי, יש סיכוי שמדובר בלולאה אין־סופית. אם זה אכן המצב, בחרו בסרגל הכלים של המחברת ב־\"Kernel\" ואז ב־\"Restart\". \n",
+ "
\n",
+ " אם ליד תא במחברת שלכם מופיעה כוכבית ותאים אחרים לא יכולים לרוץ, סימן שאותו תא עדיין רץ. \n",
+ " אם הוא רץ זמן רב מדי, יש סיכוי שמדובר בלולאה אין־סופית. אם זה אכן המצב, בחרו בסרגל הכלים של המחברת ב־\"Kernel\" ואז ב־\"Restart\". \n",
" פעולה זו תעצור את הריצה של המחברת שלכם, ותאפשר לכם לתקן את הקוד הבעייתי ולהריץ אותו מחדש.\n",
"
\n",
- "המקרה ההפוך מלולאה אין־סופית הוא לולאה שפשוט לא רצה. \n",
- "במילים אחרות – לולאה שתנאי הכניסה שלה שקול ל־False בהרצתה הראשונה. \n",
+ "
\n",
+ "המקרה ההפוך מלולאה אין־סופית הוא לולאה שפשוט לא רצה. \n",
+ "במילים אחרות – לולאה שתנאי הכניסה שלה שקול ל־False בהרצתה הראשונה. \n",
"במקרה הזה, ראוי לבדוק כיצד אתחלנו את הסביבה, ואם התנאי שכתבנו אכן עובד.\n",
"
\n",
- " את הלולאה הזו כתב מתכנת מפוזר במיוחד, ויש בה יותר מבעיה אחת. \n",
- " מצאו את הבעיות, תקנו אותן והריצו את התוכנית. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " את הלולאה הזו כתב מתכנת מפוזר במיוחד, ויש בה יותר מבעיה אחת. \n",
+ " מצאו את הבעיות, תקנו אותן והריצו את התוכנית. \n",
" הפלט הרצוי, משמאל לימין, הוא: 8, 4, 2, 1.\n",
"
\n",
- " זאת טעות נפוצה מאוד, עד כדי כך שיש לה שם ואפילו ערך בוויקיפדיה! \n",
+ "
\n",
+ " זאת טעות נפוצה מאוד, עד כדי כך שיש לה שם ואפילו ערך בוויקיפדיה! \n",
" בשגיאה מסוג \"סטייה באחד\" (באנגלית: \"Off By One\") מתכנת שוכח לטפל במקרה האחרון, או מטפל במקרה אחד יותר מדי.\n",
"
\n",
- "לולאות הן כלי עוצמתי שמוסיף עניין רב לקוד. \n",
- "עם זאת, לולאות עלולות להוסיף מקרים מיוחדים שגורמים לבאגים קשים לפענוח. \n",
+ "
\n",
+ "לולאות הן כלי עוצמתי שמוסיף עניין רב לקוד. \n",
+ "עם זאת, לולאות עלולות להוסיף מקרים מיוחדים שגורמים לבאגים קשים לפענוח. \n",
"הדרך הכי טובה למצוא בעיות היא להדפיס את ערכם של המשתנים שנמצאים בלולאה ובאתחולי המשתנים שלפניה.\n",
"
\n",
- "נתקעתם במסיבה שבה סופרים את השניות לאחור עד לכניסת השנה החדשה. \n",
- "עזרו למשתתפים המבולבלים שהתחילו לספור מוקדם מדי – \n",
- "קבלו את מספר השניות שנותרו עד חצות, והדפיסו עבורם את הספירה לאחור. \n",
+ "
\n",
+ "נתקעתם במסיבה שבה סופרים את השניות לאחור עד לכניסת השנה החדשה. \n",
+ "עזרו למשתתפים המבולבלים שהתחילו לספור מוקדם מדי – \n",
+ "קבלו את מספר השניות שנותרו עד חצות, והדפיסו עבורם את הספירה לאחור. \n",
"בסוף הספירה, הדפיסו \"Happy new year!\"\n",
"
\n",
- "ציירו פירמידה עומדת על הצד, כך שראשה יהיה בצד ימין. \n",
- "במהלך הקוד, קבלו מהמשתמש את אורך השורה שבה מצויר קודקוד הפירמידה. \n",
+ "
\n",
+ "ציירו פירמידה עומדת על הצד, כך שראשה יהיה בצד ימין. \n",
+ "במהלך הקוד, קבלו מהמשתמש את אורך השורה שבה מצויר קודקוד הפירמידה. \n",
"לדוגמה: בפירמידה שלפניכם, המשתמש הכניס 5 כאורך השורה שבה מצויר קודקוד הפירמידה.\n",
"
\n",
- "הצופן לכספת הביתית שלכם הוא 4812. בנו משחק בול־פגיעה שמאפשר למשתמש לנסות לנחש את הצופן. \n",
- "למשתמש יש 3 ניסיונות לנחש נכונה את הקוד הסודי שלכם לפני שמופעלת אזעקה. \n",
- "כחלק ממנגנון ההגנה מאיבוד הסיסמה לכספת, הכספת מציגה כמה ספרות נכונות המשתמש הזין אחרי כל ניחוש. \n",
- "אפשרו למשתמש להזין קוד 3 פעמים, וכתבו לו בכל ניסיון כמה מתוך הספרות שהזין באמת קיימות בקוד הנכון, לאו דווקא בסדר שהקיש. \n",
- "אם לא הצליח אחרי 3 ניסיונות, הדפיסו שהאזעקה הופעלה וסיימו את התוכנית. \n",
+ "
\n",
+ "הצופן לכספת הביתית שלכם הוא 4812. בנו משחק בול־פגיעה שמאפשר למשתמש לנסות לנחש את הצופן. \n",
+ "למשתמש יש 3 ניסיונות לנחש נכונה את הקוד הסודי שלכם לפני שמופעלת אזעקה. \n",
+ "כחלק ממנגנון ההגנה מאיבוד הסיסמה לכספת, הכספת מציגה כמה ספרות נכונות המשתמש הזין אחרי כל ניחוש. \n",
+ "אפשרו למשתמש להזין קוד 3 פעמים, וכתבו לו בכל ניסיון כמה מתוך הספרות שהזין באמת קיימות בקוד הנכון, לאו דווקא בסדר שהקיש. \n",
+ "אם לא הצליח אחרי 3 ניסיונות, הדפיסו שהאזעקה הופעלה וסיימו את התוכנית. \n",
"
\n",
- "
\n",
- "לדוגמה, אם המשתמש הקיש בניסיון הראשון 0634, הדפיסו לו שרק אחת הספרות שניחש נכונה. \n",
- "אם המשתמש הקיש בניסיון השני 1234, הדפיסו לו ש־3 ספרות תואמות לקוד המקורי. \n",
- "אם המשתמש הקיש בניסיון השלישי 1284, הדפיסו לו ש־4 ספרות תואמות לקוד המקורי, ואז הדפיסו לו שהופעלה האזעקה. \n",
+ "
\n",
+ "לדוגמה, אם המשתמש הקיש בניסיון הראשון 0634, הדפיסו לו שרק אחת הספרות שניחש נכונה. \n",
+ "אם המשתמש הקיש בניסיון השני 1234, הדפיסו לו ש־3 ספרות תואמות לקוד המקורי. \n",
+ "אם המשתמש הקיש בניסיון השלישי 1284, הדפיסו לו ש־4 ספרות תואמות לקוד המקורי, ואז הדפיסו לו שהופעלה האזעקה. \n",
"אם המשתמש הקיש באחד הניסיונות 4812, הדפיסו שהכספת נפתחה בהצלחה וסיימו את התוכנית מייד.\n",
"
\n",
- "נגדיר כלל: אם מספר הוא זוגי, נחלק אותו ב־2. אם מספר הוא אי־זוגי, נכפיל אותו ב־3 ונוסיף לו 1. \n",
- "לפי השערת קולץ, אם ניקח מספר חיובי שלם ונשתמש עליו פעמים רבות בכלל הזה, תמיד נגיע בסופו של דבר למספר 1. \n",
+ "
\n",
+ "נגדיר כלל: אם מספר הוא זוגי, נחלק אותו ב־2. אם מספר הוא אי־זוגי, נכפיל אותו ב־3 ונוסיף לו 1. \n",
+ "לפי השערת קולץ, אם ניקח מספר חיובי שלם ונשתמש עליו פעמים רבות בכלל הזה, תמיד נגיע בסופו של דבר למספר 1. \n",
"לדוגמה, אם ניקח את המספר 52, נקבל את שרשרת הפעולות הבאה:\n",
"
\n",
- "כתבו פונקציה שמקבלת מספר, ומחזירה את מספר הפעולות שצריך לעשות עליו, לפי השערת קולץ, כדי להגיע ל־1. \n",
+ "
\n",
+ "כתבו פונקציה שמקבלת מספר, ומחזירה את מספר הפעולות שצריך לעשות עליו, לפי השערת קולץ, כדי להגיע ל־1. \n",
"לדוגמה: עבור המספר 52 היינו צריכים לבצע 11 פעולות כדי להגיע ל־1, ולכן עבור הקלט 52 הפונקציה תחזיר 11.\n",
"
\n",
- " מצאו עבור איזה מספר בין 1 ל־1,000, צריך לעשות הכי הרבה צעדים, לפי השערת קולץ, כדי להגיע ל־1. \n",
+ "
\n",
+ " מצאו עבור איזה מספר בין 1 ל־1,000, צריך לעשות הכי הרבה צעדים, לפי השערת קולץ, כדי להגיע ל־1. \n",
"לדוגמה, הנה הצעדים שצריך לעשות עבור כל מספר עד 5:\n",
"
\n",
- " זוהי יכולת שימושית מאוד, אך לעיתים עולה הצורך לקחת כמה איברים מתוך המשתנה שהגדרנו, ולבנות מהם רשימה חדשה או מחרוזת חדשה. \n",
+ "
\n",
+ " זוהי יכולת שימושית מאוד, אך לעיתים עולה הצורך לקחת כמה איברים מתוך המשתנה שהגדרנו, ולבנות מהם רשימה חדשה או מחרוזת חדשה. \n",
" קחו לדוגמה את המקרה הבא, שבו התגנב למחרוזת שלנו מספר מיותר שהיינו שמחים להעלים:\n",
"
\n",
- "חיתוך (או Slicing) היא שיטה שמטרתה להשיג חלק מהאיברים של ערך מסוים. \n",
- "במחרוזת, חיתוך יעזור לנו לקבל תת־מחרוזת מתוך המחרוזת השלמה. \n",
- "ברשימה, חיתוך יעזור לנו לקבל תת־רשימה מתוך הרשימה השלמה. \n",
+ "
\n",
+ "חיתוך (או Slicing) היא שיטה שמטרתה להשיג חלק מהאיברים של ערך מסוים. \n",
+ "במחרוזת, חיתוך יעזור לנו לקבל תת־מחרוזת מתוך המחרוזת השלמה. \n",
+ "ברשימה, חיתוך יעזור לנו לקבל תת־רשימה מתוך הרשימה השלמה. \n",
"
\n",
- " קל לזכור שפייתון לא לוקחת את האיבר האחרון: \n",
- " אם ניקח את המיקום של האיבר האחרון, ונחסר ממנו את המיקום של האיבר הראשון – נקבל את מספר האיברים שחזרו. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " קל לזכור שפייתון לא לוקחת את האיבר האחרון: \n",
+ " אם ניקח את המיקום של האיבר האחרון, ונחסר ממנו את המיקום של האיבר הראשון – נקבל את מספר האיברים שחזרו. \n",
" במקרה שלנו – 4 פחות 0 יוצא 4, שזה בדיוק מספר האיברים שקיבלנו חזרה.\n",
"
\n",
- " רבים נוטים להתבלבל בין חיתוך לבין קריאה לפונקציה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " רבים נוטים להתבלבל בין חיתוך לבין קריאה לפונקציה. \n",
" טעות זו מתאפיינת בבלבול בין סוגריים עגולים לבין סוגריים מרובעים, או בין פסיק לבין נקודתיים.\n",
"
\n",
- "אגף כוח האדם הנהדר של צה\"ל ביקש מכם לחלץ את האותיות A, c, a מתוך המחרוזת שהוצגה למעלה. \n",
- "אם נבדוק היטב, נגלה שהאותיות מופיעות החל מהתא ה־0, בקפיצות של 3 בכל פעם. \n",
+ "
\n",
+ "אגף כוח האדם הנהדר של צה\"ל ביקש מכם לחלץ את האותיות A, c, a מתוך המחרוזת שהוצגה למעלה. \n",
+ "אם נבדוק היטב, נגלה שהאותיות מופיעות החל מהתא ה־0, בקפיצות של 3 בכל פעם. \n",
"למזלנו, בפייתון יש דרך פשוטה להפליא לחתוך תוך כדי קפיצות מאות לאות – להוסיף נקודתיים, ואז את מרחק הקפיצה!\n",
"
\n",
- "שרשרו את המחרוזות הבאות יחד, לפי הסדר שבו הן מוצגות בתרגיל. \n",
+ "
\n",
+ "שרשרו את המחרוזות הבאות יחד, לפי הסדר שבו הן מוצגות בתרגיל. \n",
"לצורך התרגיל, התייחסו ל־H כתו הראשון במחרוזת. כמו כן, התייחסו לרווח כתו לכל דבר.\n",
"
\n",
- "\n",
- "
המחרוזת שהוגדרה מהתו השביעי והלאה.
\n",
- "
המחרוזת שהוגדרה מהתו השישי ועד התו החמישי, כולל, מימין לשמאל.
\n",
- "
המחרוזת \"f \" (התו f ואז רווח).
\n",
- "
ארבעת התווים הראשונים במחרוזת שהוגדרה.
\n",
+ "\n",
+ "
המחרוזת שהוגדרה מהתו השביעי והלאה.
\n",
+ "
המחרוזת שהוגדרה מהתו השישי ועד התו החמישי, כולל, מימין לשמאל.
\n",
- "ארפכשד העביר לכדרלעומר מסר סודי ומוצפן. \n",
- "במחרוזת הבאה, אם תקפצו בכל פעם מעל מספר מסוים של אותיות, תקבלו מסר חשוב הכולל את סיסמתו של ארפכשד. \n",
+ "
\n",
+ "ארפכשד העביר לכדרלעומר מסר סודי ומוצפן. \n",
+ "במחרוזת הבאה, אם תקפצו בכל פעם מעל מספר מסוים של אותיות, תקבלו מסר חשוב הכולל את סיסמתו של ארפכשד. \n",
"מצאו על כמה אותיות צריך לדלג בכל פעם כדי להשיג את המסר הסודי שנשלח לארפכשד.\n",
"
\n",
- "לפניכם דוגמה של קובץ טקסט שמסודר בצורה שמזכירה טבלה. \n",
- "הקובץ מכיל את עשרים הפוקימונים הראשונים. העמודות מופרדות זו מזו בפסיקים. \n",
- "החזירו רשימה של רשימות, כאשר כל תת־רשימה מייצגת שורה בטבלה, וכל תא ברשימה הזו מייצג את הערך שנמצא בעמודה באותה רשימה. \n",
- "מחקו מהרשימות את עמודת Generation (שהרי כולם מדור ראשון), ואת עמודת Legendary (אף אחד מהם אינו אגדי). \n",
+ "
\n",
+ "לפניכם דוגמה של קובץ טקסט שמסודר בצורה שמזכירה טבלה. \n",
+ "הקובץ מכיל את עשרים הפוקימונים הראשונים. העמודות מופרדות זו מזו בפסיקים. \n",
+ "החזירו רשימה של רשימות, כאשר כל תת־רשימה מייצגת שורה בטבלה, וכל תא ברשימה הזו מייצג את הערך שנמצא בעמודה באותה רשימה. \n",
+ "מחקו מהרשימות את עמודת Generation (שהרי כולם מדור ראשון), ואת עמודת Legendary (אף אחד מהם אינו אגדי). \n",
"מחקו גם את עמודת Total.\n",
"
\n",
- "בונוס: המירו לטיפוס מסוג int את המקומות ברשימה שמכילים מספרים. \n",
+ "
\n",
+ "בונוס: המירו לטיפוס מסוג int את המקומות ברשימה שמכילים מספרים. \n",
"זהו תרגיל מורכב. הרגישו בנוח לפתוח מחברות משבוע קודם ולהיעזר במדריכים.\n",
"
\n",
- " קובץ הוא מבנה שמאגד בתוכו נתונים השמורים במחשב שלכם. \n",
- " לכל קובץ יש שם וכתובת (נתיב, או באנגלית path), והוא מכיל כמות מסוימת של מידע שמשפיעה על גודלו. \n",
+ "
\n",
+ "קובץ הוא מבנה שמאגד בתוכו נתונים השמורים במחשב שלכם. \n",
+ " לכל קובץ יש שם וכתובת (נתיב, או באנגלית path), והוא מכיל כמות מסוימת של מידע שמשפיעה על גודלו. \n",
" תוכן הקובץ הוא מה שמגדיר את סוגו. סוגי קבצים שונים משמשים למטרות שונות, לדוגמה:\n",
"
\n",
- "קבצים הם דרך נהדרת לקבל הצצה חטופה לעומק ולמורכבות של המכונה המדהימה שנקראת מחשב. \n",
+ "### מהברזל ועד הקובץ\n",
+ "
\n",
+ "קבצים הם דרך נהדרת לקבל הצצה חטופה לעומק ולמורכבות של המכונה המדהימה שנקראת מחשב. \n",
"ננסה לצייר לכם תמונה מלאה – נתחיל מהשכבה הנמוכה ביותר, הכונן הקשיח שלכם, ולבסוף נגיע לקבצים.\n",
"
\n",
- "כונן קשיח הוא אחד מהרכיבים הנמצאים בקופסת המחשב שעליו אתם עובדים כרגע. \n",
- "זהו הרכיב שמאחסן לטווח ארוך את המידע במחשב שלכם – קבצים, תוכנות, מערכת הפעלה והגדרות, כמו העדפות השפה שלכם. \n",
+ "#### הכונן הקשיח\n",
+ "
\n",
+ "כונן קשיח הוא אחד מהרכיבים הנמצאים בקופסת המחשב שעליו אתם עובדים כרגע. \n",
+ "זהו הרכיב שמאחסן לטווח ארוך את המידע במחשב שלכם – קבצים, תוכנות, מערכת הפעלה והגדרות, כמו העדפות השפה שלכם. \n",
"היתרון המובהק של כוננים קשיחים הוא שהם יודעים לשמור על המידע שלכם לאורך זמן, גם כאשר הם לא מוזנים בחשמל.\n",
"
\n",
- "כוננים קשיחים מכילים הרבה יחידות קטנטנות שכל אחת מהן נקראת \"ביט\". \n",
- "ביט הוא ערך שיכול להיות 0 או 1, כלומר כבוי או דולק. \n",
- "בכל כונן קשיח פשוט שנמכר כיום יש מקום למאות מיליארדי(!) ביטים כאלו. \n",
+ "#### ביט\n",
+ "
\n",
+ "כוננים קשיחים מכילים הרבה יחידות קטנטנות שכל אחת מהן נקראת \"ביט\". \n",
+ "ביט הוא ערך שיכול להיות 0 או 1, כלומר כבוי או דולק. \n",
+ "בכל כונן קשיח פשוט שנמכר כיום יש מקום למאות מיליארדי(!) ביטים כאלו. \n",
"כך נשמר כל המידע שדיברנו עליו בפסקה הקודמת.\n",
"
\n",
- "\n",
- "
\n",
- "אם נסתכל בעיניים אנושיות על רצפי התאים הקטנטנים, הביטים, שנמצאים בכונן הקשיח, קרוב לוודאי שלא נבין מהם כלום. \n",
- "הנה דוגמה לרצף שכזה: 010000100011001100101111010100110011001000110011. \n",
+ "
\n",
+ "אם נסתכל בעיניים אנושיות על רצפי התאים הקטנטנים, הביטים, שנמצאים בכונן הקשיח, קרוב לוודאי שלא נבין מהם כלום. \n",
+ "הנה דוגמה לרצף שכזה: 010000100011001100101111010100110011001000110011. \n",
"איך יוצקים משמעות לתוך דבר כזה? מה רצף המספרים הזה אומר בכלל?\n",
"
\n",
- "\n",
- "
\n",
- "נדמיין לרגע שאנחנו הממציאים של המחשב, ושהמטרה שלנו היא לייצג טקסט בצורה קלה לשמירה ולקריאה לאחר מכן. \n",
+ "
\n",
+ "נדמיין לרגע שאנחנו הממציאים של המחשב, ושהמטרה שלנו היא לייצג טקסט בצורה קלה לשמירה ולקריאה לאחר מכן. \n",
"האם תוכלו לחשוב על דרך לעשות זאת רק באמצעות רצפים של 0 ו־1?\n",
"
\n",
- "בעיה דומה של ייצוג טקסט באמצעות אפסים ואחדים בלבד, עלתה אי שם ב־1960. \n",
- "אחסוך לכם הרבה מעשיות בדרך, אבל מפה לשם הוחלט על תקן בשם ASCII, שקובע שכל סידור אפשרי של 8 ביטים שכאלו, שנקרא \"בייט\", ייצג תו. \n",
- "האות A קיבלה את הייצוג 01000001, האות Z, למשל, קיבלה את הייצוג 01011010, הספרה 7 את הייצוג 00110111 והתו רווח את הייצוג 00100000. \n",
+ "#### ייצוג תווים\n",
+ "
\n",
+ "בעיה דומה של ייצוג טקסט באמצעות אפסים ואחדים בלבד, עלתה אי שם ב־1960. \n",
+ "אחסוך לכם הרבה מעשיות בדרך, אבל מפה לשם הוחלט על תקן בשם ASCII, שקובע שכל סידור אפשרי של 8 ביטים שכאלו, שנקרא \"בייט\", ייצג תו. \n",
+ "האות A קיבלה את הייצוג 01000001, האות Z, למשל, קיבלה את הייצוג 01011010, הספרה 7 את הייצוג 00110111 והתו רווח את הייצוג 00100000. \n",
"כך אפשר לקרוא מסר ארוך מאוד, ולהמיר כל 8 ביטים רצופים לתו. אם ננסה לקרוא בשיטה הזו 80 ביטים, נקבל 10 תווים קריאים.\n",
"
\n",
- "אבל רגע! מה קורה אם אני רוצה לייצג תמונה של חתול? או סרטון של חתול? או סאונד של... ובכן, חתול? \n",
- "כמו שאנשים חכמים חשבו על דרך לייצג ASCII, חכמים אחרים חשבו, עבור כל סוג של קובץ – מתמונה ועד תוכנה שרצה על המחשב, איך מייצגים אותם באמצעות ביטים. \n",
- "גם בימים אלו, אנשים מוכשרים רבים יושבים וחושבים על דרכים טובות יותר לייצג מידע בעזרת ביטים, ויוצרים עבורנו סוגי קבצים חדשים. \n",
+ "#### ייצוג קבצים אחרים\n",
+ "
\n",
+ "אבל רגע! מה קורה אם אני רוצה לייצג תמונה של חתול? או סרטון של חתול? או סאונד של... ובכן, חתול? \n",
+ "כמו שאנשים חכמים חשבו על דרך לייצג ASCII, חכמים אחרים חשבו, עבור כל סוג של קובץ – מתמונה ועד תוכנה שרצה על המחשב, איך מייצגים אותם באמצעות ביטים. \n",
+ "גם בימים אלו, אנשים מוכשרים רבים יושבים וחושבים על דרכים טובות יותר לייצג מידע בעזרת ביטים, ויוצרים עבורנו סוגי קבצים חדשים. \n",
"
\n",
- "\n",
- "
\n",
- "כשאנחנו רוצים לפתוח תמונה של חתול, למשל, אנחנו מפעילים תוכנה ייעודית שיודעת לקרוא ייצוג של תמונות. \n",
- "מה שקורה באותו רגע מאחורי הקלעים הוא שהתוכנה קוראת רצפים של 0 ו־1 מהדיסק הקשיח, אותם ביטים שדיברנו עליהם. \n",
- "מי שצילם את התמונה השתמש בתוכנה שיודעת להמיר את מה שקרה על מסך המצלמה לביטים שנשמרו על כרטיס הזיכרון שלו. \n",
- "מי שתכנת את התוכנה שמציגה לנו כרגע את החתול ידע להורות לה מה לעשות כדי לתרגם את אותם ביטים לתמונה שמוצגת לכם על המסך. \n",
- "שניהם פעלו לפי תקן מסוים (יש כמה כאלו, אולי אתם מכירים חלק מהם: JPG, PNG, GIF ועוד), שקובע דרך אחידה לייצג תמונה בעזרת ביטים. \n",
+ "
\n",
+ "כשאנחנו רוצים לפתוח תמונה של חתול, למשל, אנחנו מפעילים תוכנה ייעודית שיודעת לקרוא ייצוג של תמונות. \n",
+ "מה שקורה באותו רגע מאחורי הקלעים הוא שהתוכנה קוראת רצפים של 0 ו־1 מהדיסק הקשיח, אותם ביטים שדיברנו עליהם. \n",
+ "מי שצילם את התמונה השתמש בתוכנה שיודעת להמיר את מה שקרה על מסך המצלמה לביטים שנשמרו על כרטיס הזיכרון שלו. \n",
+ "מי שתכנת את התוכנה שמציגה לנו כרגע את החתול ידע להורות לה מה לעשות כדי לתרגם את אותם ביטים לתמונה שמוצגת לכם על המסך. \n",
+ "שניהם פעלו לפי תקן מסוים (יש כמה כאלו, אולי אתם מכירים חלק מהם: JPG, PNG, GIF ועוד), שקובע דרך אחידה לייצג תמונה בעזרת ביטים. \n",
"בסופו של דבר, עבור התוכנה החתול שלכם הוא בסך הכול משבצות קטנטנות בצבעים שונים שמצוירות זו על יד זו.\n",
"
\n",
- "\n",
- "
\n",
+ "
\n",
" ייצוג מסוים של קובץ נקרא \"פורמט\", או בעברית \"תַּסְדִיר\".\n",
"
\n",
- "חלק מהקבצים, כמו מסמכי טקסט או תוכניות פייתון, יכולים להיות קבצים טקסטואליים. \n",
- "ישנם סוגי קבצים טקסטואליים נוספים, כמו CSV שמייצג מידע טבלאי באמצעות טקסט, או HTML שמייצג קוד שבעזרתו המחשב יודע להציג דף אינטרנט. \n",
+ "
\n",
+ "חלק מהקבצים, כמו מסמכי טקסט או תוכניות פייתון, יכולים להיות קבצים טקסטואליים. \n",
+ "ישנם סוגי קבצים טקסטואליים נוספים, כמו CSV שמייצג מידע טבלאי באמצעות טקסט, או HTML שמייצג קוד שבעזרתו המחשב יודע להציג דף אינטרנט. \n",
"המשותף לקבצים האלו הוא שאם ממירים את הביטים שמהם הם מורכבים לתווים, מתקבלת תוצאה שנוח לבני אדם לקרוא, ולא רק למחשב.\n",
"
"
]
@@ -196,8 +186,8 @@
"metadata": {},
"source": [
"\n",
- " \n",
- " מימין ניתן לראות קובץ CSV פתוח באקסל, ומשמאל את הייצוג הטקסטואלי שלו.\n",
+ "\n",
+ "מימין ניתן לראות קובץ CSV פתוח באקסל, ומשמאל את הייצוג הטקסטואלי שלו.\n",
""
]
},
@@ -205,9 +195,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "ישנם גם סוגי קבצים אחרים שלא נועדו לקריאה על־ידי עין אנושית. \n",
- "קבצים כאלו נקראים \"קבצים בינאריים\", ונלמד לטפל בחלק מהם בשלב מתקדם יותר בקורס. \n",
+ "
\n",
+ "ישנם גם סוגי קבצים אחרים שלא נועדו לקריאה על־ידי עין אנושית. \n",
+ "קבצים כאלו נקראים \"קבצים בינאריים\", ונלמד לטפל בחלק מהם בשלב מתקדם יותר בקורס. \n",
"
XLSX – תסדיר המיועד לאחסון מידע בגיליונות אלקטרוניים (לדוגמה, בעזרת Excel).
\n",
- "
EXE – תסדיר המיועד למערכת ההפעלה חלונות, ומפרט אילו פקודות יש לבצע כדי שתוכנה תרוץ.
\n",
+ "
\n",
+ "
MP3 – תסדיר המיועד עבור קובצי שמע.
\n",
+ "
PNG – תסדיר לייצוג תמונות.
\n",
+ "
PDF – תסדיר המיועד עבור תצוגה מדויקת של מסמכים.
\n",
+ "
XLSX – תסדיר המיועד לאחסון מידע בגיליונות אלקטרוניים (לדוגמה, בעזרת Excel).
\n",
+ "
EXE – תסדיר המיועד למערכת ההפעלה חלונות, ומפרט אילו פקודות יש לבצע כדי שתוכנה תרוץ.
\n",
"
"
]
},
@@ -238,8 +228,8 @@
"metadata": {},
"source": [
"\n",
- " \n",
- " מימין ניתן לראות קובץ PNG פתוח בתוכנה להצגת תמונות, ומשמאל את הייצוג הבינארי שלו כשמנסים להמיר אותו לטקסט. \n",
+ "\n",
+ "מימין ניתן לראות קובץ PNG פתוח בתוכנה להצגת תמונות, ומשמאל את הייצוג הבינארי שלו כשמנסים להמיר אותו לטקסט. \n",
" קל לראות ש־PNG אינו תסדיר טקסטואלי.\n",
""
]
@@ -248,7 +238,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
+ "
\n",
" בהמשך החוברת הזו נלמד לטפל בקבצים טקסטואליים.\n",
"
\n",
- " אם בעבר השתמשנו בפנקס כדי לשמור מלל, הרי שכיום שימוש בקבצים ממוחשבים עושה הכול לקל ומהיר. \n",
+ "
\n",
+ " אם בעבר השתמשנו בפנקס כדי לשמור מלל, הרי שכיום שימוש בקבצים ממוחשבים עושה הכול לקל ומהיר. \n",
" על קבצים ממוחשבים אפשר לבצע חישובים מסובכים בתוך חלקיק שנייה, ויתרון זה מעניק לנו יכולות שלא היו קיימות בעבר.\n",
"
\n",
- " קבצים הם מקור מצוין לקלט ולפלט עבור התוכניות שאנחנו כותבים. \n",
- " כמקור קלט, הם יכולים לכלול שורות רבות או מידע מורכב מהרגיל. \n",
+ "
\n",
+ " קבצים הם מקור מצוין לקלט ולפלט עבור התוכניות שאנחנו כותבים. \n",
+ " כמקור קלט, הם יכולים לכלול שורות רבות או מידע מורכב מהרגיל. \n",
" כפלט, הם מאפשרים לנו לשמור מידע בין הרצה להרצה, להעביר את המידע ממקום למקום בקלות ולייצג מידע מורכב בפשטות.\n",
"
\n",
- "בקובץ passwords.txt שנמצא בתוך תיקיית resources, אספנו לכם את 25 הסיסמאות הנפוצות ביותר בעולם. \n",
+ "
\n",
+ "בקובץ passwords.txt שנמצא בתוך תיקיית resources, אספנו לכם את 25 הסיסמאות הנפוצות ביותר בעולם. \n",
"בתור התחלה, ננסה להציץ במה שכתוב בתוך הקובץ בעזרת פייתון. \n",
"
\n",
- "הפונקציה open מאפשרת לנו לפתוח קובץ בעזרת פייתון, כדי להשתמש בו בהמשך התוכנית. \n",
- "היא מקבלת 2 פרמטרים: הראשון הוא הנתיב לקובץ, והשני הוא צורת הגישה לקובץ, שעליה מייד נסביר. \n",
- "הפונקציה מחזירה ערך שנקרא File handler, מעין מצביע על הקובץ שעליו נוכל לבצע פעולות. \n",
+ "
\n",
+ "הפונקציה open מאפשרת לנו לפתוח קובץ בעזרת פייתון, כדי להשתמש בו בהמשך התוכנית. \n",
+ "היא מקבלת 2 פרמטרים: הראשון הוא הנתיב לקובץ, והשני הוא צורת הגישה לקובץ, שעליה מייד נסביר. \n",
+ "הפונקציה מחזירה ערך שנקרא File handler, מעין מצביע על הקובץ שעליו נוכל לבצע פעולות. \n",
"
\n",
- "עכשיו, כשהקובץ פתוח, נוכל להשתמש בו. \n",
+ "
\n",
+ "עכשיו, כשהקובץ פתוח, נוכל להשתמש בו. \n",
"נבקש מפייתון לקרוא את תוכן הקובץ באמצעות הפעולה read, ונבצע השמה של התוכן שחזר מהפעולה, למשתנה:\n",
"
\n",
- " פתחו את הקובץ וקראו אותו בעצמכם, קבלו מהמשתמש את הסיסמה שלו, והדפיסו אם היא בין 25 הסיסמאות הנפוצות ביותר. \n",
- " בונוס: אם היא בין 25 הסיסמאות הנפוצות, החזירו את המיקום שלה ברשימה.\n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " פתחו את הקובץ וקראו אותו בעצמכם, קבלו מהמשתמש את הסיסמה שלו, והדפיסו אם היא בין 25 הסיסמאות הנפוצות ביותר. \n",
+ "בונוס: אם היא בין 25 הסיסמאות הנפוצות, החזירו את המיקום שלה ברשימה.\n",
"
\n",
- "תופתעו לדעת שאתם כבר מכירים את הרעיון של סמן! \n",
- "דמיינו שאתם פותחים מסמך לעריכה, או אפילו פותרים תרגיל במחברת. \n",
+ "
\n",
+ "תופתעו לדעת שאתם כבר מכירים את הרעיון של סמן! \n",
+ "דמיינו שאתם פותחים מסמך לעריכה, או אפילו פותרים תרגיל במחברת. \n",
"נסו להיזכר בקו המהבהב שמסמן לכם את המיקום של התו הבא שתכתבו.\n",
"
\n",
- "כאשר אנחנו פותחים קובץ לקריאה בעזרת פייתון, הסמן (באנגלית: cursor) מצביע לתחילת הקובץ. \n",
- "ברגע שאתם מבקשים מפייתון לקרוא את הקובץ בעזרת הפעולה read, היא קוראת מהמקום שבו נמצא הסמן ועד סוף הקובץ. \n",
+ "
\n",
+ "כאשר אנחנו פותחים קובץ לקריאה בעזרת פייתון, הסמן (באנגלית: cursor) מצביע לתחילת הקובץ. \n",
+ "ברגע שאתם מבקשים מפייתון לקרוא את הקובץ בעזרת הפעולה read, היא קוראת מהמקום שבו נמצא הסמן ועד סוף הקובץ. \n",
"בזמן הקריאה הסמן יעבור לסוף הקובץ, ולכן כשתנסו לקרוא אותו שוב – תקבלו מחרוזת ריקה.\n",
"
\n",
- "לעיתים, בייחוד כאשר מדובר בקובץ גדול, נעדיף לקרוא בכל פעם רק חלק מהקובץ. \n",
- "נוכל לבחור לקרוא מספר מסוים של תווים באמצעות הפעולה read שאנחנו כבר מכירים, \n",
+ "
\n",
+ "לעיתים, בייחוד כאשר מדובר בקובץ גדול, נעדיף לקרוא בכל פעם רק חלק מהקובץ. \n",
+ "נוכל לבחור לקרוא מספר מסוים של תווים באמצעות הפעולה read שאנחנו כבר מכירים, \n",
"אלא שהפעם נעביר לה ארגומנט שיורה לה כמה תווים לקרוא:\n",
"
\n",
- "פייתון גם מאפשרת לנו לקרוא עד סוף השורה הנוכחית, שעליה נמצא הסמן, באמצעות הפעולה readline. \n",
+ "
\n",
+ "פייתון גם מאפשרת לנו לקרוא עד סוף השורה הנוכחית, שעליה נמצא הסמן, באמצעות הפעולה readline. \n",
"שימו לב שהשורה תסתיים בתווים המייצגים שורה חדשה:\n",
"
\n",
- " כתבו פונקציה שמקבלת נתיב לקובץ, ומחזירה רשימה שבה כל איבר הוא שורה בקובץ. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " כתבו פונקציה שמקבלת נתיב לקובץ, ומחזירה רשימה שבה כל איבר הוא שורה בקובץ. \n",
" בניגוד לפעולה readlines, דאגו שהמחרוזות ברשימה לא יסתיימו בתו שמייצג ירידת שורה.\n",
"
\n",
- "חשבתם שהשארת דלת פתוחה נחשבת גסות רוח? נראה שעדיין לא שמעתם מה מתכנתים חושבים על קבצים שנשארים פתוחים. \n",
- "כיוון שחשוב לנו להיות מנומסים, אנחנו נסגור קבצים לאחר שסיימנו להשתמש בהם. \n",
- "קובץ פתוח תופס משאבי מערכת (כמו זיכרון), ולעיתים יגרום לכך שתוכנות אחרות לא יוכלו לגשת אליו. \n",
+ "
\n",
+ "חשבתם שהשארת דלת פתוחה נחשבת גסות רוח? נראה שעדיין לא שמעתם מה מתכנתים חושבים על קבצים שנשארים פתוחים. \n",
+ "כיוון שחשוב לנו להיות מנומסים, אנחנו נסגור קבצים לאחר שסיימנו להשתמש בהם. \n",
+ "קובץ פתוח תופס משאבי מערכת (כמו זיכרון), ולעיתים יגרום לכך שתוכנות אחרות לא יוכלו לגשת אליו. \n",
"השארת קבצים פתוחים היא מנהג מגונה שיגרום להאטה בביצועים ואפילו לקריסות בלתי צפויות, אם יותר מדי file handlers פתוחים.\n",
"
\n",
- " אם פתחנו קובץ לכתיבה והנתיב אליו לא קיים במערכת שלנו, פייתון תבדוק אם התיקייה שמעליו קיימת. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " אם פתחנו קובץ לכתיבה והנתיב אליו לא קיים במערכת שלנו, פייתון תבדוק אם התיקייה שמעליו קיימת. \n",
" אם כן – פייתון תיצור את הקובץ בשבילנו.\n",
"
\n",
- "אם תחפשו את הקובץ במחשב ותפתחו אותו, תגלו שפייתון עדיין לא כתבה אליו את הנתונים. \n",
- "פייתון שומרת את הנתונים שביקשתם לכתוב בצד במנגנון זיכרון זמני שנקרא buffer (\"מִכְלָא\" בעברית, תודה ששאלתם), ותכתוב אותם לקובץ כשתסגרו אותו. \n",
+ "
\n",
+ "אם תחפשו את הקובץ במחשב ותפתחו אותו, תגלו שפייתון עדיין לא כתבה אליו את הנתונים. \n",
+ "פייתון שומרת את הנתונים שביקשתם לכתוב בצד במנגנון זיכרון זמני שנקרא buffer (\"מִכְלָא\" בעברית, תודה ששאלתם), ותכתוב אותם לקובץ כשתסגרו אותו. \n",
"תוכלו להכריח את פייתון לכתוב לקובץ עוד לפני שסגרתם אותו באמצעות הפעולה flush:\n",
"
\n",
- " כשאתם בתוך המחברת, ניתן להשתמש בסימן קריאה כדי להריץ פקודות או תוכניות שלא קשורות לפייתון. \n",
- " לדוגמה, הפקודה: !pokemon.csv תריץ את הקובץ שכתבנו. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " כשאתם בתוך המחברת, ניתן להשתמש בסימן קריאה כדי להריץ פקודות או תוכניות שלא קשורות לפייתון. \n",
+ " לדוגמה, הפקודה: !pokemon.csv תריץ את הקובץ שכתבנו. \n",
" שימו לב שלא תוכלו להריץ שום דבר אחר במחברת עד שתסגרו את הקובץ.\n",
"
\n",
- "ניתן לפתוח קובץ במצב 'w' אם נרצה לכתוב לקובץ חדש, או לדרוס קובץ קיים. \n",
+ "
\n",
+ "ניתן לפתוח קובץ במצב 'w' אם נרצה לכתוב לקובץ חדש, או לדרוס קובץ קיים. \n",
"אם נרצה להוסיף שורות לקובץ קיים, נפתח את הקובץ במצב ההוספה 'a', שמסמן append.\n",
"
\n",
- "מילת המפתח with מאפשרת לנו לאגד כמה שורות באותו הקשר. \n",
- "בהקשר של קבצים, היא מאפשרת לנו לאגד תחתיה שורות שמטרתן טיפול בקובץ מסוים. \n",
+ "
\n",
+ "מילת המפתח with מאפשרת לנו לאגד כמה שורות באותו הקשר. \n",
+ "בהקשר של קבצים, היא מאפשרת לנו לאגד תחתיה שורות שמטרתן טיפול בקובץ מסוים. \n",
"לדוגמה, השורות הבאות:\n",
"
\n",
- " בתור מתכנתים, אתם בוחרים איך לכתוב את הקוד שלכם. \n",
+ "
\n",
+ " בתור מתכנתים, אתם בוחרים איך לכתוב את הקוד שלכם. \n",
" ובכל זאת, קל לראות את היתרונות של שימוש ב־with: הקוד נעשה קריא ומסודר יותר, והקובץ נסגר לבד כשמסתיימת ההזחה.\n",
"
\n",
- " כתיבת קוד עם with היא פשוטה יותר ממה שנראה בהתחלה – \n",
+ "
\n",
+ " כתיבת קוד עם with היא פשוטה יותר ממה שנראה בהתחלה – \n",
" 5 הסעיפים הראשונים התייחסו לשורה הראשונה, ששקולה לשורה הראשונה והרביעית בקוד בלי ה־with.\n",
"
\n",
- " בקובץ cereal.csv שנמצא בתיקיית resources, ישנו מידע תזונתי על מִדְגַּנִּים שונים (יענו, דגני בוקר). \n",
- " ככל שהמדגנים שמופיעים בשורה מסוימת בריאים יותר, כך המספר שמופיע לידם בעמודה rating גבוה יותר. \n",
- " מצאו את המדגנים הבריאים ביותר והדפיסו את שמם לצד הציון שקיבלו. \n",
+ "
\n",
+ " בקובץ cereal.csv שנמצא בתיקיית resources, ישנו מידע תזונתי על מִדְגַּנִּים שונים (יענו, דגני בוקר). \n",
+ " ככל שהמדגנים שמופיעים בשורה מסוימת בריאים יותר, כך המספר שמופיע לידם בעמודה rating גבוה יותר. \n",
+ " מצאו את המדגנים הבריאים ביותר והדפיסו את שמם לצד הציון שקיבלו. \n",
" קרדיט: את הקובץ הבאנו מכאן.\n",
"
\n",
- "בקובץ hope.txt שנמצא בתיקיית resources, נמצאת אחת הפואמות המהממות של אמילי דיקנסון, תִּקְוָה הִיא בַּעֲלַת-הַנוֹצָה. \n",
+ "
\n",
+ "בקובץ hope.txt שנמצא בתיקיית resources, נמצאת אחת הפואמות המהממות של אמילי דיקנסון, תִּקְוָה הִיא בַּעֲלַת-הַנוֹצָה. \n",
"אך אבוי! הפואמה התבלגנה, וכעת סדר המילים בכל שורה הוא הפוך.\n",
"
\n",
- " עד כה למדנו שישנם שני אופרטורים חשבוניים שעובדים על רשימות: חיבור וכפל. \n",
- " חיבור משרשר רשימה אחת לאחרת, וכפל משרשר רשימה לעצמה כמה פעמים. \n",
+ "
\n",
+ " עד כה למדנו שישנם שני אופרטורים חשבוניים שעובדים על רשימות: חיבור וכפל. \n",
+ " חיבור משרשר רשימה אחת לאחרת, וכפל משרשר רשימה לעצמה כמה פעמים. \n",
" ניזכר בדוגמאות:\n",
"
\n",
- " למרות כל הידע המועיל שצברנו עד כה, טרם נגענו בפעולות השייכות לנתונים מסוג רשימה. \n",
+ "
\n",
+ " למרות כל הידע המועיל שצברנו עד כה, טרם נגענו בפעולות השייכות לנתונים מסוג רשימה. \n",
" הפעולות האלו יתווספו לארגז הכלים שלנו, יקלו על כתיבת הקוד ויעשו אותו קריא יותר.\n",
"
"
]
@@ -132,14 +132,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## פעולות על רשימה"
+ "## פעולות על רשימה"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "במהלך הרצת הדוגמאות נשים לב שפעולות על הרשימה משפיעות ישירות על הרשימה עצמה. \n",
+ "
\n",
+ "במהלך הרצת הדוגמאות נשים לב שפעולות על הרשימה משפיעות ישירות על הרשימה עצמה. \n",
"זה אומר שלא נצטרך להשתמש בהשמה כדי לערוך את הרשימה שעליה אנחנו עובדים.\n",
"
\n",
- "רשימה היא סוג נתונים נוח לשימוש, בין היתר כיוון שניתן להוסיף לה כמה איברים שנרצה. \n",
+ "
\n",
+ "רשימה היא סוג נתונים נוח לשימוש, בין היתר כיוון שניתן להוסיף לה כמה איברים שנרצה. \n",
"נוכל להוסיף איבר לסוף הרשימה באמצעות הפעולה append:\n",
"
\n",
- "שימו לב שבניגוד לשורה שמופיעה למעלה, append מאפשרת להוסיף בכל פעם איבר אחד בלבד. \n",
+ "
\n",
+ "שימו לב שבניגוד לשורה שמופיעה למעלה, append מאפשרת להוסיף בכל פעם איבר אחד בלבד. \n",
"ניסיון להעביר לפעולה append רשימה, נניח, יוסיף את הרשימה המשנית כולה כאיבר אחד בסוף הרשימה הראשית:\n",
"
\n",
- "הפעולה גם מאפשרת לנו לבחור את המקום שממנו אנחנו מעוניינים להוציא את הערך. \n",
+ "
\n",
+ "הפעולה גם מאפשרת לנו לבחור את המקום שממנו אנחנו מעוניינים להוציא את הערך. \n",
"נעשה זאת בעזרת העברת ארגומנט עם מיקום הערך שאנחנו רוצים להוציא מהרשימה:\n",
"
\n",
- "אבל אחד היתרונות המובהקים של extend הוא שניתן להעביר לה כארגומנט כל iterable שהוא. \n",
+ "
\n",
+ "אבל אחד היתרונות המובהקים של extend הוא שניתן להעביר לה כארגומנט כל iterable שהוא. \n",
"הפעולה extend תפרק את ה־iterable ותוסיף כל איבר בנפרד לרשימה המקורית: \n",
"
\n",
- "כאן לא תמצאו הפתעות מיוחדות. הפעולה count מחזירה את מספר האיברים ברשימה, שזהים לאיבר שהעברתם לה כארגומנט. \n",
+ "
\n",
+ "כאן לא תמצאו הפתעות מיוחדות. הפעולה count מחזירה את מספר האיברים ברשימה, שזהים לאיבר שהעברתם לה כארגומנט. \n",
"נשמע לכם מוכר? נכון! למחרוזות יש פעולה עם שם זהה שעושה בדיוק אותו דבר.\n",
"
\n",
- "גם הפעולה הזו אמורה להישמע לכם מוכרת. \n",
- "הפעולה index מוצאת את המופע הראשון של האיבר שהעברתם לה כארגומנט. \n",
+ "
\n",
+ "גם הפעולה הזו אמורה להישמע לכם מוכרת. \n",
+ "הפעולה index מוצאת את המופע הראשון של האיבר שהעברתם לה כארגומנט. \n",
"כן, גם הפעם למחרוזות יש פעולה באותו שם, שעושה בדיוק אותו דבר.\n",
"
\n",
- " כתבו פונקציה שמקבלת רשימה, ומחזירה את מיקום המופע האחרון של האיבר הראשון ברשימה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " כתבו פונקציה שמקבלת רשימה, ומחזירה את מיקום המופע האחרון של האיבר הראשון ברשימה. \n",
" לדוגמה, עבור הרשימה [1, 2, 3, 5, 1, 2] החזירו 4, כיוון ש־1 מופיע פעם אחרונה במקום 4 ברשימה.\n",
"
\n",
- "הפעם נשתמש בפעולה remove, שבניגוד לפעולה pop מוחקת איבר לפי הערך שלו ולא לפי המיקום שלו. \n",
+ "
\n",
+ "הפעם נשתמש בפעולה remove, שבניגוד לפעולה pop מוחקת איבר לפי הערך שלו ולא לפי המיקום שלו. \n",
"נשים לב שהפעולה תמחק את האיבר הראשון השווה לערך שהועבר כארגומנט, ולא את כל המופעים של אותו ערך.\n",
"
\n",
- " קבלו פונקציה שמקבלת רשימה של חיות, ומחזירה רשימה שבה אין מופעים של החיות camel, rabbit ו־pig. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " קבלו פונקציה שמקבלת רשימה של חיות, ומחזירה רשימה שבה אין מופעים של החיות camel, rabbit ו־pig. \n",
" לדוגמה, עבור הרשימה: ['camel', 'camel', 'dove', 'pig', 'camel'] תוחזר הרשימה: ['dove']\n",
- "
\n",
- "אחת הפעולות הנוחות ביותר שאפשר לבצע על רשימה היא sort, שמסדרת לנו את האיברים ברשימה. \n",
- "אם האיברים הם מחרוזות, הרשימה תסודר בסדר לקסיקוגרפי (אלפביתי). \n",
- "אם האיברים ברשימה הם מספרים (שלמים, עשרוניים או גם וגם), הרשימה תסודר מתמטית מהקטן לגדול. \n",
+ "
\n",
+ "אחת הפעולות הנוחות ביותר שאפשר לבצע על רשימה היא sort, שמסדרת לנו את האיברים ברשימה. \n",
+ "אם האיברים הם מחרוזות, הרשימה תסודר בסדר לקסיקוגרפי (אלפביתי). \n",
+ "אם האיברים ברשימה הם מספרים (שלמים, עשרוניים או גם וגם), הרשימה תסודר מתמטית מהקטן לגדול. \n",
"אם הרשימה מורכבת מסוגים שונים של איברים שאין ביניהם הגדרת שוויון ברורה (כמו מספרים ומחרוזות), פעולת הסידור תיכשל ותזרוק שגיאה.\n",
"
\n",
- " טעות נפוצה היא השמת התוצאה של sort חזרה למשתנה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " טעות נפוצה היא השמת התוצאה של sort חזרה למשתנה. \n",
" כיוון שהפעולה sort משנה את מיקום האיברים בתוך הרשימה ולא מחזירה ערך, השמה חזרה למשתנה תמחק את ערכו.\n",
"
\n",
- " תרגול:\n",
- " קבלו מהמשתמש 10 מספרים. מצאו את הערך השלישי הגדול ביותר. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "תרגול:\n",
+ " קבלו מהמשתמש 10 מספרים. מצאו את הערך השלישי הגדול ביותר. \n",
" לדוגמה, עבור הקלט הבא: 5, 1, 6, 2, 3, 4, 8, 7, 10, 9, החזירו 8.\n",
"
\n",
- "
\n",
+ "
\n",
"
"
]
},
@@ -659,24 +659,24 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### הוספת איבר במקום מסוים"
+ "### הוספת איבר במקום מסוים"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
\n",
- " תרגול:\n",
- " קראו בתיעוד של פייתון על הפעולה insert השייכת לערכים מסוג רשימה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "תרגול:\n",
+ " קראו בתיעוד של פייתון על הפעולה insert השייכת לערכים מסוג רשימה. \n",
" הוסיפו דג מימין לכריש (shark) שברשימת animals.\n",
"
\n",
- "המילה Mutable נגזרת מהמילה Mutate, והמשמעות שלה היא \"משהו בר־שינוי\". \n",
- "אנחנו נשתמש בה כדי לתאר טיפוסי נתונים שניתן לשנותם, למשל להוסיף או להחסיר מהם איברים. \n",
- "משמעות המילה Immutable היא \"משהו שאינו בר־שינוי\", נתון שאמור להישאר קבוע אחרי יצירתו. \n",
+ "
\n",
+ "המילה Mutable נגזרת מהמילה Mutate, והמשמעות שלה היא \"משהו בר־שינוי\". \n",
+ "אנחנו נשתמש בה כדי לתאר טיפוסי נתונים שניתן לשנותם, למשל להוסיף או להחסיר מהם איברים. \n",
+ "משמעות המילה Immutable היא \"משהו שאינו בר־שינוי\", נתון שאמור להישאר קבוע אחרי יצירתו. \n",
"שינוי ערך שהוא Immutable משנה את המהות שלו, ויגרום לו להיחשב ערך אחר לגמרי.\n",
"
\n",
- "נדמיין ארנק שבתוכו שטרות – ניתן להוסיף אליו שטרות או להוציא ממנו שטרות, אבל הארנק יישאר אותו ארנק. \n",
- "כיוון שניתן לשנות את המצב של הארנק בלי לפגוע במהות שלו, ניתן להגיד שארנק הוא Mutable. \n",
- "לעומת זאת, אם אקח את אחד השטרות שנמצאים בתוך הארנק, לא אוכל לשנות בו משהו בלי שאשנה את המהות שלו. \n",
- "שינוי באחד המאפיינים של השטר, כמו המספר שכתוב עליו, יגרור שינוי מהותי שיהפוך אותו לדבר אחר לחלוטין. \n",
+ "
\n",
+ "נדמיין ארנק שבתוכו שטרות – ניתן להוסיף אליו שטרות או להוציא ממנו שטרות, אבל הארנק יישאר אותו ארנק. \n",
+ "כיוון שניתן לשנות את המצב של הארנק בלי לפגוע במהות שלו, ניתן להגיד שארנק הוא Mutable. \n",
+ "לעומת זאת, אם אקח את אחד השטרות שנמצאים בתוך הארנק, לא אוכל לשנות בו משהו בלי שאשנה את המהות שלו. \n",
+ "שינוי באחד המאפיינים של השטר, כמו המספר שכתוב עליו, יגרור שינוי מהותי שיהפוך אותו לדבר אחר לחלוטין. \n",
"ניתן להגיד שהשטר הוא Immutable, בלתי ניתן לשינוי.\n",
"
\n",
- "כשאנחנו יוצרים ערך כלשהו, פייתון מקצה עבורו מקום בזיכרון המחשב ושומרת שם את הערך. \n",
- "מאותו רגע לאותו ערך יש כתובת, שהיא מספר שמייצג את המקום שבו אותו ערך נמצא בזיכרון המחשב. \n",
+ "
\n",
+ "כשאנחנו יוצרים ערך כלשהו, פייתון מקצה עבורו מקום בזיכרון המחשב ושומרת שם את הערך. \n",
+ "מאותו רגע לאותו ערך יש כתובת, שהיא מספר שמייצג את המקום שבו אותו ערך נמצא בזיכרון המחשב. \n",
"כתובת הערך נשארת זהה מרגע שהוא נוצר ועד סוף חייו.\n",
"
\n",
- "בשורה למעלה הגדרנו את הערך 9,876,543. \n",
- "אף על פי שלא עשינו עליו פעולה מתוחכמת ולא שמרנו אותו במשתנה, פייתון תשמור את הערך הזה בזיכרון המחשב. \n",
+ "
\n",
+ "בשורה למעלה הגדרנו את הערך 9,876,543. \n",
+ "אף על פי שלא עשינו עליו פעולה מתוחכמת ולא שמרנו אותו במשתנה, פייתון תשמור את הערך הזה בזיכרון המחשב. \n",
"לערך 9,876,543 יש כתובת עכשיו.\n",
"
\n",
- "בשורה הבאה \"נקשור\" את השם name לכתובת של הערך המספרי 12,345. \n",
+ "
\n",
+ "בשורה הבאה \"נקשור\" את השם name לכתובת של הערך המספרי 12,345. \n",
"המשתנה name לא באמת \"מכיל\" את הערך 12,345, אלא רק מצביע על הכתובת שבה הערך 12,345 מאוחסן.\n",
"
\n",
- "הפונקציה id מקבלת כארגומנט ערך, ומחזירה מספר שמייצג את הכתובת שלו – המיקום של הערך בזיכרון. \n",
- "בהקבלה למטאפורת הלייזר, היא מקבלת את ראש הלייזר ומראה לנו לאן הוא מצביע. \n",
+ "
\n",
+ "הפונקציה id מקבלת כארגומנט ערך, ומחזירה מספר שמייצג את הכתובת שלו – המיקום של הערך בזיכרון. \n",
+ "בהקבלה למטאפורת הלייזר, היא מקבלת את ראש הלייזר ומראה לנו לאן הוא מצביע. \n",
"נראה דוגמה:\n",
"
\n",
- "בדוגמה הגדלנו את ערך המשתנה number מ־100,000 ל־100,001. \n",
+ "
\n",
+ "בדוגמה הגדלנו את ערך המשתנה number מ־100,000 ל־100,001. \n",
"חשוב לזכור שההגדלה מ־100,000 ל־100,001 לא באמת שינתה את הערך השמור במשתנה, אלא גרמה למשתנה להצביע לכתובת אחרת של ערך אחר.\n",
"
\n",
- "
\n",
- "בשורה הראשונה ביקשנו מ־number להצביע לערך 100,000, ולכן כשהרצנו את id(number) קיבלנו את הכתובת של הערך 100,000. \n",
+ "
\n",
+ "בשורה הראשונה ביקשנו מ־number להצביע לערך 100,000, ולכן כשהרצנו את id(number) קיבלנו את הכתובת של הערך 100,000. \n",
"בשורה השנייה ביקשנו מ־number להצביע לערך 100,001, ולכן כשהרצנו את id(number) קיבלנו את הכתובת של הערך 100,001.\n",
"
\n",
- "
\n",
- " עבור שתי השורות הראשונות מודפסת הכתובת של הערך הראשון שיצרנו, 100,000. \n",
+ "
\n",
+ " עבור שתי השורות הראשונות מודפסת הכתובת של הערך הראשון שיצרנו, 100,000. \n",
" עבור שתי השורות האחרונות מודפסת הכתובת של הערך השני שיצרנו, 100,001.\n",
"
\n",
- "נבדוק אם שינוי של ערך שנמצא בתוך הרשימה יגרום לפייתון לבנות רשימה חדשה. \n",
+ "
\n",
+ "נבדוק אם שינוי של ערך שנמצא בתוך הרשימה יגרום לפייתון לבנות רשימה חדשה. \n",
"אם פייתון תבנה רשימה חדשה אחרי שינוי הערך, נוכל לראות זאת בקלות לפי השינוי במיקום של הרשימה בזיכרון.\n",
"
\n",
- "בדוגמה שינינו ערך ברשימה ששמה my_list, וראינו שהמיקום שלה לא משתנה. \n",
- "זו ההתנהגות שאנחנו מצפים לה מערך שהסוג שלו הוא Mutable – ניתן לשנות אותו מבלי להשפיע על מיקומו בזיכרון המחשב. \n",
+ "
\n",
+ "בדוגמה שינינו ערך ברשימה ששמה my_list, וראינו שהמיקום שלה לא משתנה. \n",
+ "זו ההתנהגות שאנחנו מצפים לה מערך שהסוג שלו הוא Mutable – ניתן לשנות אותו מבלי להשפיע על מיקומו בזיכרון המחשב. \n",
"
\n",
- "במקרה הזה, גרמנו ל־list2 להצביע לאותו מקום ש־list1 מצביעה עליו. \n",
+ "
\n",
+ "במקרה הזה, גרמנו ל־list2 להצביע לאותו מקום ש־list1 מצביעה עליו. \n",
"מהסיבה הזו, שינוי של list2 ישפיע גם על list1, ושינוי של list1 ישפיע גם על list2.\n",
"
\n",
- " כדי לבקש מפייתון לא להתנהג כך, צריך להגיד לה במפורש שאנחנו מעוניינים ביצירת רשימה חדשה. \n",
+ "
\n",
+ " כדי לבקש מפייתון לא להתנהג כך, צריך להגיד לה במפורש שאנחנו מעוניינים ביצירת רשימה חדשה. \n",
" ניתן לעשות את זה בקריאה לפעולה list.copy():\n",
"
\n",
"מה קרה בפועל? למה המחרוזת לא השתנתה גם מחוץ לפונקציה?\n",
"
\n",
- "
\n",
- "הערך שהועבר לפרמטר של הפונקציה היה הכתובת של s, שעכשיו גם my_string מצביע עליו. \n",
- "ברגע שביצענו את ההשמה my_string = my_string + 'Z', יצרנו באגף הימני של ההשמה ערך חדש, וביקשנו מלייזר חדש ששמו my_string להצביע לכתובת שלו. \n",
+ "
\n",
+ "הערך שהועבר לפרמטר של הפונקציה היה הכתובת של s, שעכשיו גם my_string מצביע עליו. \n",
+ "ברגע שביצענו את ההשמה my_string = my_string + 'Z', יצרנו באגף הימני של ההשמה ערך חדש, וביקשנו מלייזר חדש ששמו my_string להצביע לכתובת שלו. \n",
"המשתנה ששמו my_string מצביע כרגע לכתובת של ערך אחר, בזמן שהמשתנה s עדיין מצביע על הערך המקורי.\n",
"
\n",
- "במקרה הזה, הפונקציה לא שינתה את הערך של המחרוזת שהעברנו לה כארגומנט. \n",
- "גם אם היינו רוצים מאוד לעשות את זה – זה לא אפשרי, כיוון שמחרוזות הן immutable. \n",
+ "
\n",
+ "במקרה הזה, הפונקציה לא שינתה את הערך של המחרוזת שהעברנו לה כארגומנט. \n",
+ "גם אם היינו רוצים מאוד לעשות את זה – זה לא אפשרי, כיוון שמחרוזות הן immutable. \n",
"
\n",
- "ההתרחשות הייתה זהה למה שקרה עם מחרוזות! \n",
- "זה קרה כיוון שגם פה דרסנו את my_list כך שיצביע לרשימה חדשה שיצרנו. \n",
- "בצד ימין של ההשמה, יצרנו רשימה חדשה שמכילה את האיברים 2, 8, 20, 28, 50, 82, 126. בעצם ההשמה ביקשנו מ־my_list שבתוך הפונקציה להפנות לכתובת של הרשימה החדשה. \n",
+ "
\n",
+ "ההתרחשות הייתה זהה למה שקרה עם מחרוזות! \n",
+ "זה קרה כיוון שגם פה דרסנו את my_list כך שיצביע לרשימה חדשה שיצרנו. \n",
+ "בצד ימין של ההשמה, יצרנו רשימה חדשה שמכילה את האיברים 2, 8, 20, 28, 50, 82, 126. בעצם ההשמה ביקשנו מ־my_list שבתוך הפונקציה להפנות לכתובת של הרשימה החדשה. \n",
"ננסה להשתמש בפעולה של צירוף איבר חדש לרשימה, list.append(item), שעליה למדנו השבוע:\n",
"
\n",
- "הצלחנו! \n",
- "הרשימה השתנתה גם בתוך הפונקציה וגם מחוצה לה. \n",
- "אפשר ללמוד מהדוגמה הזו שכשאנחנו מבצעים השמה לשם משתנה מסוים, אנחנו משנים את הכתובת שאליה הצביע שם המשתנה לכתובת חדשה, ולא עורכים את תוכן משתנה. \n",
+ "
\n",
+ "הצלחנו! \n",
+ "הרשימה השתנתה גם בתוך הפונקציה וגם מחוצה לה. \n",
+ "אפשר ללמוד מהדוגמה הזו שכשאנחנו מבצעים השמה לשם משתנה מסוים, אנחנו משנים את הכתובת שאליה הצביע שם המשתנה לכתובת חדשה, ולא עורכים את תוכן משתנה. \n",
"
"
]
},
@@ -574,16 +573,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### כתיבת פונקציה כראוי"
+ "### כתיבת פונקציה כראוי"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "כשלמדנו פונקציות, הדגשנו את העובדה שפונקציה היא קטע קוד עצמאי. \n",
- "ככזו, פונקציה בדרך כלל לא תשנה ערכים של משתנים שלא היא הגדירה. \n",
+ "
\n",
+ "כשלמדנו פונקציות, הדגשנו את העובדה שפונקציה היא קטע קוד עצמאי. \n",
+ "ככזו, פונקציה בדרך כלל לא תשנה ערכים של משתנים שלא היא הגדירה. \n",
"לדוגמה, קטע הקוד שמופיע למעלה ועורך את המשתנה l שהוגדר מחוץ לפונקציה, נחשב להרגל רע.\n",
"
\n",
- " ברוח השיעור על העובדה שרשימות הן Mutable, הגיע הזמן להכיר את \"האח דל התקציב\" שלהן: tuple. \n",
+ "
\n",
+ " ברוח השיעור על העובדה שרשימות הן Mutable, הגיע הזמן להכיר את \"האח דל התקציב\" שלהן: tuple. \n",
" סוג הנתונים tuple לא מרגש במיוחד – הוא למעשה סוג של רשימה שאי־אפשר לשנות. רשימה שהיא immutable, אם תרצו.\n",
"
\n",
- " תרגול:\n",
- " כתבו פונקצייה שמשתמשת ב־dir(), ומחזירה את כל הפעולות שיש ב־list ואין ב־tuple. \n",
- " בדקו גם אילו פעולות יש ב־tuple ואין ב־list. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "תרגול:\n",
+ " כתבו פונקצייה שמשתמשת ב־dir(), ומחזירה את כל הפעולות שיש ב־list ואין ב־tuple. \n",
+ " בדקו גם אילו פעולות יש ב־tuple ואין ב־list. \n",
" בשתי ההשוואות, התעלמו מפעולות ששמן מתחיל בתו קו תחתון.\n",
"
נכפיל את הערך שקיבלנו במיקום של האות הבאה במחרוזת.\n",
+ "\n",
+ "
נאתחל משתנה עזר בשם hash כך שערכו יהיה 1.
\n",
+ "
עבור כל אות במחרוזת:
\n",
+ "\n",
+ "
נחשב את ord(letter) ונכפיל במשתנה העזר hash.
\n",
+ "
נכפיל את הערך שקיבלנו במיקום של האות הבאה במחרוזת.\n",
"
לתוצאה הזו נבצע מודולו 397,643, ונשמור על hash.
\n",
- " \n",
- "
כדי שהפלט תמיד יהיה באורך זהה, נשתמש במודולו 100,297 על התוצאה (חשבו: איך מודולו גורם לזה לקרות?)
\n",
+ "
\n",
+ "
כדי שהפלט תמיד יהיה באורך זהה, נשתמש במודולו 100,297 על התוצאה (חשבו: איך מודולו גורם לזה לקרות?)
\n",
"\n",
- "
\n",
+ "
\n",
"פונקציית הגיבוב שיצרנו מחזירה תמיד ערכים באורך קבוע (בין 0 ל־100,297), כפי שפונקציית גיבוב צריכה להחזיר (לאו דווקא באורך זה, אבל הפלט חייב להיות באורך קבוע).\n",
"
\n",
- " שימו לב שזוהי פונקציית גיבוב מומצאת. \n",
- " לעולם לא נשתמש בפונקציות גיבוב שהמצאנו בסביבות אמיתיות שאנחנו מתכנתים(!), משום שדבר כזה יסכן בוודאות את המשתמשים במערכת. \n",
+ "
\n",
+ " שימו לב שזוהי פונקציית גיבוב מומצאת. \n",
+ " לעולם לא נשתמש בפונקציות גיבוב שהמצאנו בסביבות אמיתיות שאנחנו מתכנתים(!), משום שדבר כזה יסכן בוודאות את המשתמשים במערכת. \n",
" זה עולם שלם שנחקר רבות, ואנחנו תמיד נשתמש רק בפונקציות גיבוב שנחקרו במוסדות הרלוונטיים ופורסמו מטעמם.\n",
"
\n",
- " את הלוח נייצג באמצעות רשימה של רשימות. \n",
- " כל רשימה תייצג שורה בלוח שלנו: הרשימה במיקום 0 תייצג את השורה הראשונה בלוח, הרשימה בשורה 1 את השורה השנייה וכך הלאה. \n",
+ "
\n",
+ " את הלוח נייצג באמצעות רשימה של רשימות. \n",
+ " כל רשימה תייצג שורה בלוח שלנו: הרשימה במיקום 0 תייצג את השורה הראשונה בלוח, הרשימה בשורה 1 את השורה השנייה וכך הלאה. \n",
" הרשימות המייצגות את השורות יהיו רשימות של תווים, כאשר בכל תא יהיה אחד מבין התווים האפשריים – 'O', 'X' או '-'\n",
"
\n",
" תחילה נממש פונקציה המקבלת את הלוח ובודקת אם יש מנצח כלשהו \n",
" (X או O),\n",
" ומחזירה את האות של המנצח\n",
" ('X' או 'O')\n",
" אם יש מנצח, או '' (מחרוזת ריקה) אחרת.\n",
"
\n",
- "
\n",
+ "
\n",
"חִשבו אילו בדיקות נידרש לבצע כדי למצוא אם יש בלוח מצב של ניצחון. ממשו את הפונקציה check_board(board) כך שתשתמש בכמה שיותר פונקציות עזר.\n",
"
\n",
- " לפני שתמשיכו הלאה, חשוב לוודא שהפונקציה שכתבתם עובדת, לכן נכתוב עבורה סדרה של בדיקות. \n",
+ "
\n",
+ " לפני שתמשיכו הלאה, חשוב לוודא שהפונקציה שכתבתם עובדת, לכן נכתוב עבורה סדרה של בדיקות. \n",
" כתבו בדיקות עבור המקרים הבאים:\n",
"
\n",
- "\n",
- "
\n",
- "
ניצחון באלכסון הראשי (שמאל למעלה–ימין למטה).
\n",
- "
ניצחון באלכסון המשני (ימין למעלה–שמאל למטה).
\n",
- "
ניצחון בכל אחד מהטורים.
\n",
- "
ניצחון בכל אחת מהשורות.
\n",
- "
לוח מלא ללא ניצחון.
\n",
- "
לוח לא מלא ללא ניצחון (במקומות לא מסומנים יופיע הסימן '-').
\n",
+ "
\n",
+ "
ניצחון באלכסון הראשי (שמאל למעלה–ימין למטה).
\n",
+ "
ניצחון באלכסון המשני (ימין למעלה–שמאל למטה).
\n",
+ "
ניצחון בכל אחד מהטורים.
\n",
+ "
ניצחון בכל אחת מהשורות.
\n",
+ "
לוח מלא ללא ניצחון.
\n",
+ "
לוח לא מלא ללא ניצחון (במקומות לא מסומנים יופיע הסימן '-').
\n",
"
\n",
- "\n",
- "
\n",
+ "
\n",
" בסך הכול תצטרכו לכתוב 10 בדיקות. בכל בדיקה הפעילו את הפונקציה שלכם check_board(board) על לוח כפי שמתואר ובדקו אם הפלט שמוחזר תואם לפלט שציפיתם לקבל.\n",
"
\n",
- " במהלך המשחק אנו נקלוט מהשחקנים במשחק (המשתמשים) את המקומות בלוח, שבהם הם ירצו למקם את האות שלהם. \n",
- " מקומות אלו יהיו שני מספרים בתחום 0–2 המציינים את השורה והעמודה שבה יש למקם את האות. \n",
+ "
\n",
+ " במהלך המשחק אנו נקלוט מהשחקנים במשחק (המשתמשים) את המקומות בלוח, שבהם הם ירצו למקם את האות שלהם. \n",
+ " מקומות אלו יהיו שני מספרים בתחום 0–2 המציינים את השורה והעמודה שבה יש למקם את האות. \n",
" לדוגמה, עבור:\n",
"
\n",
- "\n",
"1 2\n",
- "\n",
- "
\n",
+ "
\n",
" נמקם את האות המתאימה לשחקן, נניח X, בשורה 1 ובעמודה 2, כך:\n",
"
\n",
- " כעת כתבו פונקציה המקבלת את הלוח ואת האות שמייצגת את השחקן ('X' או 'O'). כמו כן, הפונקציה תקלוט מהמשתמש שני מספרים. \n",
- " הפונקציה תבדוק אם התנאים הבאים מתקיימים, ואם הם מתקיימים היא תמקם את האות הנתונה במיקום המבוקש, ותעדכן את הלוח: \n",
+ "
\n",
+ " כעת כתבו פונקציה המקבלת את הלוח ואת האות שמייצגת את השחקן ('X' או 'O'). כמו כן, הפונקציה תקלוט מהמשתמש שני מספרים. \n",
+ " הפונקציה תבדוק אם התנאים הבאים מתקיימים, ואם הם מתקיימים היא תמקם את האות הנתונה במיקום המבוקש, ותעדכן את הלוח: \n",
"
\n",
- "\n",
- "
\n",
- "
מספר השורה הוא בין 0 ל־2.
\n",
- "
מספר העמודה הוא בין 0 ל־2.
\n",
- "
המקום המבוקש לא תפוס על ידי אות כלשהי (כלומר יש בו '-').
\n",
+ "
\n",
+ "
מספר השורה הוא בין 0 ל־2.
\n",
+ "
מספר העמודה הוא בין 0 ל־2.
\n",
+ "
המקום המבוקש לא תפוס על ידי אות כלשהי (כלומר יש בו '-').
\n",
"
\n",
- "\n",
- "
\n",
- " שימו לב, עליכם לחייב את המשתמש להכניס ערכים חוקיים. כלומר, המשחק לא ימשיך עד שיתקבל קלט תקין (חשבו על דרך שבה התוכנית תמשיך לבקש מהמשתמש ערכים עד שיוכנסו ערכים חוקיים). \n",
+ "
\n",
+ " שימו לב, עליכם לחייב את המשתמש להכניס ערכים חוקיים. כלומר, המשחק לא ימשיך עד שיתקבל קלט תקין (חשבו על דרך שבה התוכנית תמשיך לבקש מהמשתמש ערכים עד שיוכנסו ערכים חוקיים). \n",
" כאשר נגלה בשלב מוקדם יותר שהלוח לא ניתן יותר למילוי – המשחק יסתיים.\n",
"
\n",
- " כאמור המשחק ממשיך כל עוד אין מנצח ונותר מקום פנוי בלוח. \n",
- " נשים לב כי מספר המהלכים החוקיים יכול להיות לכל היותר כגודל הלוח. \n",
- " כלומר – אם לא הוכרז מנצח במהלך המשחק, המשחק ייגמר לאחר 9 מהלכים עבור לוח בגודל $3\\times3$. \n",
- " נספור כמה מהלכים חוקיים יש במשחק. עבור מספרי מהלך זוגיים (0, 2, 4, ...) ישחק השחקן O, ועבור מספרי מהלך אי־זוגיים ישחק השחקן X. \n",
- " נתאר את מהלך המשחק בפסאודו־קוד: \n",
+ "
\n",
+ " כאמור המשחק ממשיך כל עוד אין מנצח ונותר מקום פנוי בלוח. \n",
+ " נשים לב כי מספר המהלכים החוקיים יכול להיות לכל היותר כגודל הלוח. \n",
+ " כלומר – אם לא הוכרז מנצח במהלך המשחק, המשחק ייגמר לאחר 9 מהלכים עבור לוח בגודל $3\\times3$. \n",
+ " נספור כמה מהלכים חוקיים יש במשחק. עבור מספרי מהלך זוגיים (0, 2, 4, ...) ישחק השחקן O, ועבור מספרי מהלך אי־זוגיים ישחק השחקן X. \n",
+ " נתאר את מהלך המשחק בפסאודו־קוד: \n",
"
\n",
- "\n",
- "
אתחל את מונה המהלכים ל־0.
\n",
- "
כל עוד אין מנצח וגם הלוח לא מלא:\n",
+ "\n",
+ "
אתחל את מונה המהלכים ל־0.
\n",
+ "
כל עוד אין מנצח וגם הלוח לא מלא:\n",
"
\n",
- "
אם מספר המהלך זוגי – בצע מהלך שחקן O.
\n",
- "
אם מספר המהלך אי־זוגי – בצע מהלך שחקן X.
\n",
- "
\n",
- "
\n",
- "
הגדל את מונה המהלכים ב־1.
\n",
- "
אם יש ניצחון – הכרז על המנצח, אחרת הכרז תיקו.
\n",
+ "
אם מספר המהלך זוגי – בצע מהלך שחקן O.
\n",
+ "
אם מספר המהלך אי־זוגי – בצע מהלך שחקן X.
\n",
+ "
\n",
+ "
\n",
+ "
הגדל את מונה המהלכים ב־1.
\n",
+ "
אם יש ניצחון – הכרז על המנצח, אחרת הכרז תיקו.
\n",
"\n",
- "
\n",
+ "
\n",
" ממשו את המשחק על פי הפונקציות שיצרתם ועל פי תיאור מהלך המשחק.\n",
"
\n",
- " מנהלי הבנק היו מרוצים מאוד מהתוכנה הקודמת לניהול בנק שכתבתם וכעת הם מעוניינים לשפר אותה. \n",
- " תחילה הם הביעו דאגה מחוזק הסיסמאות. מנגנון הסיסמאות הקודם היה חלש ומנהלי הבנק מפחדים שייעשה בו שימוש לרעה. \n",
+ "
\n",
+ " מנהלי הבנק היו מרוצים מאוד מהתוכנה הקודמת לניהול בנק שכתבתם וכעת הם מעוניינים לשפר אותה. \n",
+ " תחילה הם הביעו דאגה מחוזק הסיסמאות. מנגנון הסיסמאות הקודם היה חלש ומנהלי הבנק מפחדים שייעשה בו שימוש לרעה. \n",
" שמועות מתפשטות מהר מאוד ומנהלי הבנק שמעו שמימשתם גרסה לפונקציית גיבוב. הם מעוניינים להשתמש בה במנגנון הסיסמאות החדש.\n",
"
\n",
- "\n",
- "
\n",
+ "
\n",
" מנגנון הסיסמאות ינוהל כך:\n",
"
\n",
- "\n",
- "\n",
- "
הבנק ינהל קובץ סיסמאות שייקרא bank_passwd.txt.
\n",
- "
כאשר משתמש יפתח חשבון בנק, הוא יכניס את הסיסמה שהוא מעוניין שתשמש אותו בהתחברות הבאה.
\n",
- "
נחשב את ה־hash של הסיסמה הזו באמצעות פונקציית ה־hash שכתבנו בתחילת מחברת זו.
\n",
- "
הבנק ישמור את שם המשתמש ותוצאת ה־hash בקובץ הסיסמאות בצורה קבועה מראש.
\n",
+ "\n",
+ "
הבנק ינהל קובץ סיסמאות שייקרא bank_passwd.txt.
\n",
+ "
כאשר משתמש יפתח חשבון בנק, הוא יכניס את הסיסמה שהוא מעוניין שתשמש אותו בהתחברות הבאה.
\n",
+ "
נחשב את ה־hash של הסיסמה הזו באמצעות פונקציית ה־hash שכתבנו בתחילת מחברת זו.
\n",
+ "
הבנק ישמור את שם המשתמש ותוצאת ה־hash בקובץ הסיסמאות בצורה קבועה מראש.
\n",
"\n",
- "\n",
- "
\n",
- " כל סיסמה של משתמש תישמר בקובץ בצורה: username:62242, \n",
+ "
\n",
+ " כל סיסמה של משתמש תישמר בקובץ בצורה: username:62242, \n",
" כאשר username הוא שם המשתמש שנרשם בפתיחת החשבון, ו־62242 הוא תוצאת ה־hash עבור הסיסמה שבחר.\n",
"
"
]
@@ -658,16 +610,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### פתיחת חשבון בנק"
+ "### פתיחת חשבון בנק"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
בסעיף זה נממש את פונקציית פתיחת חשבון הבנק. \n",
- " הפונקציה תקבל שם משתמש וסיסמה, ותיצור רשומה חדשה בקובץ הסיסמאות עבור המשתמש שביקש להצטרף לבנק. \n",
- " כיוון שהבנק שלנו לא עבר לעבוד עם מספרי חשבון, עלינו לוודא ששם המשתמש שנבחר לא קיים כבר בבנק. אם קיים כזה, נדפיס שגיאה ולא נבצע דבר. \n",
+ "
בסעיף זה נממש את פונקציית פתיחת חשבון הבנק. \n",
+ " הפונקציה תקבל שם משתמש וסיסמה, ותיצור רשומה חדשה בקובץ הסיסמאות עבור המשתמש שביקש להצטרף לבנק. \n",
+ " כיוון שהבנק שלנו לא עבר לעבוד עם מספרי חשבון, עלינו לוודא ששם המשתמש שנבחר לא קיים כבר בבנק. אם קיים כזה, נדפיס שגיאה ולא נבצע דבר. \n",
" אם לא קיים שם משתמש כזה, נחשב את ה־hash של הסיסמה שהזין, ונוסיף לסוף הקובץ רשומה חדשה בייצוג שצוין בתחילת השאלה.\n",
"
\n",
- " בעקבות השיפור במנגנון חוזק הסיסמאות, הצטרפו לקוחות רבים לבנק. \n",
+ "
\n",
+ " בעקבות השיפור במנגנון חוזק הסיסמאות, הצטרפו לקוחות רבים לבנק. \n",
" המנהלים מרוצים וכעת רוצים שתממשו עבורם מערכת הזדהות שעובדת עם קובץ הסיסמאות.\n",
"
\n",
- "\n",
- "
\n",
+ "
\n",
" מערכת ההזדהות תעבוד כך:\n",
"
\n",
- "\n",
- "
\n",
- "
הלקוח יזין שם משתמש וסיסמה.\n",
+ "
\n",
+ "
הלקוח יזין שם משתמש וסיסמה.\n",
"
\n",
- "
אם המשתמש לא קיים, נדפיס Account not registered, ונסיים.
\n",
- "
אם הלקוח קיים, אך הסיסמה שהזין שגויה – יש ללקוח עוד 2 נסיונות להזין סיסמה נכונה.
\n",
- "
\n",
- "
\n",
- "
למשתמש ינתנו 3 ניסיונות בסך הכול להכניס סיסמה נכונה.\n",
+ "
אם המשתמש לא קיים, נדפיס Account not registered, ונסיים.
\n",
+ "
אם הלקוח קיים, אך הסיסמה שהזין שגויה – יש ללקוח עוד 2 נסיונות להזין סיסמה נכונה.
\n",
+ "
\n",
+ "
\n",
+ "
למשתמש ינתנו 3 ניסיונות בסך הכול להכניס סיסמה נכונה.\n",
"
\n",
- "
אם הזין סיסמה שגויה בשלושתם – הרשומה שלו תימחק מקובץ הסיסמאות, ויהיה עליו להירשם מחדש בעתיד.
\n",
- "
אחרת, הזיהוי הצליח.
\n",
- "
\n",
- "
\n",
+ "
אם הזין סיסמה שגויה בשלושתם – הרשומה שלו תימחק מקובץ הסיסמאות, ויהיה עליו להירשם מחדש בעתיד.
\n",
+ "
אחרת, הזיהוי הצליח.
\n",
+ "
\n",
+ "\n",
"
\n",
- "\n",
- "
\n",
- " מערכת ההזדהות הינה פונקציה המקבלת שם משתמש וסיסמה. \n",
+ "
\n",
+ " מערכת ההזדהות הינה פונקציה המקבלת שם משתמש וסיסמה. \n",
" היא מחזירה True אם הזיהוי הצליח, ו־False אחרת.\n",
"
\n",
- " מה משותף לכל הבעיות שהוצגו למעלה? \n",
- " דרך ראויה לפתור אותן היא בעזרת לולאה שתעבור על כל האיברים שהוצגו בבעיה, ותבצע על כל איבר סדרת פעולות. \n",
+ "
\n",
+ " מה משותף לכל הבעיות שהוצגו למעלה? \n",
+ " דרך ראויה לפתור אותן היא בעזרת לולאה שתעבור על כל האיברים שהוצגו בבעיה, ותבצע על כל איבר סדרת פעולות. \n",
" נכתוב בפסאודו־קוד דוגמה לפתרון הבעיה הראשונה – מציאת הגובה של התלמיד הגבוה ביותר בכיתה:\n",
"
\n",
- " ממשו פונקציה שמקבלת רשימת גבהים של האנשים בכיתה, ומחזירה את הגובה של התלמיד הגבוה ביותר. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " ממשו פונקציה שמקבלת רשימת גבהים של האנשים בכיתה, ומחזירה את הגובה של התלמיד הגבוה ביותר. \n",
" לדוגמה, עבור הרשימה [1.50, 1.84, 1.73, 1.51] החזירו 1.84.\n",
"
\n",
- " עד כה, אחד מהשימושים הנפוצים שעשינו בלולאת while היה לעבור על איברים ברשימה באמצעות מיקום. \n",
- " הקוד שכתבתם בתרגול למעלה, שבו הייתם צריכים לעבור על גובהי התלמידים, זה אחר זה, הוא דוגמה טובה לכך. \n",
+ "
\n",
+ " עד כה, אחד מהשימושים הנפוצים שעשינו בלולאת while היה לעבור על איברים ברשימה באמצעות מיקום. \n",
+ " הקוד שכתבתם בתרגול למעלה, שבו הייתם צריכים לעבור על גובהי התלמידים, זה אחר זה, הוא דוגמה טובה לכך. \n",
" ייתכן שהקוד שלכם דומה לקוד שאני כתבתי לפתרון התרגיל הזה:\n",
"
\n",
- " הלולאה שמופיעה תעבור על מספרי התאים ברשימה ותבדוק את התוכן שלהם. \n",
+ "
\n",
+ " הלולאה שמופיעה תעבור על מספרי התאים ברשימה ותבדוק את התוכן שלהם. \n",
" עד כה, פעמים רבות השימוש שלנו בלולאות היה לצורך מעבר על כל האיברים של iterable כלשהו.\n",
"
\n",
- "בפעמים שבהן אנחנו רוצים לבצע דבר מה עבור כל אחד מהאיברים במבנה כלשהו, נשתמש בלולאת for. \n",
+ "
\n",
+ "בפעמים שבהן אנחנו רוצים לבצע דבר מה עבור כל אחד מהאיברים במבנה כלשהו, נשתמש בלולאת for. \n",
"נראה, לדוגמה, איך נשתמש בלולאת while כדי להדפיס את שמותיהן של כל התלמידות בכיתה:\n",
"
\n",
- " כמה מקטעי הקוד הבאים לא ירוצו, כיוון שחלק מהקוד מסומן בהערה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " כמה מקטעי הקוד הבאים לא ירוצו, כיוון שחלק מהקוד מסומן בהערה. \n",
" המטרה של קטעי הקוד בחלק הזה של המחברת היא להדגיש איזה קוד רץ באותו רגע.\n",
"
\n",
- "בחזרור הראשון, המשתנה החדש שיצרנו, בשם student_name, יצביע על הערך הראשון ברשימה, Galia. \n",
+ "
\n",
+ "בחזרור הראשון, המשתנה החדש שיצרנו, בשם student_name, יצביע על הערך הראשון ברשימה, Galia. \n",
"נשים לב שהמשתנה student_name לא היה קיים לפני הלולאה, והלולאה היא המבנה הקסום שיוצר את המשתנה וגורם לו להצביע לערכים:\n",
"
\n",
- " שנו את הקוד שכתבתם למציאת האדם הגבוה ביותר בכיתה, כך שישתמש ב־for ולא ב־while. \n",
- " טיפ: השתמשו בפסאודו־קוד שהוצג לפני כן, והשוו בין ה־for לבין ה־while בדוגמה של הדפסת שמות התלמידים. \n",
- "
\n",
- "
\n",
- "
\n",
- "
\n",
- " חשוב! \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " שנו את הקוד שכתבתם למציאת האדם הגבוה ביותר בכיתה, כך שישתמש ב־for ולא ב־while. \n",
+ " טיפ: השתמשו בפסאודו־קוד שהוצג לפני כן, והשוו בין ה־for לבין ה־while בדוגמה של הדפסת שמות התלמידים. \n",
+ "
\n",
- "בשלב הנוכחי בקורס, תמיד נוכל להשתמש בלולאת while במקום בלולאת for, אך לא תמיד נוכל להחליף לולאות for בלולאות while. \n",
- "באופן כללי, לולאות while יכולות להוכיח את עצמן כשימושיות מאוד מפעם לפעם. \n",
+ "
\n",
+ "בשלב הנוכחי בקורס, תמיד נוכל להשתמש בלולאת while במקום בלולאת for, אך לא תמיד נוכל להחליף לולאות for בלולאות while. \n",
+ "באופן כללי, לולאות while יכולות להוכיח את עצמן כשימושיות מאוד מפעם לפעם. \n",
"חשבו, לדוגמה, על מצב שבו אתם צריכים לקבל מהמשתמש קלט חדש כל עוד הקלט שלו לא תקין.\n",
"
\n",
- "בתחרות המרוצים \"פורלולה 1\", שבה משתתפות בקביעות 6 מכוניות מרוץ, אפשר להמר על הסדר שבו יגיעו המכוניות לקו הסיום. \n",
- "משתתף זוכה הוא משתתף שהצליח לנחש נכונה את סדר ההגעה של המכוניות לקו הסיום, עם לא יותר מ־2 טעויות. \n",
+ "
\n",
+ "בתחרות המרוצים \"פורלולה 1\", שבה משתתפות בקביעות 6 מכוניות מרוץ, אפשר להמר על הסדר שבו יגיעו המכוניות לקו הסיום. \n",
+ "משתתף זוכה הוא משתתף שהצליח לנחש נכונה את סדר ההגעה של המכוניות לקו הסיום, עם לא יותר מ־2 טעויות. \n",
"כתבו פונקציה שמקבלת הימור בודד ואת סדר ההגעה של המכוניות במרוץ, והחזירו אם ההימור זכה או הפסיד. \n",
"
\n",
- "\n",
- "
\n",
- "לדוגמה, במרוץ האחרון סדר ההגעה לקו הסיום היה: \n",
+ "
\n",
+ "לדוגמה, במרוץ האחרון סדר ההגעה לקו הסיום היה: \n",
"[1, 2, 3, 4, 5, 6]\n",
"
\n",
- "\n",
- "
\n",
- "הנה דוגמאות להימורים של משתתפים ולתוצאתם: \n",
+ "
\n",
+ "הנה דוגמאות להימורים של משתתפים ולתוצאתם: \n",
"
\n",
- " כתבו לולאת for שתדפיס עבור כל זוג מחרוזות ברשימה: Flip \"X\" to get \"Y\". \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " כתבו לולאת for שתדפיס עבור כל זוג מחרוזות ברשימה: Flip \"X\" to get \"Y\". \n",
" לדוגמה, עבור הזוג האחרון מתוך 4 הזוגות, היא תדפיס: Flip \"ekans\" to get \"snake\".\n",
"
\n",
- "נבחן דרך נוספת לפתור את התרגיל, רק שהפעם נשתמש בטריק שנקרא unpacking (או \"פירוק\"). \n",
+ "
\n",
+ "נבחן דרך נוספת לפתור את התרגיל, רק שהפעם נשתמש בטריק שנקרא unpacking (או \"פירוק\"). \n",
"כיוון שכל tuple ברשימת words מכיל בדיוק 2 איברים, נוכל לתת להם שמות כבר בראש הלולאה ולחלץ אותם מה־tuple:\n",
"
\n",
- "בכל חזרור של הלולאה שכתובה למעלה, ה־for יעבור על tuple בודד מתוך words, בדיוק כמו שקרה עד עכשיו. \n",
- "השינוי הוא שבמקום שה־tuple יישמר כמו שהוא במשתנה בודד שהוגדר בראש הלולאה, הערכים שבו \"יחולצו\" למשתנים בראש הלולאה. \n",
+ "
\n",
+ "בכל חזרור של הלולאה שכתובה למעלה, ה־for יעבור על tuple בודד מתוך words, בדיוק כמו שקרה עד עכשיו. \n",
+ "השינוי הוא שבמקום שה־tuple יישמר כמו שהוא במשתנה בודד שהוגדר בראש הלולאה, הערכים שבו \"יחולצו\" למשתנים בראש הלולאה. \n",
"הטריק הזה עובד כיוון שבראש הלולאה כתבנו מספר משתנים שזהה למספר הערכים שנמצאים בכל tuple.\n",
"
\n",
- "לפניכם תרשים המתאר את תוכן המשתנה words. \n",
- "הטבלה הגדולה מייצגת את הרשימה words, וכל אחד מהתאים שבה מייצג tuple בתוך הרשימה. \n",
+ "
\n",
+ "לפניכם תרשים המתאר את תוכן המשתנה words. \n",
+ "הטבלה הגדולה מייצגת את הרשימה words, וכל אחד מהתאים שבה מייצג tuple בתוך הרשימה. \n",
"בכל חזרור של ה־for המופיע למעלה, המשתנה word יקבל ערך שמסומן באדום, והמשתנה reversed_word יקבל את הערך הירוק התואם לו. \n",
"
"
]
},
@@ -1046,15 +1042,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### שינויים בתוך הלולאה"
+ "### שינויים בתוך הלולאה"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "בדרך כלל נעדיף להימנע משינוי רשימה בזמן ביצוע לולאת for. \n",
+ "
\n",
+ "בדרך כלל נעדיף להימנע משינוי רשימה בזמן ביצוע לולאת for. \n",
"שינויים כאלו עלולים לגרום להתנהגות בלתי צפויה, ללולאות אין־סופיות ולקוד קשה במיוחד לקריאה.\n",
"
"
]
@@ -1063,14 +1059,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "#### שינוי של מספר האיברים ברשימה בזמן ריצת הלולאה"
+ "#### שינוי של מספר האיברים ברשימה בזמן ריצת הלולאה"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
+ "
\n",
" נבחן את קטע הקוד הבא, שעבור כל איבר ברשימה, מוציא איבר מסוף הרשימה:\n",
"
\n",
- " הלולאה הסתיימה מוקדם מהרגיל, כיוון שכשניסתה להגיע לתא שערכו 'd' הוא כבר לא היה שם. \n",
+ "
\n",
+ " הלולאה הסתיימה מוקדם מהרגיל, כיוון שכשניסתה להגיע לתא שערכו 'd' הוא כבר לא היה שם. \n",
" קוד שכזה אינו צפוי, קשה לקריאה ויוצר תקלים. מומלץ מאוד לא לשנות את מספר האיברים ב־iterable בזמן הריצה.\n",
"
\n",
- " כדי להבין למה זה קרה, ננסה להיזכר בשיעור על mutability. \n",
- " במהלך כל חזרור, המשתנה num מקבל ערך כלשהו להצביע עליו. \n",
+ "
\n",
+ " כדי להבין למה זה קרה, ננסה להיזכר בשיעור על mutability. \n",
+ " במהלך כל חזרור, המשתנה num מקבל ערך כלשהו להצביע עליו. \n",
" לדוגמה, בחזרור הראשון numמצביע על numbers[0], המקום הראשון ברשימה:\n",
"
\n",
- " נסכם כך: המשתנה num הצביע תחילה על מספר שנמצא בתוך הרשימה, ועכשיו הוא מצביע על מספר אחר. \n",
- " ההשמה, כרגיל, שינתה את המקום שעליו המשתנה מצביע, ולא את הערך שהמשתנה מצביע עליו. \n",
+ "
\n",
+ " נסכם כך: המשתנה num הצביע תחילה על מספר שנמצא בתוך הרשימה, ועכשיו הוא מצביע על מספר אחר. \n",
+ " ההשמה, כרגיל, שינתה את המקום שעליו המשתנה מצביע, ולא את הערך שהמשתנה מצביע עליו. \n",
" בקוד שמתואר למעלה, לא שינינו את האיבר בתוך הרשימה.\n",
"
\n",
- "אקרוסטיכון הוא אמצעי ספרותי שבו משתמשים בכתיבת שירה. \n",
- "בשיר שבו יש אקרוסטיכון, כשנחבר את האות הראשונה בכל השורות, נקבל מסר מסוים. \n",
+ "
\n",
+ "אקרוסטיכון הוא אמצעי ספרותי שבו משתמשים בכתיבת שירה. \n",
+ "בשיר שבו יש אקרוסטיכון, כשנחבר את האות הראשונה בכל השורות, נקבל מסר מסוים. \n",
"ניקח לדוגמה את שירו של אדגר אלן פו, \"אקרוסטיכון\", שאותו הוא הקדיש ללטישיה אליזבת' לאנדון ובו מופיע האקרוסטיכון ELIZABETH:\n",
"
\n",
- " Elizabeth it is in vain you say \n",
- " Love not — thou sayest it in so sweet a way: \n",
- " In vain those words from thee or L.E.L. \n",
- " Zantippe's talents had enforced so well: \n",
- " Ah! if that language from thy heart arise, \n",
- " Breath it less gently forth — and veil thine eyes. \n",
- " Endymion, recollect, when Luna tried \n",
- " To cure his love — was cured of all beside — \n",
- " His follie — pride — and passion — for he died. \n",
+ "
\n",
+ "Elizabeth it is in vain you say \n",
+ "Love not — thou sayest it in so sweet a way: \n",
+ "In vain those words from thee or L.E.L. \n",
+ "Zantippe's talents had enforced so well: \n",
+ "Ah! if that language from thy heart arise, \n",
+ "Breath it less gently forth — and veil thine eyes. \n",
+ "Endymion, recollect, when Luna tried \n",
+ "To cure his love — was cured of all beside — \n",
+ "His follie — pride — and passion — for he died. \n",
"
\n",
- " שנים רבות חלפו מאז אותם ימי הקיץ בשדות השעורה, והזמרת סיגנט שכחה היכן החביאה את הזהב שלה. \n",
- " בידי סיגנט יש מפה, לפיה היא נמצאת כרגע בנקודה (0, 0) בשדה החיטה. \n",
- " המפה מתארת אילו צעדים היא צריכה לעשות כדי להגיע למטמון. \n",
+ "
\n",
+ " שנים רבות חלפו מאז אותם ימי הקיץ בשדות השעורה, והזמרת סיגנט שכחה היכן החביאה את הזהב שלה. \n",
+ " בידי סיגנט יש מפה, לפיה היא נמצאת כרגע בנקודה (0, 0) בשדה החיטה. \n",
+ " המפה מתארת אילו צעדים היא צריכה לעשות כדי להגיע למטמון. \n",
" עזרו לסיגנט לחשב: בהינתן שהיא תלך לפי כל הצעדים שמופיעים במפה – באיזו נקודה יימצא המטמון?\n",
"
\n",
- "
\n",
+ "
\n",
" לדוגמה: עבור הצעדים [(1, 5), (6, -2), (4, 3)] יוחזר שהמטמון נמצא בנקודה (11, 6).\n",
"
\n",
- "
\n",
- " הסבר מורחב: קבלו רשימה של צעדים המורים לסיגנט כיצד ללכת. \n",
- " כל \"צעד\" מורכב מזוג מספרים שלמים, שיכולים להיות שליליים – הראשון מסמל כמה צעדים ללכת ימינה, והשני מסמל כמה צעדים ללכת למעלה. \n",
- " אם המספר הראשון שלילי, עליה ללכת את מספר הצעדים הזה שמאלה. אם המספר השני שלילי, עליה ללכת את מספר הצעדים הזה למטה. \n",
+ "
\n",
+ "הסבר מורחב: קבלו רשימה של צעדים המורים לסיגנט כיצד ללכת. \n",
+ " כל \"צעד\" מורכב מזוג מספרים שלמים, שיכולים להיות שליליים – הראשון מסמל כמה צעדים ללכת ימינה, והשני מסמל כמה צעדים ללכת למעלה. \n",
+ " אם המספר הראשון שלילי, עליה ללכת את מספר הצעדים הזה שמאלה. אם המספר השני שלילי, עליה ללכת את מספר הצעדים הזה למטה. \n",
" כתבו פונקציה שמקבלת רשימה של צעדים ומחזירה את מיקום המטמון.\n",
"
\n",
- " בגבעת ווטרשיפ קצב ההתרבות גבוה. בכל שנה נוספים עוד ועוד ארנבים לארנבייה. \n",
- " חומש הארנב החליט לנהל מעקב דמוגרפי אחרי הגידול. \n",
- " הוא מעוניין שתבנו לו פונקציה שמקבלת כפרמטר רשימה של מספר הארנבים שנולדו בכל שנה. \n",
- " הפונקציה תחזיר רשימה שבה כל תא מייצג את הכמות הנצברת של הארנבים בארנבייה עד כה. \n",
+ "
\n",
+ " בגבעת ווטרשיפ קצב ההתרבות גבוה. בכל שנה נוספים עוד ועוד ארנבים לארנבייה. \n",
+ " חומש הארנב החליט לנהל מעקב דמוגרפי אחרי הגידול. \n",
+ " הוא מעוניין שתבנו לו פונקציה שמקבלת כפרמטר רשימה של מספר הארנבים שנולדו בכל שנה. \n",
+ " הפונקציה תחזיר רשימה שבה כל תא מייצג את הכמות הנצברת של הארנבים בארנבייה עד כה. \n",
" לדוגמה: עבור הרשימה [1, 2, 3, 4], הפונקציה תחזיר [1, 3, 6, 10].\n",
"
\n",
- " אפשר לחלק כל אחד מהאוספים שכתבנו למעלה ל־2 קבוצות ערכים. \n",
- " הראשונה – הנושאים של האוסף. עבור החנות של קשטן, לדוגמה, הפריט שאנחנו מחזיקים בחנות. \n",
- " השנייה – הפריטים שהם נתון כלשהו בנוגע לפריט הראשון: המלאי של אותו פריט, לדוגמה. \n",
+ "
\n",
+ " אפשר לחלק כל אחד מהאוספים שכתבנו למעלה ל־2 קבוצות ערכים. \n",
+ " הראשונה – הנושאים של האוסף. עבור החנות של קשטן, לדוגמה, הפריט שאנחנו מחזיקים בחנות. \n",
+ " השנייה – הפריטים שהם נתון כלשהו בנוגע לפריט הראשון: המלאי של אותו פריט, לדוגמה. \n",
"
"
]
},
@@ -80,8 +80,8 @@
"metadata": {},
"source": [
"\n",
- " \n",
- " חלוקת האוספים ל־2 קבוצות של ערכים.\n",
+ "\n",
+ "חלוקת האוספים ל־2 קבוצות של ערכים.\n",
""
]
},
@@ -89,8 +89,8 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- " פריטים מהקבוצה הראשונה לעולם לא יחזרו על עצמם – אין היגיון בכך ש\"תפוח ירוק\" יופיע פעמיים ברשימת המלאי בחנות, ולא ייתכן מצב של שני מספרי זהות זהים. \n",
+ "
\n",
+ " פריטים מהקבוצה הראשונה לעולם לא יחזרו על עצמם – אין היגיון בכך ש\"תפוח ירוק\" יופיע פעמיים ברשימת המלאי בחנות, ולא ייתכן מצב של שני מספרי זהות זהים. \n",
" הפריטים מהקבוצה השנייה, לעומת זאת, יכולים לחזור על עצמם – הגיוני שתהיה אותה כמות של בננות ותפוחים בחנות, או שיהיו אנשים בעלי מספרי זהות שונים שנקראים \"משה כהן\".\n",
"
\n",
- " כמו שראינו בדוגמאות, מצב נפוץ במיוחד הוא הצורך לאחסן מיפוי בין ערכים. \n",
- " נחשוב על המיפוי בחנות של קשטן, שבה הוא סופר את המלאי עבור כל מוצר. \n",
+ "
\n",
+ " כמו שראינו בדוגמאות, מצב נפוץ במיוחד הוא הצורך לאחסן מיפוי בין ערכים. \n",
+ " נחשוב על המיפוי בחנות של קשטן, שבה הוא סופר את המלאי עבור כל מוצר. \n",
" נוכל לייצג את מלאי המוצרים בחנות של קשטן באמצעות הידע שכבר יש לנו. נשתמש בקוד הבא:\n",
"
\n",
- " עבור כל תא ברשימת items, שמרנו במקום התואם ברשימת stock את הכמות שנמצאת ממנו בחנות. \n",
- " יש 4 גזרים, 3 תפוחים ו־2 בננות על המדף בחנות של אדון קשטן. \n",
+ "
\n",
+ " עבור כל תא ברשימת items, שמרנו במקום התואם ברשימת stock את הכמות שנמצאת ממנו בחנות. \n",
+ " יש 4 גזרים, 3 תפוחים ו־2 בננות על המדף בחנות של אדון קשטן. \n",
" שליפה של כמות המלאי עבור מוצר כלשהו בחנות תתבצע בצורה הבאה:\n",
"
\n",
- " בשורה הראשונה בגוף הפונקציה מצאנו את מיקום המוצר שאנחנו מחפשים במלאי. נניח, \"תפוח\" מוחזק במקום 1 ברשימה. \n",
- " בשורה השנייה פנינו לרשימה השנייה, זו שמאחסנת את המלאי עבור כל מוצר, ומצאנו את המלאי שנמצא באותו מיקום. \n",
- " כמות היחידות של מוצר מאוחסנת במספר תא מסוים, התואם למספר התא ברשימה של שמות המוצרים. זו הסיבה לכך שהרעיון עובד. \n",
+ "
\n",
+ " בשורה הראשונה בגוף הפונקציה מצאנו את מיקום המוצר שאנחנו מחפשים במלאי. נניח, \"תפוח\" מוחזק במקום 1 ברשימה. \n",
+ " בשורה השנייה פנינו לרשימה השנייה, זו שמאחסנת את המלאי עבור כל מוצר, ומצאנו את המלאי שנמצא באותו מיקום. \n",
+ " כמות היחידות של מוצר מאוחסנת במספר תא מסוים, התואם למספר התא ברשימה של שמות המוצרים. זו הסיבה לכך שהרעיון עובד. \n",
"
\n",
- " עבור כל tuple ברשימה, בדקנו אם שם הפריט שהוא מכיל תואם לשם הפריט שחיפשנו. \n",
- " אם כן, החזרנו את הכמות של אותו פריט במלאי. \n",
+ "
\n",
+ " עבור כל tuple ברשימה, בדקנו אם שם הפריט שהוא מכיל תואם לשם הפריט שחיפשנו. \n",
+ " אם כן, החזרנו את הכמות של אותו פריט במלאי. \n",
" שימוש בפונקציה הזו נראה כך:\n",
"
\n",
- " שני קטעי הקוד שנתנו כדוגמה פישטו את המצב יתר על המידה, והם אינם מתייחסים למצב שבו הפריט חסר במלאי. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " שני קטעי הקוד שנתנו כדוגמה פישטו את המצב יתר על המידה, והם אינם מתייחסים למצב שבו הפריט חסר במלאי. \n",
" הרחיבו את הפונקציות get_stock כך שיחזירו 0 אם הפריט חסר במלאי.\n",
"
\n",
- "מילון הוא סוג ערך בפייתון. \n",
- "תכליתו היא ליצור קשר בין סדרה של נתונים שנקראת מפתחות, לבין סדרה אחרת של נתונים שנקראת ערכים. \n",
- "לכל מפתח יש ערך שעליו הוא מצביע. \n",
+ "
\n",
+ "מילון הוא סוג ערך בפייתון. \n",
+ "תכליתו היא ליצור קשר בין סדרה של נתונים שנקראת מפתחות, לבין סדרה אחרת של נתונים שנקראת ערכים. \n",
+ "לכל מפתח יש ערך שעליו הוא מצביע. \n",
"
\n",
- "במילון הזה ישנם שלושה ערכים: הגיל של ים, של מתושלח ושל בייבי־גרוט. \n",
+ "
\n",
+ "במילון הזה ישנם שלושה ערכים: הגיל של ים, של מתושלח ושל בייבי־גרוט. \n",
"המפתחות במילון הזה הם Yam (הערך הקשור למפתח הזה הוא 27), Methuselah (עם הערך 969) ו־Baby Groot (אליו הוצמד הערך 3).\n",
"
\n",
- "אפשר להוסיף מפתח וערך למילון, באמצעות השמת הערך אל המילון במקום של המפתח. \n",
- "ניקח כדוגמה מקרה שבו יש לנו במלאי מלון אחד. \n",
+ "
\n",
+ "אפשר להוסיף מפתח וערך למילון, באמצעות השמת הערך אל המילון במקום של המפתח. \n",
+ "ניקח כדוגמה מקרה שבו יש לנו במלאי מלון אחד. \n",
"המפתח הוא melon והערך הוא 1, ולכן נשתמש בהשמה הבאה: \n",
"
\n",
- " בגרסאות האחרונות של פייתון הפך מילון להיות מבנה סדור, שבו סדר האיברים הוא סדר ההכנסה שלהם למילון. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " בגרסאות האחרונות של פייתון הפך מילון להיות מבנה סדור, שבו סדר האיברים הוא סדר ההכנסה שלהם למילון. \n",
" למרות זאת, רק במצבים נדירים נצטרך להתייחס לסדר שבו האיברים מסודרים במילון, ובשלב זה נעדיף שלא להתייחס לתכונה הזו.\n",
"
\n",
- "לעזרתנו נחלצת הפעולה items, השייכת לערכים מסוג מילון. \n",
+ "
\n",
+ "לעזרתנו נחלצת הפעולה items, השייכת לערכים מסוג מילון. \n",
"הפעולה הזו מחזירה זוגות איברים, כאשר בכל זוג האיבר הראשון הוא המפתח והאיבר השני הוא הערך.\n",
"
\n",
- "בלולאה שמופיעה למעלה ניצלנו את העובדה שהפעולה items מחזירה לנו איברים בזוגות: מפתח וערך. \n",
- "בכל חזרור, אנחנו מכניסים למשתנה key את האיבר הראשון בזוג, ולמשתנה value את האיבר השני בזוג. \n",
+ "
\n",
+ "בלולאה שמופיעה למעלה ניצלנו את העובדה שהפעולה items מחזירה לנו איברים בזוגות: מפתח וערך. \n",
+ "בכל חזרור, אנחנו מכניסים למשתנה key את האיבר הראשון בזוג, ולמשתנה value את האיבר השני בזוג. \n",
"נוכל להיות אפילו אלגנטיים יותר ולתת למשתנים הללו שמות ראויים:\n",
"
\n",
- "מילונים הם טיפוסים קצת רגישים. הם לא אוהבים כשמזכירים להם מה אין בהם. \n",
- "אם ננסה לפנות למילון ולבקש ממנו מפתח שאין לו, נקבל הודעת שגיאה. \n",
- "בפעמים הראשונות שתתעסקו עם מילונים, יש סיכוי לא מבוטל שתקבלו KeyError שנראה כך: \n",
+ "
\n",
+ "מילונים הם טיפוסים קצת רגישים. הם לא אוהבים כשמזכירים להם מה אין בהם. \n",
+ "אם ננסה לפנות למילון ולבקש ממנו מפתח שאין לו, נקבל הודעת שגיאה. \n",
+ "בפעמים הראשונות שתתעסקו עם מילונים, יש סיכוי לא מבוטל שתקבלו KeyError שנראה כך: \n",
"
\n",
- "בקוד שלמעלה, השתמשנו באופרטור ההשוואה in כדי לבדוק אם מפתח מסוים (\"אכילס\") קיים בתוך המילון שיצרנו בשורה הראשונה. \n",
- "אם הוא נמצא שם, חילצנו את הערך שמוצמד לאותו מפתח (ל\"אכילס\"). אם לא, המצאנו ערך משלנו – \"פוני\". \n",
+ "
\n",
+ "בקוד שלמעלה, השתמשנו באופרטור ההשוואה in כדי לבדוק אם מפתח מסוים (\"אכילס\") קיים בתוך המילון שיצרנו בשורה הראשונה. \n",
+ "אם הוא נמצא שם, חילצנו את הערך שמוצמד לאותו מפתח (ל\"אכילס\"). אם לא, המצאנו ערך משלנו – \"פוני\". \n",
"
\n",
- " מעבר על מילון יחזיר בכל חזרור מפתח מהמילון, ללא הערך הקשור אליו. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " מעבר על מילון יחזיר בכל חזרור מפתח מהמילון, ללא הערך הקשור אליו. \n",
" מסיבה זו, אופרטור ההשוואה in יבדוק רק אם קיים מפתח מסוים במילון, ולא יבדוק אם ערך שכזה קיים.\n",
"
\n",
- " כתבו פונקציה שמקבלת שלושה פרמטרים: מילון, מפתח וערך ברירת מחדל. \n",
- " הפונקציה תחפש את המפתח במילון, ואם הוא קיים תחזיר את הערך שלו. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " כתבו פונקציה שמקבלת שלושה פרמטרים: מילון, מפתח וערך ברירת מחדל. \n",
+ " הפונקציה תחפש את המפתח במילון, ואם הוא קיים תחזיר את הערך שלו. \n",
" אם המפתח לא קיים במילון, הפונקציה תחזיר את ערך ברירת המחדל.\n",
"
\n",
- "הפונקציה שלמעלה מקבלת מילון, מפתח וערך ברירת מחדל. \n",
- "אם היא מוצאת את המפתח במילון, היא מחזירה את הערך של אותו מפתח. \n",
+ "
\n",
+ "הפונקציה שלמעלה מקבלת מילון, מפתח וערך ברירת מחדל. \n",
+ "אם היא מוצאת את המפתח במילון, היא מחזירה את הערך של אותו מפתח. \n",
"אם היא לא מוצאת את המפתח במילון, היא מחזירה את ערך ברירת המחדל שנקבע.\n",
"
\n",
"ובכן, זו פונקציה כייפית. כמה נוח היה לו היא הייתה פעולה של מילון.
"
]
},
@@ -1093,15 +1093,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### הפעולה get במילונים"
+ "### הפעולה get במילונים"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "מי היה מאמין, יש פעולה כזו במילונים! ננסה להפעיל אותה על המילון שלנו. \n",
+ "
\n",
+ "מי היה מאמין, יש פעולה כזו במילונים! ננסה להפעיל אותה על המילון שלנו. \n",
"שימו לב לצורת הקריאה לפעולה, ששונה מהקריאה לפונקציה שכתבנו למעלה – שם המשתנה של המילון בא לפני שם הפעולה. מדובר בפעולה, ולא בפונקציה:\n",
"
\n",
- "טריק קסום אחרון שנראה הוא שהפעולה get סלחנית ממש, ומתפקדת גם אם לא נותנים לה ערך ברירת מחדל. \n",
- "אם תספקו רק את שם המפתח שממנו תרצו לאחזר ערך, היא תחפש אותו ותחזיר את הערך שלו, אם הוא קיים. \n",
+ "
\n",
+ "טריק קסום אחרון שנראה הוא שהפעולה get סלחנית ממש, ומתפקדת גם אם לא נותנים לה ערך ברירת מחדל. \n",
+ "אם תספקו רק את שם המפתח שממנו תרצו לאחזר ערך, היא תחפש אותו ותחזיר את הערך שלו, אם הוא קיים. \n",
"אם המפתח לא קיים ולא סופק ערך ברירת מחדל, היא תחזיר את הערך None:\n",
"
טיפוס פייתוני שמאפשר לנו לשמור זוגות סדורים של מפתחות וערכים, שבהם כל מפתח מצביע על ערך.
\n",
"
מפתח
הנתון שלפיו נחפש את הערך הרצוי במילון, ויופיע כאיבר הראשון בזיווג שבין מפתח לערך.
\n",
"
ערך
הנתון שעליו מצביע המפתח במילון, יתקבל כאשר נחפש במילון לפי אותו מפתח. יופיע כאיבר השני בזיווג שבין מפתח לערך.
\n",
"
זוג סדור
זוג של שני איברים הקשורים זה לזה. במקרה של מילון, מפתח וערך.
\n",
- "
"
+ "
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## תרגילים"
+ "## תרגילים"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "### מסר של יום טוב"
+ "### מסר של יום טוב"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "יוגב נבו קיבל מסר מוצפן מאדון יום טוב, והצליח לשים את ידו על שיטה לפענוח המסר. \n",
- "כדי לפענח את המסר, החליפו כל אות במסר הסודי באות התואמת לה, לפי המילון המופיע למטה. \n",
+ "
\n",
+ "יוגב נבו קיבל מסר מוצפן מאדון יום טוב, והצליח לשים את ידו על שיטה לפענוח המסר. \n",
+ "כדי לפענח את המסר, החליפו כל אות במסר הסודי באות התואמת לה, לפי המילון המופיע למטה. \n",
"לדוגמה, דאגו שכל המופעים של האות O במסר SONG יוחלפו באות A.\n",
"
"
]
@@ -1232,24 +1232,24 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### מראה מראה שעל הקיר"
+ "### מראה מראה שעל הקיר"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- "חברו של יום טוב, חיים, שלח ליום טוב מסר מוצפן. \n",
- "למרבה הצער יוגב שם את ידיו רק על מפת ההצפנה, ולא על מפת הפענוח. \n",
- "צרו ממילון ההצפנה מילון פענוח, שבו: \n",
+ "
\n",
+ "חברו של יום טוב, חיים, שלח ליום טוב מסר מוצפן. \n",
+ "למרבה הצער יוגב שם את ידיו רק על מפת ההצפנה, ולא על מפת הפענוח. \n",
+ "צרו ממילון ההצפנה מילון פענוח, שבו: \n",
"
\n",
- "
\n",
- "
הערכים במילון הפענוח שתיצרו הם המפתחות ממילון ההצפנה.
\n",
- "
המפתחות במילון הפענוח שתיצרו הם הערכים ממילון ההצפנה.
\n",
+ "
\n",
+ "
הערכים במילון הפענוח שתיצרו הם המפתחות ממילון ההצפנה.
\n",
+ "
המפתחות במילון הפענוח שתיצרו הם הערכים ממילון ההצפנה.
\n",
- "בספרו המפורסם של טולסטוי \"מלחמה ושלום\" העלילה מתרחשת בתקופת הפלישה של נפוליאון לרוסיה. \n",
- "אלכנדרוס הראשן התערב עם ברונו הפיל שהוא המציא פטנט, שבעזרתו הוא יכול למצוא את המספר שהופיע הכי הרבה פעמים בכל ספר שהוא. \n",
+ "
\n",
+ "בספרו המפורסם של טולסטוי \"מלחמה ושלום\" העלילה מתרחשת בתקופת הפלישה של נפוליאון לרוסיה. \n",
+ "אלכנדרוס הראשן התערב עם ברונו הפיל שהוא המציא פטנט, שבעזרתו הוא יכול למצוא את המספר שהופיע הכי הרבה פעמים בכל ספר שהוא. \n",
"השתמשו בקובץ המצורף war-and-peace.txt שנמצא בתיקיית resources, ועזרו לברונו הפיל למצוא את השנה שמוזכרת הכי הרבה פעמים בספר.\n",
"
\n",
- "במחברת האחרונה למדנו שבפייתון ישנו סוג נתונים שנקרא \"מילון\", שמשמש אותנו לאחסון של זוגות נתונים: מפתח וערך. \n",
- "המילון מאפשר לנו לפנות למפתח מסוים, ולאחזר לפיו את הערך שמוצמד אליו. \n",
+ "
\n",
+ "במחברת האחרונה למדנו שבפייתון ישנו סוג נתונים שנקרא \"מילון\", שמשמש אותנו לאחסון של זוגות נתונים: מפתח וערך. \n",
+ "המילון מאפשר לנו לפנות למפתח מסוים, ולאחזר לפיו את הערך שמוצמד אליו. \n",
"במחברת זו נלמד על פעולות נוספות שאפשר לבצע על מילונים, ועל השילוב של מילונים עם טיפוסי נתונים אחרים.\n",
"
"
]
@@ -36,22 +36,22 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## פעולות על מילונים"
+ "## פעולות על מילונים"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "### ערכים ומפתחות"
+ "### ערכים ומפתחות"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- " לפעמים נרצה לעבור רק על הערכים שנמצאים במילון, בלי המפתחות שמצביעים עליהם. \n",
+ "
\n",
+ " לפעמים נרצה לעבור רק על הערכים שנמצאים במילון, בלי המפתחות שמצביעים עליהם. \n",
" לצורך כך נוכל להשתמש בפעולה values, בצורה הזו:\n",
"
\n",
- " הפעולה המקבילה ל־values שמחזירה לנו רק את המפתחות נקראת keys. \n",
+ "
\n",
+ " הפעולה המקבילה ל־values שמחזירה לנו רק את המפתחות נקראת keys. \n",
" יחסית נדיר לראות אותה בקוד, בין היתר כיוון שאפשר לרוץ על מפתחות המילון בלולאה גם בלי להשתמש בפעולה keys:\n",
"
\n",
- "לפעמים עולה צורך למחוק ממילון מפתח ואת הערך שקשור אליו. \n",
- "כפי שאולי ניחשתם, אין אפשרות למחוק רק את המפתח או רק את הערך – הם באים יחד. \n",
+ "
\n",
+ "לפעמים עולה צורך למחוק ממילון מפתח ואת הערך שקשור אליו. \n",
+ "כפי שאולי ניחשתם, אין אפשרות למחוק רק את המפתח או רק את הערך – הם באים יחד. \n",
"נרצה למחוק מפתח וערך מהמילון כשחשוב לנו לחסוך מקום בזיכרון המחשב, או כשהם כבר לא רלוונטיים ומפריעים לנו.\n",
"
\n",
- "הדרך הראשונה למחוק מפתח וערך ממילון היא להשתמש במילת המפתח del, שטרם הכרנו. \n",
- "מילת המפתח del נגזרת מהמילה delete (למחוק). \n",
+ "
\n",
+ "הדרך הראשונה למחוק מפתח וערך ממילון היא להשתמש במילת המפתח del, שטרם הכרנו. \n",
+ "מילת המפתח del נגזרת מהמילה delete (למחוק). \n",
"נציין את שם המילון ואת המפתח שנרצה למחוק:\n",
"
\n",
- "פעמים רבות נרצה לקבל את הערך המשויך למפתח שאנחנו מוחקים. \n",
- "חיסרון מובהק של del הוא שבשימוש בה, המפתח והערך יימחקו בלי להחזיר שום מידע על הנתונים שנמחקו. \n",
+ "
\n",
+ "פעמים רבות נרצה לקבל את הערך המשויך למפתח שאנחנו מוחקים. \n",
+ "חיסרון מובהק של del הוא שבשימוש בה, המפתח והערך יימחקו בלי להחזיר שום מידע על הנתונים שנמחקו. \n",
"נוכל לקבל את הערך שנמחק בכל זאת בעזרת הפעולה pop, שחוץ מלמחוק זוג של מפתח וערך לפי המפתח, גם מחזירה את הערך שמחקה:\n",
"
\n",
- " הוספה של ערכים מרובים למילון עלולה להיות לא נוחה במבט ראשון. \n",
+ "
\n",
+ " הוספה של ערכים מרובים למילון עלולה להיות לא נוחה במבט ראשון. \n",
" נביט בשני המילונים הבאים, שבהם כל ערך הוא המפתח התואם לו, שהועלה בחזקה שנייה.\n",
"
\n",
- " אף שהקוד למעלה מובן למדי, הוא מסורבל יחסית לפעולה הפשוטה שהוא מבצע. \n",
- " כמו שאולי ניחשתם, החברים שיצרו את פייתון כבר חשבו על פעולה כזו למיזוג מילונים. \n",
+ "
\n",
+ " אף שהקוד למעלה מובן למדי, הוא מסורבל יחסית לפעולה הפשוטה שהוא מבצע. \n",
+ " כמו שאולי ניחשתם, החברים שיצרו את פייתון כבר חשבו על פעולה כזו למיזוג מילונים. \n",
" נפעיל אותה על המילון שאליו אנחנו רוצים למזג, ונעביר לפעולה כארגומנט את הרשימה שממנה נרצה למזג:\n",
"
\n",
- " כדי לסגנן את הקוד שלנו, הרבה פעמים נרד שורה גם כשלא חייבים. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " כדי לסגנן את הקוד שלנו, הרבה פעמים נרד שורה גם כשלא חייבים. \n",
" נפוץ מאוד לרדת שורה במבנים ארוכים אחרי שפתחנו סוגריים – פייתון מבינה שמדובר באותה שורה.\n",
"
\n",
- "ניזהר במקרה שיש מפתח שעלול לא להופיע באחד המילונים. \n",
+ "
\n",
+ "ניזהר במקרה שיש מפתח שעלול לא להופיע באחד המילונים. \n",
"לדוגמה, לסקרלט ג'והנסון אין בן־זוג, ולכן כשהלולאה הבאה תגיע אליה היא תקפיץ שגיאה:\n",
"
\n",
- "אנחנו רוצים ליצור תוכנה לניהול ספרייה, שבה אפשר למצוא ספרים לפי שם המחבר. \n",
- "בשלב הנוכחי ביקשו מאיתנו לשמור עבור כל ספר רק את שמו, ללא פרטים נוספים, כמו מלאי או שנת הוצאה לאור. \n",
+ "
\n",
+ "אנחנו רוצים ליצור תוכנה לניהול ספרייה, שבה אפשר למצוא ספרים לפי שם המחבר. \n",
+ "בשלב הנוכחי ביקשו מאיתנו לשמור עבור כל ספר רק את שמו, ללא פרטים נוספים, כמו מלאי או שנת הוצאה לאור. \n",
"נצטרך לתכנת את האפשרות לשלוף את שמות הספרים לפי שם המחבר, ולהוסיף ולהסיר ספרים בקלות מרשימת ספריו של כל מחבר.\n",
"
\n",
- " השקיעו 5 דקות וחשבו איך הייתם מממשים ספרייה שכזו בעזרת סוגי הנתונים שלמדתם. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " השקיעו 5 דקות וחשבו איך הייתם מממשים ספרייה שכזו בעזרת סוגי הנתונים שלמדתם. \n",
" בונוס: כתבו כיצד אפשר לממש ספרייה שכזו, וממשו פונקציה שמאפשרת להוסיף ולהסיר ספרים עבור כל מחבר.\n",
"
\n",
- "עבור הדרישה הראשונה, נראה שהמבנה המתאים ביותר הוא מילון שמקשר את שם המחבר לרשימת הספרים שלו. \n",
+ "
\n",
+ "עבור הדרישה הראשונה, נראה שהמבנה המתאים ביותר הוא מילון שמקשר את שם המחבר לרשימת הספרים שלו. \n",
"עבור הדרישה השנייה, נראה שהמבנה המתאים ביותר הוא רשימה – סוג גמיש שקל לערוך את האיברים שבו (לעומת tuple, נניח).\n",
"
\n",
+ "הדרישות של בעלי הספרייה השתנו. \n",
"הם מבקשים שהפעם, בזמן שאנחנו שומרים על הסידור לפי שמות הסופרים, נוסיף על שם הספר גם את הפרטים הבאים:\n",
"
\n",
- "נציץ על שלוש צורות לממש מבני נתונים שיכולים לשמש את הספרייה המדוברת. \n",
+ "
\n",
+ "נציץ על שלוש צורות לממש מבני נתונים שיכולים לשמש את הספרייה המדוברת. \n",
"נשאיר את בחינת נוחות השימוש בכל אחת מהן ואת כתיבת קוד להוספת ספרים ולהסרתם כתרגיל לקורא.\n",
"
\n",
- " מה היתרונות שנובעים מהבחירה שלנו לייצג הנתונים בכל אחת מהדרכים? מה החסרונות? \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " מה היתרונות שנובעים מהבחירה שלנו לייצג הנתונים בכל אחת מהדרכים? מה החסרונות? \n",
" אם הייתה לכם ספרייה משלכם, כיצד הייתם מסדרים את הנתונים ומייצגים אותם?\n",
"
\n",
- "
\n",
- "
\n",
- "
\n",
- " חשוב! \n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "חשוב! \n",
" פתרו לפני שתמשיכו!\n",
"
\n",
- "
\n",
+ "
\n",
"
"
]
},
@@ -719,22 +719,22 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## תרגילים"
+ "## תרגילים"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "### מילים של אבן ספיר בהווה"
+ "### מילים של אבן ספיר בהווה"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- " קבלו רשימה של מילונים, ואחדו את כל המילונים שנמצאים ברשימה למילון אחד. \n",
+ "
\n",
+ " קבלו רשימה של מילונים, ואחדו את כל המילונים שנמצאים ברשימה למילון אחד. \n",
" ודאו שאינכם משנים את המילונים הנמצאים ברשימה.\n",
"
\n",
- " המורה רוג'רס מעניק ציון לכל תלמיד על פי הציונים שלו במבחנים ובשיעורי הבית. \n",
- " צרו מבנה נתונים שייצג את הציונים של כל התלמידים, ולאחר מכן השתמשו בו כדי לחשב את הציון הסופי של כל תלמיד ולהדפיסו. \n",
+ "
\n",
+ " המורה רוג'רס מעניק ציון לכל תלמיד על פי הציונים שלו במבחנים ובשיעורי הבית. \n",
+ " צרו מבנה נתונים שייצג את הציונים של כל התלמידים, ולאחר מכן השתמשו בו כדי לחשב את הציון הסופי של כל תלמיד ולהדפיסו. \n",
" ציון התלמידים הסופי מורכב מ־20% ממוצע הציונים בשיעורי בית, ועוד 80% ממוצע הציונים במבחנים:\n",
"
\n",
- " בצד ימין יש tuple שמכיל שני איברים, ואנחנו מבצעים השמה לשני משתנים ששמותיהם country ו־population. \n",
- " אומנם לא הייתי מעניק לפיסת הקוד הזו את תואר פיסת הקוד הנאה בעולם, אבל נראה שפייתון יודעת להריץ אותה: \n",
+ "
\n",
+ " בצד ימין יש tuple שמכיל שני איברים, ואנחנו מבצעים השמה לשני משתנים ששמותיהם country ו־population. \n",
+ " אומנם לא הייתי מעניק לפיסת הקוד הזו את תואר פיסת הקוד הנאה בעולם, אבל נראה שפייתון יודעת להריץ אותה: \n",
"
\n",
- " חזינו כאן במעין השמה כפולה שפייתון מאפשרת לנו לבצע: \n",
- " את האיבר הראשון בצד ימין היא הכניסה לאיבר הראשון בצד שמאל, ואת האיבר השני בצד ימין היא הכניסה לאיבר השני בצד שמאל. \n",
+ "
\n",
+ " חזינו כאן במעין השמה כפולה שפייתון מאפשרת לנו לבצע: \n",
+ " את האיבר הראשון בצד ימין היא הכניסה לאיבר הראשון בצד שמאל, ואת האיבר השני בצד ימין היא הכניסה לאיבר השני בצד שמאל. \n",
"
\n",
- " מתכנתים רבים מנצלים את הנוחות שב־unpacking, ולכן תמצאו שהוא מופיע פעמים רבות בקוד \"בעולם האמיתי\". \n",
+ "
\n",
+ " מתכנתים רבים מנצלים את הנוחות שב־unpacking, ולכן תמצאו שהוא מופיע פעמים רבות בקוד \"בעולם האמיתי\". \n",
" אפשר לבצע השמה לכמה משתנים שנרצה בו־זמנית:\n",
"
\n",
- " בדוגמה האחרונה יצרנו בשורה הראשונה משתנה שמצביע ל־tuple. ב־tuple ישנם שני מספרים מסוג float. \n",
+ "
\n",
+ " בדוגמה האחרונה יצרנו בשורה הראשונה משתנה שמצביע ל־tuple. ב־tuple ישנם שני מספרים מסוג float. \n",
" בשורה השנייה פירקנו את ה־tuple – הערך הראשון שלו הוכנס לתוך המשתנה x והערך השני שלו הוכנס לתוך המשתנה y. \n",
"
\n",
- " שימוש מקובל מאוד ל־unpacking, שאותו כבר הספקתם לראות בעבר, מתרחש בלולאות for. \n",
+ "
\n",
+ " שימוש מקובל מאוד ל־unpacking, שאותו כבר הספקתם לראות בעבר, מתרחש בלולאות for. \n",
" ניצור רשימה של tuple־ים, שבה כל tuple ייצג מדינה ואת מספר האנשים החיים בה:\n",
"
\n",
- " באיור למעלה, התאים האדומים מפורקים לתוך המשתנה country והתאים הירוקים לתוך המשתנה population. \n",
+ "
\n",
+ " באיור למעלה, התאים האדומים מפורקים לתוך המשתנה country והתאים הירוקים לתוך המשתנה population. \n",
" כל איטרציה של הלולאה תגרום לפירוק של צמד אחד מתוך הרשימה, ולהשמתו בהתאמה לתוך צמד המשתנים שבראש לולאת ה־for.\n",
"
\n",
- " הרעיון של unpacking נעשה שימושי מאוד כשאנחנו רוצים לעבור בו־זמנית על המפתח ועל הערך של מילון. \n",
+ "
\n",
+ " הרעיון של unpacking נעשה שימושי מאוד כשאנחנו רוצים לעבור בו־זמנית על המפתח ועל הערך של מילון. \n",
" כל שנצטרך לעשות כדי לקבל את המפתח לצד הערך בכל איטרציה, זה להשתמש בפעולה items על המילון:\n",
"
\n",
- " המקרה הזה לא שונה מהמקרים הקודמים שראינו, אבל חשבתי שיהיה נחמד לראות אותו מפורשות. \n",
- " הפעם ניקח פונקציה שמחזירה tuple, ונשתמש ב־unpacking כדי לפרק את הערכים שהיא מחזירה למשתנים. \n",
+ "
\n",
+ " המקרה הזה לא שונה מהמקרים הקודמים שראינו, אבל חשבתי שיהיה נחמד לראות אותו מפורשות. \n",
+ " הפעם ניקח פונקציה שמחזירה tuple, ונשתמש ב־unpacking כדי לפרק את הערכים שהיא מחזירה למשתנים. \n",
"
\n",
- " הגדרנו פונקציה שמדפיסה לנו יפה מיקומים לפי x ו־y שהיא מקבלת. \n",
- " המימוש הגיוני, אבל אוי א בראך! השימוש לא מאוד נוח! \n",
+ "
\n",
+ " הגדרנו פונקציה שמדפיסה לנו יפה מיקומים לפי x ו־y שהיא מקבלת. \n",
+ " המימוש הגיוני, אבל אוי א בראך! השימוש לא מאוד נוח! \n",
" בכל פעם אנחנו צריכים לפרק את ה־tuple שמכיל את המיקום ל־2 איברים, ולשלוח כל אחד מהם בנפרד.\n",
"
\n",
- " נראה מוזר? זו לא טעות, זהו באמת תחביר שעדיין לא ראינו! \n",
+ "
\n",
+ " נראה מוזר? זו לא טעות, זהו באמת תחביר שעדיין לא ראינו! \n",
" הכוכבית מפרקת את ה־tuple שהגדרנו, treasure_location, ושולחת לארגומנט x את הערך הראשון ולארגומנט y את הערך השני.\n",
"
\n",
- " במקרה המיוחד מאוד של מילון, אפשר לשלוח לפונקציה את הפרמטרים בעזרת unpacking עם שתי כוכביות. \n",
+ "
\n",
+ " במקרה המיוחד מאוד של מילון, אפשר לשלוח לפונקציה את הפרמטרים בעזרת unpacking עם שתי כוכביות. \n",
" המפתחות של המילון צריכים לציין את שם הפרמטרים של הפונקציה, והערכים במילון יהיו הערך שיועבר לאותם פרמטרים:\n",
"
\n",
- " מה קרה פה? \n",
- " באיטרציה הראשונה location היה {'x': 36.671111, 'y': 65.808056}. \n",
- " הפונקציה print_treasure_locations מחכה שיעבירו לה ערך לפרמטר x ולפרמטר y. \n",
+ "
\n",
+ " מה קרה פה? \n",
+ " באיטרציה הראשונה location היה {'x': 36.671111, 'y': 65.808056}. \n",
+ " הפונקציה print_treasure_locations מחכה שיעבירו לה ערך לפרמטר x ולפרמטר y. \n",
" ה־unpacking שעשינו בעזרת שתי הכוכביות העביר את הערך של המפתח 'x' במילון לפרמטר x, ואת הערך של המפתח 'y' במילון לפרמטר y.\n",
"
\n",
- " אנחנו רגילים שפייתון די סובלנית, אבל על unpacking תקין היא לא מוותרת. \n",
+ "
\n",
+ " אנחנו רגילים שפייתון די סובלנית, אבל על unpacking תקין היא לא מוותרת. \n",
" בדוגמה הבאה אנחנו מנסים לחלץ שני איברים לתוך שלושה משתנים, וזה לא נגמר טוב:\n",
"
\n",
- "סדרת פיבונאצ'י היא סדרה שמתחילה באיברים 1 ו־1, וכל איבר בה הוא סכום שני האיברים הקודמים לו. \n",
- "האיברים הראשונים בסדרה, הם (מימין לשמאל) 1, 1, 2, 3, 5, 8, וכך הסדרה ממשיכה. \n",
+ "
\n",
+ "סדרת פיבונאצ'י היא סדרה שמתחילה באיברים 1 ו־1, וכל איבר בה הוא סכום שני האיברים הקודמים לו. \n",
+ "האיברים הראשונים בסדרה, הם (מימין לשמאל) 1, 1, 2, 3, 5, 8, וכך הסדרה ממשיכה. \n",
"במימוש פונקציה שמקבלת מספר ומחזירה את סכום כל איברי הסדרה עד אותו מספר, נוכל להשתמש ב־unpacking כדי לשפר את הקריאות של הפונקציה:\n",
"
\n",
- " לפניכם tuple המכיל כמה מילונים, כאשר כל מילון מייצג דמות חשודה ברצח. \n",
- " בתוך כל אחד מהמילונים, תחת המפתח evidences, ישנו tuple שבו שני איברים. \n",
- " האיבר הראשון הוא הנשק שתפסה המשטרה, והאיבר השני הוא המיקום המרכזי שבו הייתה הדמות באותו היום. \n",
- " בהינתן שהרוצח השתמש באקדח דרינגר (derringer) ב־Petersen House, הדפיסו רק את שמות האנשים שעדיין חשודים ברצח. \n",
+ "
\n",
+ " לפניכם tuple המכיל כמה מילונים, כאשר כל מילון מייצג דמות חשודה ברצח. \n",
+ " בתוך כל אחד מהמילונים, תחת המפתח evidences, ישנו tuple שבו שני איברים. \n",
+ " האיבר הראשון הוא הנשק שתפסה המשטרה, והאיבר השני הוא המיקום המרכזי שבו הייתה הדמות באותו היום. \n",
+ " בהינתן שהרוצח השתמש באקדח דרינגר (derringer) ב־Petersen House, הדפיסו רק את שמות האנשים שעדיין חשודים ברצח. \n",
" השתדלו להשתמש ב־unpacking לפחות פעמיים.\n",
"
\n",
- " כדי שלא נצטרך לכתוב שוב ושוב את אותו פתרון, שפות רבות מצוידות בכלים מוכנים מראש שמטרתם לפתור בעיות נפוצות. \n",
- " פייתון מתגאה בכך שהיא שפה ש\"הבטריות בה כלולות\" (batteries included), היגד שנועד לתאר את העובדה שהיא מכילה פתרונות מוכנים לאותן בעיות. \n",
+ "
\n",
+ " כדי שלא נצטרך לכתוב שוב ושוב את אותו פתרון, שפות רבות מצוידות בכלים מוכנים מראש שמטרתם לפתור בעיות נפוצות. \n",
+ " פייתון מתגאה בכך שהיא שפה ש\"הבטריות בה כלולות\" (batteries included), היגד שנועד לתאר את העובדה שהיא מכילה פתרונות מוכנים לאותן בעיות. \n",
" במחברת זו נכיר חלק מהפונקציות שפייתון מספקת לנו במטרה להקל על חיינו.\n",
"
\n",
- " בהמשך המחברת ישנן דוגמאות עבור כל פונקציה חדשה שנכיר. \n",
- " למען הבהירות אני מדפיס דוגמה בודדת, ואז אני משתמש בלולאה כדי להדפיס כמה דוגמאות ברצף. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " בהמשך המחברת ישנן דוגמאות עבור כל פונקציה חדשה שנכיר. \n",
+ " למען הבהירות אני מדפיס דוגמה בודדת, ואז אני משתמש בלולאה כדי להדפיס כמה דוגמאות ברצף. \n",
" הדוגמאות ירווחו בצורה מוזרה כדי שיהיה נוח להסתכל על הפלט. אל תשתמשו בריווחים כאלו בקוד שלכם.\n",
"
\n",
- " ישנן פעולות מתמטיות שנצטרך לעיתים תכופות, שאת חלקן אפילו מימשנו שוב ושוב לאורך הקורס. \n",
+ "
\n",
+ " ישנן פעולות מתמטיות שנצטרך לעיתים תכופות, שאת חלקן אפילו מימשנו שוב ושוב לאורך הקורס. \n",
" נראה מה יש לארגז הכלים של פייתון להציע לנו.\n",
"
\n",
- " הפונקציה abs מחזירה את הערך המוחלט של המספר שנעביר לה. \n",
- " אם נעביר לה כארגומנט מספר שלם או עשרוני, היא תחזיר את המרחק של המספר מ־0 על ציר המספרים: \n",
+ "
\n",
+ " הפונקציה abs מחזירה את הערך המוחלט של המספר שנעביר לה. \n",
+ " אם נעביר לה כארגומנט מספר שלם או עשרוני, היא תחזיר את המרחק של המספר מ־0 על ציר המספרים: \n",
"
\n",
- " המשמעות של :>6 ב־fstring היא \"דאג שיהיו לפחות 6 תווים, וישר את הערך לימין\". \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " המשמעות של :>6 ב־fstring היא \"דאג שיהיו לפחות 6 תווים, וישר את הערך לימין\". \n",
" אפשר להחליף את > בתו ^ לצורך יישור לאמצע, או בתו < לצורך יישור לשמאל.\n",
"
\n",
- " מחרוזות בפייתון מושוות לפי הערך המספרי של התווים שמהם הן מורכבות. \n",
- " כשמדובר ב־iterable שיש בו מחרוזות, פייתון מוצאת את הערך המרבי או המזערי לפי הייצוג המספרי של האותיות באותן מחרוזות. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " מחרוזות בפייתון מושוות לפי הערך המספרי של התווים שמהם הן מורכבות. \n",
+ " כשמדובר ב־iterable שיש בו מחרוזות, פייתון מוצאת את הערך המרבי או המזערי לפי הייצוג המספרי של האותיות באותן מחרוזות. \n",
" מהסיבה הזו, הסידור האלפבתי לא יחזיר את הערך הרצוי במצב שבו יש גם אותיות גדולות וגם אותיות וקטנות: \n",
"
\n",
- " זה קורה כיוון שהערכים המספריים של אותיות גדולות קטנים מאלו של אותיות קטנות. \n",
+ "
\n",
+ " זה קורה כיוון שהערכים המספריים של אותיות גדולות קטנים מאלו של אותיות קטנות. \n",
" הערך המספרי של Z במילה ZEBRA הוא 90, והערך המספרי של a (במילה apple, שציפינו שתיחשב כקטנה ביותר) הוא 97.\n",
"
\n",
- " עוד פרט טריוויה נחמד הוא שלכל ערך בפייתון יש ערך בוליאני שקול. \n",
+ "
\n",
+ " עוד פרט טריוויה נחמד הוא שלכל ערך בפייתון יש ערך בוליאני שקול. \n",
" בדרך כלל, ערכים ריקים שקולים ל־False וערכים שאינם ריקים שקולים ל־True:\n",
"
\n",
- " על הפונקציה id כבר למדנו בעבר. היא מקבלת כארגומנט ערך, ומחזירה לנו את \"הזהות\" שלו – ערך אחר שמייצג רק את אותו. \n",
- " בגרסת הפייתון שאנחנו משתמשים בה, מדובר בכתובת של הערך בזיכרון המחשב. \n",
- " כל אדם שיריץ את הקוד הבא יקבל ערכים שונים, אבל לעולם לא יודפסו לו 2 ערכים זהים באותה ריצה. \n",
+ "
\n",
+ " על הפונקציה id כבר למדנו בעבר. היא מקבלת כארגומנט ערך, ומחזירה לנו את \"הזהות\" שלו – ערך אחר שמייצג רק את אותו. \n",
+ " בגרסת הפייתון שאנחנו משתמשים בה, מדובר בכתובת של הערך בזיכרון המחשב. \n",
+ " כל אדם שיריץ את הקוד הבא יקבל ערכים שונים, אבל לעולם לא יודפסו לו 2 ערכים זהים באותה ריצה. \n",
" הסיבה לכך שתמיד יודפסו 4 ערכים שונים היא שכל הנתונים שמופיעים ברשימה values שונים זה מזה.\n",
"
\n",
- " נסו לכתוב קוד של שורה אחת או יותר, שיחליף את השורה הראשונה בקוד שלמעלה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " נסו לכתוב קוד של שורה אחת או יותר, שיחליף את השורה הראשונה בקוד שלמעלה. \n",
" גרמו לכך שהקוד שמוסיף את הערך 100 לרשימה הראשונה לא ישפיע על שאר הרשימות.\n",
"
\n",
- " גם על הפונקציה dir כבר למדנו. ראיתם אותה לאחרונה במחברת שעסקה בדוקומנטציה. \n",
- " הפונקציה dir תחזיר לנו את כל הפעולות שאפשר לבצע על משתנה מסוים או על טיפוס מסוים. \n",
+ "
\n",
+ " גם על הפונקציה dir כבר למדנו. ראיתם אותה לאחרונה במחברת שעסקה בדוקומנטציה. \n",
+ " הפונקציה dir תחזיר לנו את כל הפעולות שאפשר לבצע על משתנה מסוים או על טיפוס מסוים. \n",
" נוכל להעביר לה כארגומנט את הערך שנרצה להבין מה הפעולות שאפשר לבצע עליו:\n",
"
"
]
@@ -690,7 +690,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "או שנוכל להעביר לה ממש שם של טיפוס:"
+ "או שנוכל להעביר לה ממש שם של טיפוס:"
]
},
{
@@ -706,15 +706,15 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### eval"
+ "### eval"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- " על eval אנחנו מלמדים בעיקר כדי להזהיר ממנה – זו פונקציה שאחראית למחדלי אבטחה בכל שפת תכנות שבה היא קיימת. \n",
+ "
\n",
+ " על eval אנחנו מלמדים בעיקר כדי להזהיר ממנה – זו פונקציה שאחראית למחדלי אבטחה בכל שפת תכנות שבה היא קיימת. \n",
" אתם לא אמורים להשתמש בה בקורס, וכדאי לזכור שכשהתשובה היא eval, ברוב המוחלט של המקרים שאלתם את השאלה הלא נכונה.\n",
"
\n",
- " אבל כשחושבים על זה – המשתמש שמתבקש להכניס תרגיל מתמטי, יכול להריץ כל קוד שיתחשק לו, והקוד הזה יבוצע! \n",
- " הוא יכול לקרוא קבצים שנמצאים על מחשב או למחוק אותם, לחטט בסיסמאות, ולמעשה – לעשות ככל העולה על רוחו. \n",
+ "
\n",
+ " אבל כשחושבים על זה – המשתמש שמתבקש להכניס תרגיל מתמטי, יכול להריץ כל קוד שיתחשק לו, והקוד הזה יבוצע! \n",
+ " הוא יכול לקרוא קבצים שנמצאים על מחשב או למחוק אותם, לחטט בסיסמאות, ולמעשה – לעשות ככל העולה על רוחו. \n",
" לקריאה נוספת על הסכנות, חפשו על code injection.\n",
"
\n",
- " פעמים רבות אנחנו נתקלים במצבים שבהם אנחנו רוצים לעבור על כל המספרים מ־0 ועד ערך מסוים. \n",
+ "
\n",
+ " פעמים רבות אנחנו נתקלים במצבים שבהם אנחנו רוצים לעבור על כל המספרים מ־0 ועד ערך מסוים. \n",
" לדוגמה, כך פתרנו את התרגיל שמחשב את סכום המספרים עד מספר שהתקבל כקלט:\n",
"
\n",
- " מטרת הפונקציה range היא לפתור לנו את הבעיה הזו בקלות. \n",
+ "
\n",
+ " מטרת הפונקציה range היא לפתור לנו את הבעיה הזו בקלות. \n",
" תנו ל־range מספר כארגומנט, והיא תחזיר לכם iterable שמכיל את כל המספרים הטבעיים עד המספר שנתתם לה, ללא המספר האחרון:\n",
"
\n",
- " הפונקציה range מזכירה את פעולת החיתוך מהשבוע השלישי, שבה משתמשים בסוגריים מרובעים ובנקודתיים. \n",
- " range, לעומת חיתוך, היא פונקציה – קוראים לה בעזרת סוגריים עגולים, ומפרידים בין הארגומנטים שנשלחים אליה בעזרת פסיקים.\n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " הפונקציה range מזכירה את פעולת החיתוך מהשבוע השלישי, שבה משתמשים בסוגריים מרובעים ובנקודתיים. \n",
+ "range, לעומת חיתוך, היא פונקציה – קוראים לה בעזרת סוגריים עגולים, ומפרידים בין הארגומנטים שנשלחים אליה בעזרת פסיקים.\n",
"
\n",
- " עד כה ארגז הכלים שלנו כלל רק את פעולת הסידור ששייכת לרשימות, sort. \n",
- " אף שמעשית רוב פעולות הסידור מבוצעות על רשימות, לפעמים יעלה הצורך לסדר טיפוסי נתונים אחרים. \n",
+ "
\n",
+ " עד כה ארגז הכלים שלנו כלל רק את פעולת הסידור ששייכת לרשימות, sort. \n",
+ " אף שמעשית רוב פעולות הסידור מבוצעות על רשימות, לפעמים יעלה הצורך לסדר טיפוסי נתונים אחרים. \n",
" במקרים האלה נשתמש בפונקציה המובנית sorted:\n",
"
\n",
- " גם ל־sorted וגם לפעולה sort שיכולה להתבצע על רשימות, יש 2 פרמטרים שלא למדנו עליהם. \n",
+ "
\n",
+ " גם ל־sorted וגם לפעולה sort שיכולה להתבצע על רשימות, יש 2 פרמטרים שלא למדנו עליהם. \n",
" לפרמטר הראשון קוראים reverse, והוא הפשוט להבנה מבין השניים – ברגע שמועבר אליו True, הוא מחזיר את הרשימה מסודרת בסדר יורד:
\n",
- " הפרמטר השני, key, מסובך קצת יותר להבנה. \n",
- " כשנעביר לפרמטר הזה פונקציה, הסידור של איברי ה־iterable יתבצע לפי הערך שחוזר מהפונקציה הזו עבור כל אחד מהאיברים שצריך למיין. \n",
+ "
\n",
+ " הפרמטר השני, key, מסובך קצת יותר להבנה. \n",
+ " כשנעביר לפרמטר הזה פונקציה, הסידור של איברי ה־iterable יתבצע לפי הערך שחוזר מהפונקציה הזו עבור כל אחד מהאיברים שצריך למיין. \n",
" מבולבלים? נראה, לדוגמה, את הרשימה הבאה, שמורכבת משמות אנשי הסגל של אחד מהמחזורים הקודמים:\n",
"
\n",
- " בפועל, אנחנו מחזיקים עכשיו רשימה ראשית (שמות אנשי הסגל), ועוד רשימה משנית שבה מאוחסנים אורכי האיברים שברשימה הראשית. \n",
+ "
\n",
+ " בפועל, אנחנו מחזיקים עכשיו רשימה ראשית (שמות אנשי הסגל), ועוד רשימה משנית שבה מאוחסנים אורכי האיברים שברשימה הראשית. \n",
" פייתון תמיין את הרשימה המשנית, ובכל פעם שהיא תזיז את אחד האיברים בה, היא תזיז איתו את האיבר התואם ברשימה המקורית:\n",
"
\n",
- " עכשיו הרשימה המשנית מסודרת, ואפשר להפסיק את פעולת הסידור. \n",
+ "
\n",
+ " עכשיו הרשימה המשנית מסודרת, ואפשר להפסיק את פעולת הסידור. \n",
" הקסם הוא שאפשר להכניס ל־key כל פונקציה, ולקבל iterable מסודר לפי ערכי ההחזרה של אותה פונקציה עבור הערכים ב־iterable.\n",
"
\n",
- " כתבו פונקציה שמקבלת כפרמטר את רשימת השמות של המשתתפות בכיתה. \n",
- " הפונקציה תחזיר רשימה המורכבת מאותם שמות, מסודרים לפי סדר האלף־בית. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " כתבו פונקציה שמקבלת כפרמטר את רשימת השמות של המשתתפות בכיתה. \n",
+ " הפונקציה תחזיר רשימה המורכבת מאותם שמות, מסודרים לפי סדר האלף־בית. \n",
" סדרו נכונה גם מקרים שבהם חלק מהשמות מתחילים באות גדולה, וחלק – באות קטנה.\n",
"
\n",
- " הרבה פעמים נגיע למצב שבו יש לנו 2 iterables ואנחנו מעוניינים לעבור על הערכים שלהם, זה לצד זה. \n",
+ "
\n",
+ " הרבה פעמים נגיע למצב שבו יש לנו 2 iterables ואנחנו מעוניינים לעבור על הערכים שלהם, זה לצד זה. \n",
" נניח שיש לנו רשימה של ציורים, ורשימה של הציירים שציירו אותם:\n",
"
\n",
- "שימוש נפוץ ל־zip הוא במקרה שיש לנו שתי רשימות שמתאימות זו לזו, ויחד יכולות ליצור מילון. \n",
+ "
\n",
+ "שימוש נפוץ ל־zip הוא במקרה שיש לנו שתי רשימות שמתאימות זו לזו, ויחד יכולות ליצור מילון. \n",
"אם רשימה אחת מתאימה להיות המפתחות במילון, והאחרת להיות הערכים באותו מילון, נוכל להשתמש ב־zip כדי לבצע את ההמרה:\n",
"
\n",
- " צופן קיסר היא שיטת הצפנה, שבה כל תו מוחלף בתו שנמצא 3 תווים אחריו באלף־בית של השפה. \n",
- " בעברית, לדוגמה, האות א' תוחלף באות ד', האות ג' באות ו' והאות ת' באות ג'. \n",
+ "
\n",
+ " צופן קיסר היא שיטת הצפנה, שבה כל תו מוחלף בתו שנמצא 3 תווים אחריו באלף־בית של השפה. \n",
+ " בעברית, לדוגמה, האות א' תוחלף באות ד', האות ג' באות ו' והאות ת' באות ג'. \n",
" נבנה מפת פענוח לצופן קיסר בעזרת הפונקציות שלמדנו במחברת:\n",
"
\n",
- " קבלו רשימת שמות תלמידים, ועבור כל תלמיד את רשימת הציונים שלו. \n",
+ "
\n",
+ " קבלו רשימת שמות תלמידים, ועבור כל תלמיד את רשימת הציונים שלו. \n",
" הדפיסו את שם התלמיד שממוצע הציונים שלו הוא הגבוה ביותר, לצד הציונים שלו.\n",
"
\n",
- " מצאו את עשר המילים הנפוצות ביותר בספר \"מלחמה ושלום\", והדפיסו אותן למסך מהמילה הנפוצה ביותר למילה הנפוצה הכי פחות. \n",
- " ליד כל מילה הדפיסו את מספר המופעים שלה בספר. \n",
+ "
\n",
+ " מצאו את עשר המילים הנפוצות ביותר בספר \"מלחמה ושלום\", והדפיסו אותן למסך מהמילה הנפוצה ביותר למילה הנפוצה הכי פחות. \n",
+ " ליד כל מילה הדפיסו את מספר המופעים שלה בספר. \n",
" הספר נמצא בקובץ war-and-peace.txt בתוך התיקייה resources.\n",
"
\n",
- " במדינת הגמדים רעש מהומה, ולכן החליטו ללכת לבחירות. \n",
- " ועדת הבחירות המרכזית, בראשות דרדסבא, ערכה בחירות חשאיות והוגנות והציגה לפניכם את התוצאות בקובץ elections.txt המצורף (בתיקיית resources), על כל 353,400 בוחריה. \n",
- " הקובץ הינו רשימה של שמות המפלגות שבהן בחרו תושבי מדינת הגמדים, כאשר כל שורה מייצגת בחירה של תושב מדינת הגמדים. \n",
- " כדי לשמור על טוהר הבחירות לא נאמר לכם במפורש מהו מספר המפלגות שהגישו את רשימותיהן לוועדת הבחירות. \n",
- " עליכם הוטלה המשימה לעבור על קובץ תוצאות הבחירות ולדווח כמה קולות קיבלה כל מפלגה. \n",
+ "
\n",
+ " במדינת הגמדים רעש מהומה, ולכן החליטו ללכת לבחירות. \n",
+ " ועדת הבחירות המרכזית, בראשות דרדסבא, ערכה בחירות חשאיות והוגנות והציגה לפניכם את התוצאות בקובץ elections.txt המצורף (בתיקיית resources), על כל 353,400 בוחריה. \n",
+ " הקובץ הינו רשימה של שמות המפלגות שבהן בחרו תושבי מדינת הגמדים, כאשר כל שורה מייצגת בחירה של תושב מדינת הגמדים. \n",
+ " כדי לשמור על טוהר הבחירות לא נאמר לכם במפורש מהו מספר המפלגות שהגישו את רשימותיהן לוועדת הבחירות. \n",
+ " עליכם הוטלה המשימה לעבור על קובץ תוצאות הבחירות ולדווח כמה קולות קיבלה כל מפלגה. \n",
" כתבו פונקציה שלא מקבלת פרמטרים ומחזירה את תוצאות הבחירות במילון ובו שם המפלגה ומספר הקולות שקיבלה.\n",
"
\n",
- " אחוז החסימה במדינת הגמדים הוא אכזרי למדי ועומד על 10%. \n",
+ "
\n",
+ " אחוז החסימה במדינת הגמדים הוא אכזרי למדי ועומד על 10%. \n",
" כיון שהצביעו 353,400 גמדים – אחוז החסימה עומד על\n",
- " $353,400*0.1=35,340$ קולות. \n",
+ " $353,400*0.1=35,340$ קולות. \n",
" כתבו פונקציה המקבלת את מילון תוצאות הבחירות ומדפיסה אילו מפלגות עברו את אחוז החסימה ואילו לא.\n",
"
\n",
- " לאחר קבלת תוצאות האמת המפלגות פועלות להקים קואליציה. קואליציה מורכבת מ־61 מנדטים לפחות. \n",
- " מנדט שווה: $\\dfrac{votes}{120}=2.077.775\\cong2,078$ קולות. \n",
- " שימו לב, הקולות בתרגיל זה הם התוצאה של הסעיף הקודם. כלומר הקולות בניכוי הקולות עבור מפלגות שלא עברו את אחוז החסימה. \n",
- " כעת כתבו פונקציה המקבלת את מילון התוצאות ומחזירה מילון שבו שם המפלגה ממופה עם מספר המנדטים שקיבלה המפלגה. \n",
+ "
\n",
+ " לאחר קבלת תוצאות האמת המפלגות פועלות להקים קואליציה. קואליציה מורכבת מ־61 מנדטים לפחות. \n",
+ " מנדט שווה: $\\dfrac{votes}{120}=2.077.775\\cong2,078$ קולות. \n",
+ " שימו לב, הקולות בתרגיל זה הם התוצאה של הסעיף הקודם. כלומר הקולות בניכוי הקולות עבור מפלגות שלא עברו את אחוז החסימה. \n",
+ " כעת כתבו פונקציה המקבלת את מילון התוצאות ומחזירה מילון שבו שם המפלגה ממופה עם מספר המנדטים שקיבלה המפלגה. \n",
" הפעילו את פונקנציית round על תוצאת החלוקה (השתמשו ב־2,078) כדי לקבל את מספר המנדטים השלם.\n",
"
\n",
+ "כדי להרכיב קואליציה דרושים 61 מנדטים. \n",
+ "המפלגות MidgeLandIsUs ו־NilsIsALeader לא מוכנות לשבת יחד בקואליציה. \n",
"כתבו פונקציה המקבלת את המילון המכיל את תוצאות המנדטים ומדפיסה קואליציה אפשרית עבור NilsIsALeader וקואליציה אפשרית עבור MidgeLandIsUs.\n",
"
\n",
- " אוטומט סופי דטרמיניסטי הוא מודל מתמטי שמגדיר אוסף של מצבים, וכללי מעבר ביניהם. \n",
- " נפתח בדוגמה: \n",
- " \n",
- " \n",
- " אוטומט סופי דטרמיניסטי שבודק האם מספר מסוים הוא מספר זוגי.\n",
- " \n",
+ "
\n",
+ "אוטומט סופי דטרמיניסטי הוא מודל מתמטי שמגדיר אוסף של מצבים, וכללי מעבר ביניהם. \n",
+ " נפתח בדוגמה: \n",
+ "\n",
+ "\n",
+ "אוטומט סופי דטרמיניסטי שבודק האם מספר מסוים הוא מספר זוגי.\n",
+ "\n",
"
\n",
- " המכונה מתחילה מ\"מצב התחלתי\" נתון כלשהו, במקרה שלנו \"מספר אי זוגי\". \n",
- " כל פעם שמתקבל קלט חדש, המכונה מחליטה לאיזה מצב לעבור לפי כללי המעבר הרשומים על החצים. \n",
+ "
\n",
+ " המכונה מתחילה מ\"מצב התחלתי\" נתון כלשהו, במקרה שלנו \"מספר אי זוגי\". \n",
+ " כל פעם שמתקבל קלט חדש, המכונה מחליטה לאיזה מצב לעבור לפי כללי המעבר הרשומים על החצים. \n",
" לדוגמה, עבור הקלט 2 ואז 7 ואז 4 (274) מכונת המצבים המופיעה מעלה תבצע את הפעולות הבאות:\n",
"
\n",
- " לכל מצב באוטומט סופי דטרמיניסטי יש \"סוג מצב\": מקבל או לא מקבל. \n",
- " מצב מקבל מסומן בעיגול כפול, כמו המצב \"מספר זוגי\" באוטומט דלעיל. \n",
- " אם בסוף הריצה הגענו למצב מקבל, סימן שהקלט תקין, ואם לא – סימן שהקלט אינו תקין. \n",
+ "
\n",
+ " לכל מצב באוטומט סופי דטרמיניסטי יש \"סוג מצב\": מקבל או לא מקבל. \n",
+ " מצב מקבל מסומן בעיגול כפול, כמו המצב \"מספר זוגי\" באוטומט דלעיל. \n",
+ " אם בסוף הריצה הגענו למצב מקבל, סימן שהקלט תקין, ואם לא – סימן שהקלט אינו תקין. \n",
" באוטומט הדוגמה שלנו כל קלט מספרי זוגי הוא תקין, וכל מספרי אי־זוגי נחשב ללא תקין.\n",
"
\n",
- " כל אפשרות הכלולה במצבי המעבר נקראת אות. אוסף כל האותיות הכלולות באוטומט מסוים נקרא א\"ב הקלט. \n",
- " שימו לב שבאוטומט יכולה להיות כמות גדולה של מצבים וכללי־מעבר, ובכל אוטומט יכול להיות יותר ממצב מקבל אחד. \n",
+ "
\n",
+ " כל אפשרות הכלולה במצבי המעבר נקראת אות. אוסף כל האותיות הכלולות באוטומט מסוים נקרא א\"ב הקלט. \n",
+ " שימו לב שבאוטומט יכולה להיות כמות גדולה של מצבים וכללי־מעבר, ובכל אוטומט יכול להיות יותר ממצב מקבל אחד. \n",
" כמו כן, \"אות\" בא\"ב יכולה לכלול יותר מתו אחד.\n",
"
\n",
- " כתבו תוכנה שקוראת קובץ ויוצרת ממנו אוטומט סופי דטרמיניסטי. \n",
- " בקובץ ישנו כל המידע הדרוש לבניית האוטומט, ורשימת קלטים. דוגמה לקובץ שכזה מופיעה מטה. \n",
+ "
\n",
+ " כתבו תוכנה שקוראת קובץ ויוצרת ממנו אוטומט סופי דטרמיניסטי. \n",
+ " בקובץ ישנו כל המידע הדרוש לבניית האוטומט, ורשימת קלטים. דוגמה לקובץ שכזה מופיעה מטה. \n",
" הדפיסו עבור כל קלט האם לאחר הרצתו האוטומט הגיע למצב מקבל או למצב לא מקבל.\n",
"
\n",
- " הפסקה הראשונה תמיד תראה כך: \n",
- " הקובץ תמיד יפתח במילה Definitions:. \n",
- " שורה אחריה תמיד תופיע המילה States:, ואחריה כל המצבים הקיימים במכונת המצבים, מופרדים בפסיק. \n",
- " שורה אחריה תמיד תופיע המילה Start:, ואחריה המצב ההתחלתי של המכונה. \n",
- " שורה אחריה תמיד תופיע המילה Accepting:, ואחריה כל המצבים שמוגדרים כמצבים מקבלים במכונת המצבים, מופרדים בפסיק. \n",
+ "
\n",
+ " הפסקה הראשונה תמיד תראה כך: \n",
+ " הקובץ תמיד יפתח במילה Definitions:. \n",
+ " שורה אחריה תמיד תופיע המילה States:, ואחריה כל המצבים הקיימים במכונת המצבים, מופרדים בפסיק. \n",
+ " שורה אחריה תמיד תופיע המילה Start:, ואחריה המצב ההתחלתי של המכונה. \n",
+ " שורה אחריה תמיד תופיע המילה Accepting:, ואחריה כל המצבים שמוגדרים כמצבים מקבלים במכונת המצבים, מופרדים בפסיק. \n",
"
\n",
- " הפסקה השנייה תמיד תראה כך: \n",
- " הפסקה תמיד תפתח במילה Transitions:, ואחריה רשימה של כללי מעבר. \n",
- " כל כלל מעבר מורכב מהמצב ממנו יוצאים, המצב אליו מגיעים ומה הקלט ש\"מפעיל\" את המעבר. \n",
- " השורה תכתב באופן הבא, כאשר X הוא המצב ממנו יוצאים, Z הוא המצב אליו מגיעים ו־Y היא רשימת הקלטים שמפעילה את מצב המעבר: \n",
- " X: Y -> Z \n",
+ "
\n",
+ " הפסקה השנייה תמיד תראה כך: \n",
+ " הפסקה תמיד תפתח במילה Transitions:, ואחריה רשימה של כללי מעבר. \n",
+ " כל כלל מעבר מורכב מהמצב ממנו יוצאים, המצב אליו מגיעים ומה הקלט ש\"מפעיל\" את המעבר. \n",
+ " השורה תכתב באופן הבא, כאשר X הוא המצב ממנו יוצאים, Z הוא המצב אליו מגיעים ו־Y היא רשימת הקלטים שמפעילה את מצב המעבר: \n",
+ " X: Y -> Z \n",
"
\n",
- " הפסקה השלישית תמיד תראה כך: \n",
- " הפסקה תמיד תפתח במילה Inputs:, ואחריה רשימה של קלטים תקינים. \n",
+ "
\n",
+ " הפסקה השלישית תמיד תראה כך: \n",
+ " הפסקה תמיד תפתח במילה Inputs:, ואחריה רשימה של קלטים תקינים. \n",
" כל שורת קלט תופיע בשורה נפרדת בקובץ, ותכלול את רצף הקלטים שיועברו לאוטומט אחד אחרי השני, כאשר הם מופרדים בפסיק.\n",
"
\n",
- " עבור הקלט הראשון, האוטומט יתחיל מהמצב ההתחלתי q0. האות 1 תשאיר אותו שם, כך גם 3, כך גם 1. מצב לא מקבל. \n",
- " עבור הקלט השני, האוטומט יתחיל מהמצב ההתחלתי q0. האות 2 תעביר אותו ל־q1, האות 7 תעביר אותו ל־q0, האות 4 תעביר אותו חזרה ל־q1. מצב מקבל. \n",
- " עבור הקלט השלישי, האוטומט יתחיל מהמצב ההתחלתי q0. האות 2 תעביר אותו ל־q1, האות 2 תשאיר אותו ב־q1 בכל המופעים הבאים שלה. מצב מקבל. \n",
+ "
\n",
+ " עבור הקלט הראשון, האוטומט יתחיל מהמצב ההתחלתי q0. האות 1 תשאיר אותו שם, כך גם 3, כך גם 1. מצב לא מקבל. \n",
+ " עבור הקלט השני, האוטומט יתחיל מהמצב ההתחלתי q0. האות 2 תעביר אותו ל־q1, האות 7 תעביר אותו ל־q0, האות 4 תעביר אותו חזרה ל־q1. מצב מקבל. \n",
+ " עבור הקלט השלישי, האוטומט יתחיל מהמצב ההתחלתי q0. האות 2 תעביר אותו ל־q1, האות 2 תשאיר אותו ב־q1 בכל המופעים הבאים שלה. מצב מקבל. \n",
"
\n",
- " פתירת האתגרים הללו עשויה להיות משימה מורכבת, ולטמון בחובה בעיות ומקרי קצה רבים. \n",
- " תארו לעצמכם כמה זמן היה נחסך לו היה מישהו פותר את הבעיות הנפוצות הללו עבור כל המתכנתים! \n",
+ "
\n",
+ " פתירת האתגרים הללו עשויה להיות משימה מורכבת, ולטמון בחובה בעיות ומקרי קצה רבים. \n",
+ " תארו לעצמכם כמה זמן היה נחסך לו היה מישהו פותר את הבעיות הנפוצות הללו עבור כל המתכנתים! \n",
"
\n",
- " כרעיון, מודול הוא פיסת תוכנה עצמאית המשרתת מטרה מוגדרת. \n",
- " המטרה יכולה להיות, לדוגמה, טיפול בתאריכים, יצירת נתונים אקראיים או תקשורת עם אתרי אינטרנט. \n",
- " בפייתון, מודול הוא קובץ המאגד הגדרות ופקודות, שיחדיו יוצרות אוסף כלים בתחום מסוים. \n",
+ "
\n",
+ " כרעיון, מודול הוא פיסת תוכנה עצמאית המשרתת מטרה מוגדרת. \n",
+ " המטרה יכולה להיות, לדוגמה, טיפול בתאריכים, יצירת נתונים אקראיים או תקשורת עם אתרי אינטרנט. \n",
+ " בפייתון, מודול הוא קובץ המאגד הגדרות ופקודות, שיחדיו יוצרות אוסף כלים בתחום מסוים. \n",
"
\n",
- " ניקח כדוגמה את המודול random, שמטרתו לעזור לנו ליצור מידע אקראי. \n",
+ "
\n",
+ " ניקח כדוגמה את המודול random, שמטרתו לעזור לנו ליצור מידע אקראי. \n",
" לפני שנוכל להשתמש ביכולותיו של המודול, נצטרך לבקש מפייתון לטעון אותו בעזרת מילת המפתח import:\n",
"
\n",
- " פעולה זו טוענת את המודול ומאפשרת לנו להשתמש בו בהמשך הקוד. נהוג להגיד שייבאנו את המודול random. \n",
- " עכשיו, כשהמודול יובא, אפשר להשתמש בו בקוד התוכנית שלנו באופן שיענה על הצורך ליצירת דברים אקראיים. \n",
+ "
\n",
+ " פעולה זו טוענת את המודול ומאפשרת לנו להשתמש בו בהמשך הקוד. נהוג להגיד שייבאנו את המודול random. \n",
+ " עכשיו, כשהמודול יובא, אפשר להשתמש בו בקוד התוכנית שלנו באופן שיענה על הצורך ליצירת דברים אקראיים. \n",
" כדי להבין איך להשתמש במודול ומהן יכולותיו, נוכל לקרוא מידע נוסף על אודותיו במגוון דרכים:\n",
"
\n",
- " במשחק הפוקימון \"פוקימון אדום\" אפשר לבחור בתור הפוקימון ההתחלתי את בלבזאור, את סקווירטל או את צ'רמנדר. \n",
- " על הפוקימון הטוב ביותר לבחירה ניטשים ויכוחים רבים עוד מאז שחרורו של המשחק ב־1996. \n",
+ "
\n",
+ " במשחק הפוקימון \"פוקימון אדום\" אפשר לבחור בתור הפוקימון ההתחלתי את בלבזאור, את סקווירטל או את צ'רמנדר. \n",
+ " על הפוקימון הטוב ביותר לבחירה ניטשים ויכוחים רבים עוד מאז שחרורו של המשחק ב־1996. \n",
" כדי לא להיקלע לעין הסערה, נבנה תוכנה שתבחר את הפוקימון עבורנו באופן אקראי.\n",
"
\n",
- " התיעוד של המודול random, כולל פונקציה בשם choice, שבאמצעותה נוכל לבחור איבר אקראי מתוך iterable. \n",
- " השימוש בתיעוד מומלץ במיוחד בהקשרי מודולים, שכן ההסברים שם בהירים, ופעמים רבות מובאות שם דוגמאות לשימוש בפונקציות של המודול. \n",
+ "
\n",
+ "התיעוד של המודול random, כולל פונקציה בשם choice, שבאמצעותה נוכל לבחור איבר אקראי מתוך iterable. \n",
+ " השימוש בתיעוד מומלץ במיוחד בהקשרי מודולים, שכן ההסברים שם בהירים, ופעמים רבות מובאות שם דוגמאות לשימוש בפונקציות של המודול. \n",
" נייבא את random ואז נשתמש ב־choice:\n",
"
\n",
- " השתמשו בפונקציה הנמצאת במודול random כדי לדמות הטלת קובייה בעלת 20 פאות (D20). \n",
- " הגרילו מספר בין 1 ל־20, הפעם בעזרת פונקציה שהיא לא choice. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " השתמשו בפונקציה הנמצאת במודול random כדי לדמות הטלת קובייה בעלת 20 פאות (D20). \n",
+ " הגרילו מספר בין 1 ל־20, הפעם בעזרת פונקציה שהיא לא choice. \n",
" השתמשו במקורות המידע שצוינו כדי למצוא את הפונקציה המתאימה למשימה.\n",
"
\n",
- " רוב התוכנות שבהן אתם משתמשים נעזרות במספר לא מועט של מודולים. \n",
+ "
\n",
+ " רוב התוכנות שבהן אתם משתמשים נעזרות במספר לא מועט של מודולים. \n",
" כרגע נתמקד בשימוש במודולים שמגיעים עם פייתון, אך בעתיד נשתמש במודולים שיצרו מתכנתים אחרים, ואף ניצור מודולים בעצמנו.\n",
"
\n",
- " במקרה שהצגנו, אין לנו באמת צורך בכל הפונקציות הנמצאות במודול math, אלא רק בפונקציה factorial. \n",
- " תעלול נחמד שאפשר לעשות הוא לייבא רק את factorial באמצעות מילת המפתח from: \n",
+ "
\n",
+ " במקרה שהצגנו, אין לנו באמת צורך בכל הפונקציות הנמצאות במודול math, אלא רק בפונקציה factorial. \n",
+ " תעלול נחמד שאפשר לעשות הוא לייבא רק את factorial באמצעות מילת המפתח from: \n",
"
\n",
- " כדאי לשים לב שלאחר שייבאנו בעזרת from נשתמש ישירות ב־factorial, מבלי להזכיר את השייכות שלה למודול math. \n",
+ "
\n",
+ " כדאי לשים לב שלאחר שייבאנו בעזרת from נשתמש ישירות ב־factorial, מבלי להזכיר את השייכות שלה למודול math. \n",
" אפשר גם לייבא יותר משם אחד מאותו מודול, במכה אחת:\n",
"
\n",
- " יבוא בעזרת כוכבית יגרום לכך שכל מה שמוגדר במודול \"יישפך\" לתוך התוכנית שלנו. \n",
+ "
\n",
+ " יבוא בעזרת כוכבית יגרום לכך שכל מה שמוגדר במודול \"יישפך\" לתוך התוכנית שלנו. \n",
" זה יאפשר לנו להשתמש בכל התוכן של math בלי להזכיר את שם המודול:\n",
"
\n",
- " פרקטיקה זו נחשבת מאוד לא מנומסת, ואתם מתבקשים לא להשתמש בה, אלא אם כן אלו ההוראות הכתובות בתיעוד של המודול. \n",
+ "
\n",
+ " פרקטיקה זו נחשבת מאוד לא מנומסת, ואתם מתבקשים לא להשתמש בה, אלא אם כן אלו ההוראות הכתובות בתיעוד של המודול. \n",
" ישנן לא מעט סיבות הגיוניות מאחורי איסור זה:\n",
"
זה מקשה על מתכנת שקורא את הקוד להבין איפה הוגדרו ceil, floor, e ו־pow.
\n",
- "
אנחנו \"מזהמים\" את הסביבה שלנו בהגדרות רבות שלעולם לא נשתמש בהן.
\n",
- "
חלק מהכלים שבהם תשתמשו בעתיד לא ידעו לזהות את השמות הללו, כיוון שלא ייבאתם אותם מפורשות.
\n",
+ "
\n",
+ "
זה מקשה על מתכנת שקורא את הקוד להבין איפה הוגדרו ceil, floor, e ו־pow.
\n",
+ "
אנחנו \"מזהמים\" את הסביבה שלנו בהגדרות רבות שלעולם לא נשתמש בהן.
\n",
+ "
חלק מהכלים שבהם תשתמשו בעתיד לא ידעו לזהות את השמות הללו, כיוון שלא ייבאתם אותם מפורשות.
\n",
"
"
]
},
@@ -489,18 +489,18 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### שינוי שם ביבוא"
+ "### שינוי שם ביבוא"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- " המודול turtle הוא דרך פופולרית ללמד ילדים תכנות באמצעים גרפיים. \n",
- " תכנות ב־turtle הוא מעין משחק: ישנו צב שהולך במרחב, ומשאיר צבע בכל מקום שאליו הוא מגיע. \n",
- " אפשר להורות לצב בכמה מעלות להסתובב לכל כיוון, ולאיזה מרחק ללכת בכיוון שאליו הוא מופנה. \n",
- " כך, בסוף מסלול הטיול של הצב, מתקבל ציור מלא חן. \n",
+ "
\n",
+ " המודול turtle הוא דרך פופולרית ללמד ילדים תכנות באמצעים גרפיים. \n",
+ " תכנות ב־turtle הוא מעין משחק: ישנו צב שהולך במרחב, ומשאיר צבע בכל מקום שאליו הוא מגיע. \n",
+ " אפשר להורות לצב בכמה מעלות להסתובב לכל כיוון, ולאיזה מרחק ללכת בכיוון שאליו הוא מופנה. \n",
+ " כך, בסוף מסלול הטיול של הצב, מתקבל ציור מלא חן. \n",
" הרעיון נוצר כחלק משפת התכנות Logo בשנת 1967.\n",
"
\n",
- " נראה דוגמה לתוצר של ריצת תוכנית שכזו, שבה אנחנו משרטטים 100 ריבועים בהיסט של מעלה אחת בכל פעם. \n",
+ "
\n",
+ " נראה דוגמה לתוצר של ריצת תוכנית שכזו, שבה אנחנו משרטטים 100 ריבועים בהיסט של מעלה אחת בכל פעם. \n",
" אנחנו ממליצים לשחק עם המודול קצת (זה כיף!) ולראות אם אתם מצליחים לצייר כוכב, לדוגמה :)\n",
"
\n",
- " כך אפשר לקצר את שם המודול שאנחנו מייבאים, ולהימנע מסרבול מיותר. \n",
+ "
\n",
+ " כך אפשר לקצר את שם המודול שאנחנו מייבאים, ולהימנע מסרבול מיותר. \n",
" למרות זאת, יבוא מודול תחת שם אחר נחשב פרקטיקה לא מנומסת, שעלולה לבלבל קוראים שבקיאים בשמות המודולים הקיימים.\n",
"
\n",
- " לשימוש במודולים יש כללי סגנון שמוסכמים על רוב המתכנתים. \n",
- " הם מופיעים במסמך בשם PEP8, שמטרתו להגדיר איך נראה קוד פייתון המסוגנן כראוי. \n",
+ "
\n",
+ " לשימוש במודולים יש כללי סגנון שמוסכמים על רוב המתכנתים. \n",
+ " הם מופיעים במסמך בשם PEP8, שמטרתו להגדיר איך נראה קוד פייתון המסוגנן כראוי. \n",
" הנה כמה כללים שראוי שתעקבו אחריהם:\n",
"
\n",
- " בתרגילים הבאים השתמשו באינטרנט כדי למצוא מודולים ופונקציות שיסייעו לכם לפתור את התרגיל. \n",
+ "
\n",
+ " בתרגילים הבאים השתמשו באינטרנט כדי למצוא מודולים ופונקציות שיסייעו לכם לפתור את התרגיל. \n",
" נסו להימנע מחיפוש ומקריאה של פתרונות לתרגיל המסוים המופיע במחברת (כמו חיפושים הכוללים \"חפיסת קלפים\").\n",
"
\n",
- " כתבו פונקציה שמקבלת נתיב לתיקייה, ומחזירה את רשימת כל הקבצים שמתחילים ברצף האותיות \"deep\" באותה תיקייה. \n",
+ "
\n",
+ " כתבו פונקציה שמקבלת נתיב לתיקייה, ומחזירה את רשימת כל הקבצים שמתחילים ברצף האותיות \"deep\" באותה תיקייה. \n",
" בדקו שהפעלת הפונקציה על התיקייה images מחזירה שני קבצים.\n",
"
\n",
- " כתבו פונקציה שמקבלת תאריך עתידי בתצורה YYYY-MM-DD, ומדפיסה את מספר הימים שנשארו עד שנגיע לתאריך המיוחל. \n",
+ "
\n",
+ " כתבו פונקציה שמקבלת תאריך עתידי בתצורה YYYY-MM-DD, ומדפיסה את מספר הימים שנשארו עד שנגיע לתאריך המיוחל. \n",
" לדוגמה, אם התאריך היום הוא 2020-05-04 וקיבלנו כקלט 2020-05-25, הפונקציה תחזיר 21.\n",
"
"
]
@@ -827,18 +826,18 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### אין לי וִנִגְרֶט"
+ "### אין לי וִנִגְרֶט"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- " כתבו תוכנה שמקבלת כקלט מהמשתמש שני תאריכים בתצורה: YYYY-MM-DD. \n",
- " התוכנה תגריל תאריך חדש שנמצא בין שני התאריכים שהמשתמש הזין כקלט. \n",
- " לדוגמה, עבור הקלטים 1912-06-23 ו־1954-06-07, פלט אפשרי הוא 1939-09-03. \n",
- " כיוון שאני הולך למכולת רק בימי שני ואני צרכן כבד של רוטב ויניגרט, אם התאריך נופל על יום שני, הדפיסו: \"אין לי ויניגרט!\" \n",
+ "
\n",
+ " כתבו תוכנה שמקבלת כקלט מהמשתמש שני תאריכים בתצורה: YYYY-MM-DD. \n",
+ " התוכנה תגריל תאריך חדש שנמצא בין שני התאריכים שהמשתמש הזין כקלט. \n",
+ " לדוגמה, עבור הקלטים 1912-06-23 ו־1954-06-07, פלט אפשרי הוא 1939-09-03. \n",
+ " כיוון שאני הולך למכולת רק בימי שני ואני צרכן כבד של רוטב ויניגרט, אם התאריך נופל על יום שני, הדפיסו: \"אין לי ויניגרט!\" \n",
" רמז: קראו על EPOCH.\n",
"
\n",
" במחברת זו נרכוש כלים נוספים שיאפשרו לנו גמישות רבה יותר בהגדרת פונקציות ובשימוש בהן.\n",
"
"
]
@@ -54,23 +54,23 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## שימוש מתקדם בפונקציות"
+ "## שימוש מתקדם בפונקציות"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "### העברת ארגומנטים בעזרת שם"
+ "### העברת ארגומנטים בעזרת שם"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- " כאשר אנחנו קוראים לפונקציה, יישלחו לפי הסדר הארגומנטים שנעביר אל הפרמטרים שמוגדרים בכותרת הפונקציה. \n",
- " מצב כזה נקרא positional arguments (\"ארגומנטים לפי מיקום\"). \n",
+ "
\n",
+ " כאשר אנחנו קוראים לפונקציה, יישלחו לפי הסדר הארגומנטים שנעביר אל הפרמטרים שמוגדרים בכותרת הפונקציה. \n",
+ " מצב כזה נקרא positional arguments (\"ארגומנטים לפי מיקום\"). \n",
" נסתכל על פונקציה שמקבלת טווח (סוף והתחלה, בסדר הזה) ומחזירה רשימה של כל המספרים השלמים בטווח:\n",
"
\n",
- " לפעמים נרצה לשנות את סדר הארגומנטים שאנחנו שולחים לפונקציה. \n",
+ "
\n",
+ " לפעמים נרצה לשנות את סדר הארגומנטים שאנחנו שולחים לפונקציה. \n",
" נעשה זאת בקריאה לפונקציה, על־ידי העברת שם הארגומנט ולאחר מכן העברת הערך שאנחנו רוצים להעביר אליו: \n",
"
\n",
- " בשורה הזו הפכנו את סדר הארגומנטים. \n",
- " כיוון שבקריאה כתבנו את שמות הפרמטרים התואמים לכותרת הפונקציה, הערכים נשלחו למקום הנכון. \n",
- " השיטה הזו נקראת keyword arguments (\"ארגומנטים לפי שם\"), ובה אנחנו מעבירים את הארגומנטים שלנו לפי שמות הפרמטרים בכותרת הפונקציה. \n",
- " אנחנו משתמשים בשיטה הזו אפילו כשאנחנו לא רוצים לשנות את סדר הארגומנטים, אלא רק לעשות קצת סדר בקוד. \n",
+ "
\n",
+ " בשורה הזו הפכנו את סדר הארגומנטים. \n",
+ " כיוון שבקריאה כתבנו את שמות הפרמטרים התואמים לכותרת הפונקציה, הערכים נשלחו למקום הנכון. \n",
+ " השיטה הזו נקראת keyword arguments (\"ארגומנטים לפי שם\"), ובה אנחנו מעבירים את הארגומנטים שלנו לפי שמות הפרמטרים בכותרת הפונקציה. \n",
+ " אנחנו משתמשים בשיטה הזו אפילו כשאנחנו לא רוצים לשנות את סדר הארגומנטים, אלא רק לעשות קצת סדר בקוד. \n",
" נבחן, לדוגמה, את המקרה של הפונקציה random.randrange – נעים יותר לראות קריאה לפונקציה עם שמות הפרמטרים:\n",
"
\n",
- " למרות השימוש בסימן =, לא מדובר פה בהשמה במובן הקלאסי שלה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " למרות השימוש בסימן =, לא מדובר פה בהשמה במובן הקלאסי שלה. \n",
" זוהי צורת כתיבה מיוחדת בקריאה לפונקציות שהמטרה שלה היא לסמן \"העבר לפרמטר ששמו כך־וכך את הערך כך־וכך\".\n",
"
\n",
- " המימוש שלנו לא מושלם. הפעולה המקורית, get על מילון, פועלת בצורה מתוחכמת יותר. \n",
+ "
\n",
+ " המימוש שלנו לא מושלם. הפעולה המקורית, get על מילון, פועלת בצורה מתוחכמת יותר. \n",
" אפשר להעביר לה פרמטר נוסף, שקובע מה יחזור אם המפתח שהעברנו בפרמטר הראשון לא נמצא במילון:\n",
"
\n",
- " שימו לב להתנהגות המיוחדת של הפעולה get! \n",
- " אם המפתח שהעברנו בארגומנט הראשון לא קיים במילון, היא מחזירה את הערך שכתוב בארגומנט השני. \n",
- " אפשר להעביר לה ארגומנט אחד, ואפשר להעביר לה שני ארגומנטים. היא מתפקדת כראוי בשני המצבים. \n",
- " זו לא פעם ראשונה שאנחנו רואים פונקציות כאלו. למעשה, בשבוע שעבר למדנו על פעולות builtins רבות שמתנהגות כך: \n",
- " range, enumerate ו־round, כולן יודעות לקבל מספר משתנה של ארגומנטים.\n",
+ "
\n",
+ " שימו לב להתנהגות המיוחדת של הפעולה get! \n",
+ " אם המפתח שהעברנו בארגומנט הראשון לא קיים במילון, היא מחזירה את הערך שכתוב בארגומנט השני. \n",
+ " אפשר להעביר לה ארגומנט אחד, ואפשר להעביר לה שני ארגומנטים. היא מתפקדת כראוי בשני המצבים. \n",
+ " זו לא פעם ראשונה שאנחנו רואים פונקציות כאלו. למעשה, בשבוע שעבר למדנו על פעולות builtins רבות שמתנהגות כך: \n",
+ "range, enumerate ו־round, כולן יודעות לקבל מספר משתנה של ארגומנטים.\n",
"
\n",
- " נניח לפעולה get בינתיים. אל דאגה, נחזור אליה בקרוב. \n",
- " בזמן שאנחנו נחים מפעולות על מילונים יום האהבה מתקרב, וחנות הוורדים הקרובה מעוניינת להעלות את מחירי כל מוצריה בשקל אחד. \n",
- " התבקשנו לבנות עבורם פונקציה שמקבלת רשימת מחירים, ומחזירה רשימה שבה כל איבר גדול ב־1 מרשימת המחירים המקורית. \n",
+ "
\n",
+ " נניח לפעולה get בינתיים. אל דאגה, נחזור אליה בקרוב. \n",
+ " בזמן שאנחנו נחים מפעולות על מילונים יום האהבה מתקרב, וחנות הוורדים הקרובה מעוניינת להעלות את מחירי כל מוצריה בשקל אחד. \n",
+ " התבקשנו לבנות עבורם פונקציה שמקבלת רשימת מחירים, ומחזירה רשימה שבה כל איבר גדול ב־1 מרשימת המחירים המקורית. \n",
" ניגש לעבודה:\n",
"
\n",
- " בתוך זמן קצר הפונקציה שבנינו הופכת ללהיט היסטרי בחנויות הוורדים. \n",
- " מנהל קרטל הוורדים הבין־לאומי ג'וזפה ורדי יוצר איתנו קשר, ומבקש לשכלל התוכנה כך שיוכל להעלות את מחירי המוצרים כרצונו. \n",
- " כדי לעמוד בדרישה, נבנה פונקציה שמקבלת רשימה, ובנוסף אליה את המחיר שיתווסף לכל איבר ברשימה זו. \n",
- " כך, אם הקורא לפונקציה יעביר כארגומנט השני את הערך 2, כל איבר ברשימה יגדל ב־2. \n",
+ "
\n",
+ " בתוך זמן קצר הפונקציה שבנינו הופכת ללהיט היסטרי בחנויות הוורדים. \n",
+ " מנהל קרטל הוורדים הבין־לאומי ג'וזפה ורדי יוצר איתנו קשר, ומבקש לשכלל התוכנה כך שיוכל להעלות את מחירי המוצרים כרצונו. \n",
+ " כדי לעמוד בדרישה, נבנה פונקציה שמקבלת רשימה, ובנוסף אליה את המחיר שיתווסף לכל איבר ברשימה זו. \n",
+ " כך, אם הקורא לפונקציה יעביר כארגומנט השני את הערך 2, כל איבר ברשימה יגדל ב־2. \n",
" נממש בקלילות:\n",
"
\n",
- " ורדי פוצח בשירה מרוב אושר, ומבקש שכלול אחרון לפונקציה, אם אפשר. \n",
- " אם הקורא לפונקציה העביר לה רק את רשימת המחירים, העלו את כל המחירים בשקל, כברירת מחדל. \n",
- " אם כן הועבר הארגומנט השני, העלו את המחיר לפי הערך שצוין באותו ארגומנט. \n",
+ "
\n",
+ " ורדי פוצח בשירה מרוב אושר, ומבקש שכלול אחרון לפונקציה, אם אפשר. \n",
+ " אם הקורא לפונקציה העביר לה רק את רשימת המחירים, העלו את כל המחירים בשקל, כברירת מחדל. \n",
+ " אם כן הועבר הארגומנט השני, העלו את המחיר לפי הערך שצוין באותו ארגומנט. \n",
"
\n",
- " כשאנחנו רוצים להגדיר פרמטר עם ערך ברירת מחדל, נוכל לקבוע את ערך ברירת המחדל שלו בכותרת הפונקציה. \n",
- " אם יועבר ארגומנט שכזה לפונקציה – פייתון תשתמש בערך שהועבר. \n",
+ "
\n",
+ " כשאנחנו רוצים להגדיר פרמטר עם ערך ברירת מחדל, נוכל לקבוע את ערך ברירת המחדל שלו בכותרת הפונקציה. \n",
+ " אם יועבר ארגומנט שכזה לפונקציה – פייתון תשתמש בערך שהועבר. \n",
" אם לא – יילקח ערך ברירת המחדל שהוגדר בכותרת הפונקציה. \n",
"
\n",
- " במקרה שלנו הגדרנו את הפרמטר increment_by עם ערך ברירת המחדל 1. \n",
- " קריאה לפונקציה עם ארגומנט אחד בלבד (רשימת המחירים) תגדיל את כל המחירים ב־1, שהרי הוא ערך ברירת המחדל. \n",
+ "
\n",
+ " במקרה שלנו הגדרנו את הפרמטר increment_by עם ערך ברירת המחדל 1. \n",
+ " קריאה לפונקציה עם ארגומנט אחד בלבד (רשימת המחירים) תגדיל את כל המחירים ב־1, שהרי הוא ערך ברירת המחדל. \n",
" קריאה לפונקציה עם שני ארגומנטים (רשימת המחירים, סכום ההעלאה) תגדיל את כל המחירים בסכום ההעלאה שהועבר.\n",
"
\n",
- " ממשו את פונקציית get המלאה. הפונקציה תקבל מילון, מפתח ו\"ערך לשעת חירום\". \n",
- " החזירו את הערך השייך למפתח שהתקבל. אחרת – החזירו את הערך לשעת החירום שהועבר לפונקציה. \n",
+ "
\n",
+ "
\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " ממשו את פונקציית get המלאה. הפונקציה תקבל מילון, מפתח ו\"ערך לשעת חירום\". \n",
+ " החזירו את הערך השייך למפתח שהתקבל. אחרת – החזירו את הערך לשעת החירום שהועבר לפונקציה. \n",
" אם לא הועבר ערך לשעת חירום והמפתח לא נמצא במילון, החזירו None. \n",
"
\n",
- " נדגים את אותו עיקרון עם כמה ערכי ברירת מחדל. \n",
+ "
\n",
+ " נדגים את אותו עיקרון עם כמה ערכי ברירת מחדל. \n",
" אם הדרישה הייתה, לדוגמה, להוסיף לפונקציה גם אפשרות להנחה במחירי הפרחים, היינו יכולים לממש זאת כך:\n",
"
\n",
- " אך מה יקרה כשנרצה לתת רק הנחה? \n",
- " במקרה כזה, כשנרצה \"לדלג\" מעל אחד מערכי ברירת המחדל, נצטרך להעביר את שמות הפרמטרים בקריאה לפונקציה. \n",
+ "
\n",
+ " אך מה יקרה כשנרצה לתת רק הנחה? \n",
+ " במקרה כזה, כשנרצה \"לדלג\" מעל אחד מערכי ברירת המחדל, נצטרך להעביר את שמות הפרמטרים בקריאה לפונקציה. \n",
" בדוגמה הבאה אנחנו מעלים את המחיר ב־1 (כי זו ברירת המחדל), ומורידים אותו ב־5: \n",
"
\n",
" זה אמנם עניין של סגנון, אבל יש יופי וסדר בציון שמות הפרמטרים גם כשלא חייבים:\n",
"
"
]
@@ -505,16 +505,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### מספר משתנה של ארגומנטים"
+ "### מספר משתנה של ארגומנטים"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
- " הפונקציה הפייתונית max, למשל, מתנהגת באופן משונה. \n",
- " היא יודעת לקבל כל מספר שהוא של ארגומנטים, ולהחליט מי מהם הוא הגדול ביותר. \n",
+ "
\n",
+ " הפונקציה הפייתונית max, למשל, מתנהגת באופן משונה. \n",
+ " היא יודעת לקבל כל מספר שהוא של ארגומנטים, ולהחליט מי מהם הוא הגדול ביותר. \n",
" ראו בעצמכם!\n",
"
\n",
- " נוכל גם אנחנו לממש פונקציה שמקבלת מספר משתנה של פרמטרים די בקלות. \n",
+ "
\n",
+ " נוכל גם אנחנו לממש פונקציה שמקבלת מספר משתנה של פרמטרים די בקלות. \n",
" נתחיל מלממש פונקציה טיפשית למדי, שמקבלת מספר משתנה של פרמטרים ומדפיסה אותם:\n",
"
\n",
- " מה התרחש בדוגמה האחרונה, בעצם? \n",
- " כשפרמטר מוגדר בכותרת הפונקציה עם הסימן כוכבית, אפשר לשלוח אל אותו פרמטר מספר בלתי מוגבל של ארגומנטים. \n",
+ "
\n",
+ " מה התרחש בדוגמה האחרונה, בעצם? \n",
+ " כשפרמטר מוגדר בכותרת הפונקציה עם הסימן כוכבית, אפשר לשלוח אל אותו פרמטר מספר בלתי מוגבל של ארגומנטים. \n",
" הערך שייכנס לפרמטר יהיה מסוג tuple, שאיבריו הם כל האיברים שהועברו כארגומנטים.\n",
"
\n",
- " כותרת הפונקציה יכולה לכלול משתנים נוספים לפני הכוכבית. \n",
+ "
\n",
+ " כותרת הפונקציה יכולה לכלול משתנים נוספים לפני הכוכבית. \n",
" נראה לדוגמה פונקציה שמקבלת גובה הנחה ואת מחירי כל המוצרים שקנינו, ומחזירה את הסכום הסופי שעלינו לשלם:\n",
"
\n",
- " אף שבמבט ראשון הפונקציה get_final_price עשויה להיראות מגניבה, כדאי להיזהר משימוש מוגזם בתכונה הזו של פייתון. \n",
+ "
\n",
+ " אף שבמבט ראשון הפונקציה get_final_price עשויה להיראות מגניבה, כדאי להיזהר משימוש מוגזם בתכונה הזו של פייתון. \n",
" הדוגמה הזו אמנם מדגימה גמישות יוצאת דופן של פייתון, אבל ככלל היא דוגמה גרועה מאוד לשימוש בכוכבית.\n",
"
\n",
- " כתבו פונקציה בשם create_path שיכולה לקבל מספר בלתי מוגבל של ארגומנטים. \n",
- " הפרמטר הראשון יהיה אות הכונן שבו הקבצים מאוחסנים (לרוב \"C\"), והפרמטרים שאחריו יהיו שמות של תיקיות וקבצים. \n",
- " שרשרו אותם בעזרת התו \\ כדי ליצור מהם מחרוזת המייצגת נתיב במחשב. אחרי האות של הכונן שימו נקודתיים. \n",
+ "
\n",
+ " כתבו פונקציה בשם create_path שיכולה לקבל מספר בלתי מוגבל של ארגומנטים. \n",
+ " הפרמטר הראשון יהיה אות הכונן שבו הקבצים מאוחסנים (לרוב \"C\"), והפרמטרים שאחריו יהיו שמות של תיקיות וקבצים. \n",
+ " שרשרו אותם בעזרת התו \\ כדי ליצור מהם מחרוזת המייצגת נתיב במחשב. אחרי האות של הכונן שימו נקודתיים. \n",
" הניחו שהקלט שהמשתמש הכניס הוא תקין.\n",
"
"
]
},
@@ -746,14 +746,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### מספר משתנה של ארגומנטים עם שמות"
+ "### מספר משתנה של ארגומנטים עם שמות"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "
\n",
+ "
\n",
" בתחילת המחברת למדנו כיצד מעבירים לפונקציות ארגומנטים בעזרת שם:\n",
"
\n",
- " אבל מה אם נרצה להעביר לפונקציה שלנו מספר בלתי מוגבל של ארגומנטים לפי שם? \n",
- " נביא כדוגמה את הפעולה format על מחרוזות. \n",
- " format היא פונקציה גמישה בכל הנוגע לכמות ולשמות של הארגומנטים שמועברים לה לפי שם. \n",
+ "
\n",
+ " אבל מה אם נרצה להעביר לפונקציה שלנו מספר בלתי מוגבל של ארגומנטים לפי שם? \n",
+ " נביא כדוגמה את הפעולה format על מחרוזות. \n",
+ "format היא פונקציה גמישה בכל הנוגע לכמות ולשמות של הארגומנטים שמועברים לה לפי שם. \n",
" נראה שתי דוגמאות לשימוש בה, שימוש שבמבט ראשון עשוי להיראות קסום:\n",
"
\n",
- " נכתוב גם אנחנו פונקציה שמסוגלת לקבל מספר בלתי מוגבל של ארגומנטים לפי שם. \n",
+ "
\n",
+ " נכתוב גם אנחנו פונקציה שמסוגלת לקבל מספר בלתי מוגבל של ארגומנטים לפי שם. \n",
" ניעזר תחילה בידידתנו הוותיקה, silly_function, כדי לראות איך הקסם קורה:\n",
"
\n",
- " ההתנהגות הזו מתרחשת כיוון שהשתמשנו בשתי כוכביות לפני שם המשתנה. \n",
- " השימוש בשתי כוכביות מאפשר לנו להעביר מספר בלתי מוגבל של ארגומנטים עם שם, באופן שמזכיר קצת את השימוש בכוכבית שראינו קודם. \n",
+ "
\n",
+ " ההתנהגות הזו מתרחשת כיוון שהשתמשנו בשתי כוכביות לפני שם המשתנה. \n",
+ " השימוש בשתי כוכביות מאפשר לנו להעביר מספר בלתי מוגבל של ארגומנטים עם שם, באופן שמזכיר קצת את השימוש בכוכבית שראינו קודם. \n",
" המשתנה שבו נשמרים הנתונים הוא מסוג מילון, ובו המפתחות יהיו שמות הארגומנטים שהועברו, והערכים – הערכים שהועברו לאותם שמות.\n",
"
\n",
- " אחרי שהבנו איך הסיפור הזה עובד, בואו ננסה ליצור פונקציה מעניינת יותר. \n",
+ "
\n",
+ " אחרי שהבנו איך הסיפור הזה עובד, בואו ננסה ליצור פונקציה מעניינת יותר. \n",
" הפונקציה שנכתוב תקבל כארגומנטים כמה גרם מכל רכיב צריך כדי להכין סושי, ותדפיס לנו מתכון:\n",
"
\n",
- " בדוגמה זו השתמשנו בעובדה שהפרמטר שמוגדר בעזרת שתי כוכביות הוא בהכרח מילון. \n",
+ "
\n",
+ " בדוגמה זו השתמשנו בעובדה שהפרמטר שמוגדר בעזרת שתי כוכביות הוא בהכרח מילון. \n",
" עברנו על כל המפתחות והערכים שבו בעזרת הפעולה items, והדפסנו את המתכון, רכיב אחר רכיב.\n",
"