פייתון/לולאות
מתוך ויקיספר, אוסף ספרי הלימוד והמדריכים החופשי.
לולאות משמשות לחזרה על קטע קוד מספר פעמים. לולאה חוסכת בזמן כתיבת התוכנה ומסדרת את הקוד.
תוכן עניינים |
[עריכה] הצורך בלולאות
במספרים ופעולות חשבוניות, ראינו דוגמה להמרה בין סוגי מעלות שונים כיצד להמיר ממעלות בCelsius למעלות בFahrenheit. נניח שאנו רוצים להדפיס את התרגום למעלות Fahrenheit של מעלות הCelsius בערכים 0, 2, 4, ..., 20. ננסה לעשות זאת כך:
c = 0; f = 1.8 * c + 32; print str(c) + ' in Celsius is ' + str(f) + ' in Fahrenheit' c = 2; f = 1.8 * c + 32; print str(c) + ' in Celsius is ' + str(f) + ' in Fahrenheit' c = 4; f = 1.8 * c + 32; print str(c) + ' in Celsius is ' + str(f) + ' in Fahrenheit' c = 6; f = 1.8 * c + 32; print str(c) + ' in Celsius is ' + str(f) + ' in Fahrenheit' c = 8; f = 1.8 * c + 32; print str(c) + ' in Celsius is ' + str(f) + ' in Fahrenheit' c = 10; f = 1.8 * c + 32; print str(c) + ' in Celsius is ' + str(f) + ' in Fahrenheit' c = 12; f = 1.8 * c + 32; print str(c) + ' in Celsius is ' + str(f) + ' in Fahrenheit' c = 14; f = 1.8 * c + 32; print str(c) + ' in Celsius is ' + str(f) + ' in Fahrenheit' c = 16; f = 1.8 * c + 32; print str(c) + ' in Celsius is ' + str(f) + ' in Fahrenheit' c = 18; f = 1.8 * c + 32; print str(c) + ' in Celsius is ' + str(f) + ' in Fahrenheit' c = 20; f = 1.8 * c + 32; print str(c) + ' in Celsius is ' + str(f) + ' in Fahrenheit'
קל לראות שמשהו בעייתי בקוד, והבעייתיות היתה גוברת לו היינו פועלים בתחום גדול יותר, לדוגמה 0, 2, 4, ..., 100. בין היתר:
- הקוד ארוך ומסורבל מאד.
- תמיד ייתכן שהקוד כולל שגיאה כלשהי: ייתכן שטעינו בהעתקת הנוסחה הממירה, לדוגמה. כאן נצטרך לתקן את הקוד ב-11 מקומות.
בפרק זה נלמד להשתמש בלולאות, המאפשרות לתרגם את הקוד הקודם לקוד תמציתי יותר:
for c in range(0, 20, 2): f = 1.8 * c + 32; print str(c) + ' in Celsius is ' + str(f) + ' in Fahrenheit'
שתוצאתו דומה.
[עריכה] לולאת while
לולאת while היא לולאה הפועלת כל עוד תנאי מוגדר מתקיים. אופן כתיבת הלולאה הוא:
while <condition> <action>
כאשר condition הוא תנאי בוליאני, ו-action הוא ביטוי (או בלוק) המתבצע כל עוד התנאי הבוליאני מתקיים.
לדוגמה, קטע הקוד הבא מדפיס את המספרים 1-20 (כל אחד בשורה):
i = 1 while i <= 20: print i i = i + 1
|
עכשיו תורך: כתבו תוכנית שמדפיסה את כל המספרים האי-זוגיים מ-1 עד 20, השתמשו בלולאת while. |
פתרון
i = 1 while i <= 20: print i i = i + 2
[עריכה] לולאת for
לולאת for הנה לרוב תמציתית יותר מלולאת while.
[עריכה] מעבר על רשימה
לולאת for עוברת על כל אחד מאיברי רשימה. אופן כתיבת הלולאה הוא:
for <name> in <lst>: <action>
כאשר name הוא שם, lst היא רשימה, ו-action היא פעולה לביצוע על כל איבר. הלולאה תעבור איבר איבר, תשייך את השם name לאיבר, ותבצע את action.
לדוגמה, הלולאה הבא תדפיס שבע מחרוזות, כל יום בשורה נפרדת:
for day in ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']: print day
|
עכשיו תורך: מה תדפיס הלולאה? |
for day in ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']: print 'Today is ' + day
פתרון
Today is Sunday Today is Monday Today is Tuesday Today is Wednesday Today is Thursday Today is Friday Today is Saturday
|
עכשיו תורך: כתבו תוכנית שמדפיסה את כל המספרים האי-זוגיים מ-1 עד 20, השתמשו בלולאת for. |
פתרון
for i in [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]: print i
[עריכה] השימוש ב-range
לולאת for הנה נוחה במיוחד כאשר משתמשים בה בצירוף הרשימה range.
לדוגמה, קטע הקוד הבא מדפיס את המספרים 0-19 (כל אחד בשורה):
for i in range(20): print i
|
עכשיו תורך: כתבו תוכנית שמדפיסה את כל המספרים האי-זוגיים מ-1 עד 20, השתמשו בלולאת for. |
פתרון
for i in range(1, 20, 2): print i
ואפשר גם כך:
for i in range(10): print 2 * i + 1
[עריכה] הערה לבעלי נסיון בשפות אחרות
ברוב שפות התכנות, לולאת for מקדמת אינדקסים מספריים. לכן, קוד פייתון של בעלי נסיון בשפות אחרות נראה לפעמים כך:
a = ['Shalom', 'olam', 'ma', 'shlomha'] for i in range(len(a)): print a[i]
חשוב להבין שזה לא פיתוני, ואפשר לכתוב זאת בצורה פשוטה יותר, כך:
a = ['Shalom', 'olam', 'ma', 'shlomha'] for i in a: print i
[עריכה] סכנות בתנאי העצירה
כשכותבים לולאות, יש לוודא שתנאי העצירה אכן יתקיים בהכרח בוודאות - המהדר לא יעשה זאת בשבילנו. נתבונן, לדוגמה, בקטע הקוד הבא:
i = 2 while i < 20 or i > 20: print i
לולאה זו לא תעצר לעולם, שכן התנאי להמשך הלולאה תמיד יתקיים. כאשר קטע קוד זה יופעל, התוכנית תראה כאילו ש"קפאה".
[עריכה] דוגמה לשילוב פלט/קלט, תנאים, ולולאות
נסיים בתוכנית קטנה המדגימה את השימוש בתנאים ולולאות. התוכנית קולטת מהמשתמש שני מספרים, ומדפיסה הודעה האומרת מה היחס ביניהם. אחר כך היא שואלת את המשתמש אם הוא רוצה להמשיך ולתת שני מספרים נוספים, וכך הלאה, עד שהמשתמש בוחר להפסיק.
asked_to_quit = False while not asked_to_quit: print 'Please enter two numbers with a space between them:' a = raw_input() b = raw_input() if a > b: print str(a) + ' is bigger than ' + str(b) else if ( a < b ) print str(a) + ' is bigger than ' + str(b) else print 'the numbers are equal' print 'Please enter 1 to repeat, any other number to quit.' response = raw_input() asked_to_quit = respons == 1
להלן הסבר לתוכנית.
נתבונן ראשית במבנה של הקוד בתוך main. הקוד הוא למעשה כמעט כולו לולאת while:
asked_to_quit = False while not asked_to_quit: ...
כלומר, עושים פעולה כלשהי כל עוד ערך asked_to_quit הוא False. מתי נקבע ערכו של asked_to_quit? בתוך הלולאה, נוכל לראות את רצף השורות הבאות:
print 'Please enter 1 to repeat, any other number to quit.'
response = raw_input()
asked_to_quit = respons == 1
השורות מבקשות מהמשתמש להכניס ערך (הקובע האם להמשיך בתוכנית), וקולטות את הערך למשתנה response. אם ערך זה הוא 1, אז קובעים את ערכו של asked_to_quit ל-True.
חוץ מכך, הלולאה מתחילה בשורות:
print 'Please enter two numbers with a space between them:'
a = raw_input()
b = raw_input()
המבקשות מהמשתמש להכניס שני ערכים. לאחר שהוכנסו שני הערכים, השורות הבאות מדפיסות את היחס ביניהם:
if a > b: print str(a) + ' is bigger than ' + str(b) else if ( a < b ) print str(a) + ' is bigger than ' + str(b) else print 'the numbers are equal'
| הפרק הקודם: ביטויים בוליאניים ותנאים |
לולאות | הפרק הבא: n-יות |