הפרק הקודם:
פייתון 5 - רשימותמה נלמד
- מהי לולאה ומהי השימוש שלה
- for, while
- for in range
- for in enumerate
- break-continue
לולאות
לולאה כמו השם שלה היא משהו שחוזר על עצמה.
דוגמא - מחזור יום לילה
כדור הארץ מסתובב סביב השמש מה שגורם לחלק מכדור הארץ להיות באור יום, והחלק האחר בלילה.
מחזוריות זו אפשר לייצג בפסודו קוד:
1 | כל עוד השמש חיה: |
כפי שאתם יודעים השמש לא תחיה לעד!
מה קורה אבל כשהשמש לא תחיה? מן הסתם כבר לא יהיה כדור הארץ, אך גם המחזוריות של יום-לילה כבר לא יהיה.
זו דוגמא לתנאי עצירה
.
מתישהו אנחנו צריכים לעצור את הלולאה אחרת היא תקרה לעד.
דוגמא - הלופ של משחק מחשב
משחק מחשב עובד בלולאה כאשר הצעד הראשון שלה זה לעדכן את המשחק - להזיז את השחקנים, לבדוק התנגשויות וכדו’…
והצעד השני זה לצייר על המסך את כל השחקנים והסביבה.
אז בפסודו קוד זה נראה כך:
1 | כל עוד לא יצאנו מהמשחק: |
או בקוד פייתוני:
1 | isPlaying = True |
לולאה זה קטע קוד שרץ פעם אחת או יותר.
while
הלולאה הכי בסיסית היא -
בזמן שתנאי מתקיים, תריץ את הקוד הזה,
אם התנאי לא מתקיים, תריץ קוד אחר.
ובקוד זה נראה כך:
*משהו שכדאי לשים לב אליו, קוד פייתוני הוא כמעט כמו אנגלית, קוד צריך להיות מובן רק מקריאה ראשונה שלו.
1 | condition = True |
אם נתרגם את זה מאנגלית זה ייקרא כך:
בזמן שהתנאי שלנו מתקיים, תדפיסו למסך, תגדילו את הסופר באחד,
אם הסופר שווה ל 10, יש לשים בתנאי שלנו לא נכון.
שימו לב שאחרי ששמנו במשתנה שלנו “לא נכון” אז התנאי שלנו יפסיק להתקיים.
כעת תנסו לאתחל את המשתנה condition
לFalse
, מה בעצם מודפס?
יודפס Bye world.
התנאי שלנו לא מתקיים בלולאה הזו, ולכן הelse יירוץ במקומו.
תרגיל
- תקלטו מס’ שיהווה אורך בסיס למשולש.
הדפיסו למסך משולש ישר זווית שמורכב מכוכביות שהבסיס שלו הוא בגודל האורך שקלטתם.
- אם לא הצלחתם לא נורא, תקראו את התשובה ותנסו להבין למה זה ככה!
1 | base = int(input('Triangle base: ')) |
השתמשנו בשני לולאות, אחת על מנת להדפיס שורה חדשה, והשנייה על מנת להדפיס את השורה של הכוכביות.
אם ננסה להסביר את האלגוריתם בעברית זה יהיה יחסית פשוט:
אנחנו רוצים להדפיס כוכבית אחת + כוכביות נוספות עבור כל שורה.
שורה ראשונה נדפיס כוכבית אחת,
שורה שנייה נדפיס כוכבית שני כוכביות
ועד למספר שקלטנו כבסיס.
זה למה התנאי של הלולאה השנייה הוא עד לסופר הראשון של השורות.
קודם אנחנו רוצים לדעת כמה שורות אנחנו רצים, וכל שורה אנחנו מדפיסים כוכביות לפי השורה.
for
זוכרים משיעור קודם את הרשימות?
כעת נוכל לשלב אותם עם לולאות.
אם אנחנו משתמשים בהדפסה הבסיסית למערך אז אנחנו מקבלים תוצאה די מוזרה:
1 | arr = [1,2,3] |
אנחנו רוצים להדפיס את הרשימה בצורה יפה יותר,
נניח יש לנו מערך שמות ואנחנו רוצים ליצור רשימה שמית עם מספרים, למשל:
- Iluga
- Vasily
- Dana
נשתמש בזה ככה:
1 | arr = ['Ilya' , 'Vasily' , 'Dana'] |
זוכרים את ה-f
?
בעזרתו אנחנו יכולים לפרמט מחרוזת בצורה יפה מבלי לחבר מחרוזות.
אחרת היינו כותבים ככה:
1 | print(string(index) + '. ' + name) |
תרגיל
- יש לנו שמות של כוכבי לכת, התבקשתם לכתוב תכנית שמקבלת שם מהמשתמש ולכתוב את השם המלא ע”פ החיפוש.
שמות כוכבי הלכת הם:
[‘mercury’, ‘venus’ , ‘earth’, ‘mars’, ‘jupiter’, ‘saturn’, ‘uranus’, ‘neptune’]
אם המשתמש כתב ‘mer’ על התכנית להחזיר mercury.
1 | names = ['mercury', 'venus' , 'earth', 'mars', 'jupiter', 'saturn', 'uranus', 'neptune'] |
for range
לולאת הfor in range היא לולאה שמקלה עלינו לרוץ מספר פעמים מסוים,
כפי שראינו מקודם אנחנו יכולים לרוץ עם while ולעדכן משתנה סופר, ואז לבדוק אותו אם הוא הגיע למספר מסוים:
1 | counter = 0 |
במקום זה פייתון מאפשר לנו בקלות מאוד לרוץ על רשימה של מספרים בעזרת הפעולה range:
1 | for i in range(5): |
תרגיל
- תקלטו מספר מהמשתמש ותדפיסו את כל המספרים הזוגיים עד המספר שקלטתם מהמשתמש.
- תממשו את המשחק 7 בום - תקלטו מספר מהמשתמש ותדפיסו את כל המספרים עד למספר שהמשתמש בחר,
אם המספר מכיל את הספרה 7 או מתחלק ב7 אז תדפיסו “boom” במקום.
1 | num = int(input('Enter a number: ')) |
for enumerate
הfor הזה הוא שילוב של for in רגיל וfor range.
הוא נותן לכם גם את האלמנט ברשימה וגם את האינדקס שלו.
תנסו את הקוד הבא:
1 | for index, value in enumerate(["p", "y", "t", "h", "o", "n"]): |
break- continue
כפי שראינו עד כה יש מילים שמורות בפייתון שעוזרות לנו לנהל איך הקוד שלנו רץ,
if,elif,else יוצרות לנו תנאים - קוד ירוץ רק בתנאי מסוים שקורה.
לולאות עוזרות לנו לבצע קוד מסוים מספר פעמים בהתאם לתנאי או למספר שאנו קיבלנו.
אזי פייתון מאפשר שליטה נוספת בלולאות שלנו - במידה ונרצה להמשיך או לבצע סיום לולאה מוקדמת.
break - לצאת מהלולאה
continue - לצאת מהלולאה ולהמשיך אותה הלאה
דוגמא:
1 | tries = 10 |
תרגילים
- תקלטו מהמשתמש את השם שלו ותדפיסו כל אות בשורה חדשה.
למשל:
1 | Enter your name: iluga |
- תקלטו מספר מהמשתמש ותכניסו לרשימה את כל המספרים שנכנסים לסדרת פיבונאצ’י עד למספר הזה כולל.
מהי סדרת פיבונאצ’י? זוהי סדרת מספרים שהמספר הבא שלה הוא סכום הקודמים.אז אם המשתמש קלט 8 הרשימה צריכה להכיל את המספרים:1
0 1 1 2 3 5 8 13 21 34....
1
[0,1,1,2,3,5,8]
- תכתבו תוכנה אשר מקבלת מספרים מהמשתמש עד שהקלט הוא ‘done’ ותדפיסו את התוצאות הבאות:
- ממוצע של המספרים.
- המספר הכי גדול.
- המספר הכי קטן.
1 | name = input('Enter your name: ') |
זוכרים שמחרוזת זה בעצם מערך של תווים? אנחנו יכולים בקלות מאוד לגשת לכל תו במחרוזת בעזרת הלולאה!
1 | limit = int(input('Enter the limit of fibonacci: ')) |
סדרת פיבונאצ’י מורכבת ממספרים חיוביים שלמים לכן אין צורך לבדוק במספר שהוא קטן מ0
.
לאחר מכן זה מאוד פשוט לחשב, המערך מאותחל עם שלושת המספרים הראשונים וזה מאוד נפוץ לפתור את התרגיל ככה אחרת זה קוד מעט מסובך יותר,
תזכרו שקוד פשוט יותר הוא קוד טוב יותר!
מאוד קל לכתוב קוד מורכב אך מאוד קשה לכתוב אחד פשוט.
הלולאה רצה תמיד אך התנאי שלה פשוט לא בתחילת הלולאה אלה בגוף שלה!
אנחנו בודקים אם החישוב שלנו עולה על ההגבלה של הסדרה שקיבלנו מהמשתמש, ואם כן אנחנו יוצאים ממנה.
אחרת אנחנו ממשיכים בה רגיל ולבסוף מדפיסים.
1 | userInput = '' |
השלב הראשון זה לקחת מספרים מהמשתמש, כרגע אנחנו לא בודקים אם המחרוזת שהוא הקיש זה באמת מספר - זה נושא מתקדם יותר.
לכן אנחנו מניחים שזה מספר אלה אם כן הוא כתב 'done'
.
לאחר שקיבלנו את כל המספרים שלנו, אנחנו רצים על כל מספר ומחשבים:
מוסיפים אותו לסופר של הממוצע ולבסוף אנחנו מחלקים אותו בכמות האלמנטים במערך.
את המספר המינימאלי והמקסימלי בודקים ע”פ מספר אסטרונומי יש דרך אחרת לקחת את המספרים האלו אבל כרגע זו דרך מצוינת לאתחל אותם ידנית.