שליטה בסדר ביצוע התוכנית: תנאים ולולאות
הפקולטה לפיזיקה, הטכניון. חורף 2013
מרצה: רונן אברבנאל
if 2**2 == 4:
print "well, clearly"
זו הדוגמה הראשונה שראינו לבלוקים
כדי להראות שקוד "שייך" לקוד אחר, משתמשים בסוגריים מסלוסלים:
if (2==3-1)
{
pritnf("it's right!")
}
בפייתון, משתמשים בהזחות ("טאב", indentation) כדי לעשות את אותו הדבר:
a = 10
if a == 1:
print 1
elif a == 2:
print 2
else:
print 'A lot'
גם כשכותבים ישירות למפרש, וגם כשכותבים סקריפטים, ההזחה משנה! היא אומרת למפרש איזה קוד צריך לרוץ.
* הערה חשובה* מנומס לדחוף כל בלוק בארבעה רווחים. טוב מאוד לשמור על הנוהג הזה, אבל הוא לא חיוני עבור השפה:
כל מספר שונה של רווחים/ טאבים הוא בלוק שונה. שימו לב לא לבלבל את מספר הרווחים.
רוב עורכי הטקסט, כשהם עורכים קוד פייתון, דואגים שטאב יהיה בדיוק 4 רווחים. אבל זה לא תמיד כך. שימו לב!
a = 30
if a%5 == 0:
if a%2 == 0:
print "a is divided by 10!"
print "a is divides by 5!"
כאשר יש קוד עם הזחות שונות אבל בלי פתיחה של בלוק חדש (עם נקודותיים), יש צרות,
if 3==4:
print "no way!"
print "maybe yes?"
ב-C, לולאות for עוברות על משתנה ומבצעות פעולה עבור כל ערך שלו:
for (int i=0; i<10; i++)
{
printf("my i is %d" , i)
}
בפייתון, לולאות עוברות על רשימה
range(1,8,2)
for i in range(1,8,2):
print "my i is %d" % i
הפקודה range יוצרת רשימת מספרים, מאפס ועד המספר הנדרש. לפעמים, נחמד לסרוק רשימות אחרות,
for word in ('cool', 'powerful', 'readable'):
print('Python is %s' % word)
מתבצעת עד שמתקיים תנאי מסויים
z = 1+1j
while abs(z) < 100:
z = z**2 +1
z
אפשר לעצות לולאות באמצע באמצעות break
a = 2.1
while a < 100:
a *= -1.1
if a < -100:
print "braking"
break
a * 3
print a
או לדלג על ביצוע "מחזור" מסויים של הלולאה באמצעות continue
a = [1,0,2,4]
for element in a:
if element == 0:
continue
print 1. / element
לפעמים, כל מה שאחנו צריכים לעשות הוא לעבור על רשימה ולבצע פעולה פשוטה על כל איבר ברשימה. לפעמים, כל מה שאנחנו רוצים זה לעבור על רשימה ולסנן ממנה חלקים.
פייתון מציע צורה פשוטה למדי לעשות פעולות כאלו בשורה אחת, List Comprehensions:
L = range(10)
[item * 2 for item in L if item%2==1]
כדי להבין מה הולך כאן, נחלק ל-3 חלקים שכל אחד מהם יכול לבוא בנפרד
[item for item in L]
עבור כל אחד מהאיברים ברשימה L, החזר את האיבר כמו שהוא, לרשימה חדשה.
אבל אין צורך להחזיר אותו כמו שהוא
[item * 2 for item in L]
["a number %d" % item for item in L]
אפשר לבצע כל קוד פייתון (ש"יפה" להכניס למקום כל כך צר) או לקרוא לכל פונקציה שהיא עבור כל אחד מאברי הרשימה.
כמו כן, אין צורך לבצע את הפעולה על כל האיברים. ניתן לבדוק אם תנאי מסויים מתקיים, ולבצע את הפעולה רק אם הוא אכן מתקיים:
[item for item in L if item> 3]
[item for item in L if item%3 == 0]
וכמובן, לשלב, כמו בדוגמה הראשונה.
L2 = ["Physics", "Math", "EE", "ME", "Biology", "Medicin"]
["%s starts with 'M'" % elem for elem in L2 if elem.startswith("M")]
ניתן לבצע את התרגילים הן במפענח והן בקובץ נפרד