פייתון/פייתון גרסה 2/לולאות


לולאות משמשות לחזרה על קטע קוד מספר פעמים. לולאה חוסכת בזמן כתיבת התוכנה ומסדרת את הקוד.

הצורך בלולאות

עריכה

במספרים ופעולות חשבוניות, ראינו דוגמה להמרה בין סוגי מעלות שונים כיצד להמיר ממעלות ב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. בין היתר:

  1. הקוד ארוך ומסורבל מאד.
  2. תמיד ייתכן שהקוד כולל שגיאה כלשהי: ייתכן שטעינו בהעתקת הנוסחה הממירה, לדוגמה. כאן נצטרך לתקן את הקוד ב-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. לולאת while דורשת פקודה שתעצור אותה שתופסת מקום רב בזכרון, לכן עדיף להשתמש בלולאת for.

מעבר על רשימה

עריכה

לולאת 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)
    elif a < b:
        print str(a) + ' is smaller than ' + str(b)
    else:
        print 'the numbers are equal'
      
    print 'Please enter 1 to repeat, any other number to quit.'
    response=int(raw_input())
    asked_to_quit = response != 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'
- לולאות -