<div dir = rtl> שמות:</div>

<div dir = rtl> רשימות, לולאות for, ופונקציית למבדה </div>

<font color = blue><div dir = rtl> פונקציית למבדה </div>

<div dir = rtl> בתכנות לא פעם אנחנו מוצאים את עצמינו במצב שבו אנחנו צריכים להעביר פונקציה אחת כפרמטר לפונקציה אחרת. דרך פשוטה לעשות זאת הוא lambda notation . צורת כתיבה זו מאפשרת לנו להגדיר בפשטות פונקציות שכתיבתן מתאפשרת באמצעות שורה אחת. לדוגמא נניח שרוצים להגדיר את הפונקציה המתמטית $f(x) = x^2-3x+2 $. נוכל לעשות זאת באופן פשוט באמצעות הקוד שבהמשך: </div> </font>

In [31]:
f = lambda x: x ** 2 - 3 * x + 2

<font color = blue> <div dir = rtl> השימוש בפונקציית למבדה ייעשה כמו בכל פונקיית מחשב אחרת:</div></font>

In [32]:
f(3)
Out[32]:
2

<div dir = rtl > תרגיל 1:הפונקציה שבהמשך מחשבת את שיפוע המיתר העובר בין הנקודות $(x_1,f(x_1))$ ו- $(x_2,f(x_2))$. ליד חלק מהשאלות מופיעה סולמית ולידה סימן שאלה. החליפו את סימן השאלה בהסבר הקוד המופיע בשורה. </div>

In [2]:
def hypotenuse_slope(f,x1,x2):
    x1, x2 = min(x1, x2), max(x1, x2) #שני שיעורים-שיעורי מקסימום ושיעורי מינימום
    return (f(x2) - f(x1))/(x2 - x1) #השיפוע

hypotenuse_slope(lambda x: 3*x**2 - 4*x +1, 3,4) #f(x1),f(x2)
Out[2]:
17.0

<font color = blue> <div dir = rtl> דוגמא: הפונקציה שבהמשך היא פונקציה המקבלת שני פרמטרים a ו-b ומחזירה פונקציית פייטון המיישמת את הפונקציה המתמטית $y = ax+b$.

In [82]:
def get_linear_function(a, b):
    return lambda x: a * x + b

g = get_linear_function(2,-5)

g(6)
Out[82]:
7

<div dir = rtl > תרגיל 2: על ידי שימוש בפונקציות hypotenuse_slope ו- get_linear_function כתבו פונקציה המקבלת פונקציה כלשהיא, את שיעורי המיתר העובר דרך הנקודות ששיעור ה - x שלהן הוא x1 ו- x2 ומחזירה פונקציה אחרת המיישמת את משוואת המייתר העובר דרך שתי הנקודות. עליכם לעשות שימוש בביטוי למבדה. </div>

In [0]:
def hypotenuse_slope(f,x1,x2):
    x1, x2 = min(x1, x2), max(x1, x2)
    return (f(x2) - f(x1))/(x2 - x1)

hypotenuse_slope(lambda x: 3*x**2 - 4*x +1, 3,4)

<font color =blue> <div dir = rtl> לולאות for </div></font>

<img src = "../../images/for_loop.png" width =450>

<font color =blue> <div dir = rtl>דוגמא: בדומה ללולאת while לולאת ה- for מאפשרת לנו לחזור על קטע קוד מספר פעמים. למשל בעזרת קטע הקוד שבהמשך נוכל להדפיס את כל החזקות הריבועיות של המספרים מ- 1 ועד 5 </div></font>

In [4]:
for i in range(1,6):
    print (i * i)
1
4
9
16
25

<font color =blue> <div dir = rtl> דוגמא: קטע הקוד שבהשך מבצע פעולת כפל על כל איבר שברשימה:</div></font>

In [36]:
for item in [12, 'abc', [1,2] , -9]:
    print(3 * item)
36
abcabcabc
[1, 2, 1, 2, 1, 2]
-27

<font color =blue> <div dir = rtl> דוגמא: קטע הקוד שבהמשך יוצר מונה: </div></font>

In [37]:
from time import sleep
def counter(n,sleep_time = 1):
    
    for i in range(n+1):
        print(i)
        sleep(sleep_time)
In [38]:
counter(10)
0
1
2
3
4
5
6
7
8
9
10

<font color =blue> <div dir = rtl> דוגמא: נניח כי נתונה רשימה המכילה פנקציות ורוצים להפעיל את כל אחת מהפונקציות על אותו מספר. הדרך לעשות זאת היא באמצעות הקוד שבהמשך: </div></font>

In [9]:
function_list = [lambda y: y ** 2, lambda x: 1 / x , lambda z: z ** 3]

for fun in function_list:
    print(fun(12))
144
0.08333333333333333
1728

<div dir = rtl> שאלות </div>

<div dir = rtl> 1.מה ידפיס קטע הקוד שבהמשך? קודם ענו מבלי להריץ את הקוד ולאחר מכן בידקו את תשובתכם.</div>

for i in range(-2, 3):
    b = i ** 2
    if b != 0:
        print(1 / b)
In [0]:
0.25
1
1
0.25
In [10]:
 for i in range(-2, 3):
        b = i ** 2
        if b != 0:
            print(1 / b)
0.25
1.0
1.0
0.25

<div dir = rtl> 2. מה ידפיס קטע הקוד שבהמשך? קודם ענו מבלי להריץ את הקוד ולאחר מכן בידקו את תשובתכם.</div>

def g(i):
s = 0
for k in range(-i, i + 1):
    s = s + k
return s

print(g(3))
In [0]:
# (-3, 4)
-3 # s = 0, k = -3
-5 # s = -3, k = -2
-6 # s = -5, k = -1
-6 # s = -6, k = 0
-5 # s = -6, k = 1
-3 # s = -5, k = 2
0
In [13]:
def g(i):
    s = 0
    for k in range(-i, i + 1):
        s = s + k
    return s

print(g(3))
0

<div dir = rtl>3. נתון קטע הקוד שבהמשך:</div>

for i in range(1, 100):
    if (i % 3) % 2 == 0:
        print(i)

<div dir = rtl> כתבו קטע קוד שפעולתו זהה אבל עם לולאת while </div>

In [67]:
i = 1
while i < 100:
    if (i % 3) % 2 == 0:
        print(i)
    i = i + 1
2
3
5
6
8
9
11
12
14
15
17
18
20
21
23
24
26
27
29
30
32
33
35
36
38
39
41
42
44
45
47
48
50
51
53
54
56
57
59
60
62
63
65
66
68
69
71
72
74
75
77
78
80
81
83
84
86
87
89
90
92
93
95
96
98
99

<div dir = rtl>4. מדידת טמפרטורה בניסוי מסוים הניבה את התוצאות הבאות :-30,-21,0,7.2,8.9 הטמפרטורה נמדדה במעלות צלסיוס (C). הנוסחא למעבר מטמפרטורה במעלות צלסיוס לטמפטמפרטורה במעלות פרנהייט היא $T_F=\frac{9}{5}T_C+32$. $T_C$ זו הטמפרטורה במעלות צלסיוס ו-$T_F$ הטמפרטורה במעלות פרנהייט. כתבו לולאת for המדפיסה טבלה, שעמודה אחת בה היא הטמפרטורה במעלות צלסיוס והשניה בפרנהייט. הקפידו על כותרת נכונה לעמודות.</div>

In [81]:
print('         Tf', '          |   Tc')
print('---------------------------------')
Tc = lambda Tf: (Tf - 32) * 5 / 9
for Tf in [30,-21,0,7.2,8.9] :
    print(Tc(Tf), '  |  ',Tf)
    print('---------------------------------')
         Tf           |   Tc
---------------------------------
-1.1111111111111112   |   30
---------------------------------
-29.444444444444443   |   -21
---------------------------------
-17.77777777777778   |   0
---------------------------------
-13.777777777777779   |   7.2
---------------------------------
-12.833333333333334   |   8.9
---------------------------------

<div dir = rtl> 5. כתבו פונקציה המקבלת רשימה של מספרים ומחזירה את הממוצע שלהם. </div>

In [66]:
def avg(a):
    l = [a]
    n = 0
    for x in list:
        n = n + 1
    return sum(l) / n
a([3,5,8,6])

<div dir = rtl> 6.כתבו תוכנית המקבלת מהמשתמש רשימה המכילה ציוני מבחנים, ורשימה שנייה המכילה את משקלו של כל ציון. על התוכנית לחשב ולהדפיס את הממוצע המשוקלל של הציונים (מחלקים את סכום מכפלות המשקלים בציונים, בסכום המשקלים).

In [9]:
def avg(x, y):
    l = []
    s = 0
    for i in range(len(x)):
        s+=x[i]*y[i]
    return s/sum(x)

avg([1, 1, 2, 3], [100, 20, 50, 76])
Out[9]:
64.0

<div dir =rtl> 7. מספרי פיבונאצ'י הם סידרת מספרים המגדרת באופן הבא: אם n=1 אזי $f_n=1$ , אם n=2 אזי $f_n=1$. עבור כל מספר טבעי n אחר מתקיים $f_n=f_{n-1}+f_{n-2}$ . שבעת המספרים הראשונים (n=6) בסדרה הם: 1,1,2,3,5,8,13. כתבו פונקציה בשם fibonacci המקבלת כפרמטר מספר שלם n ומחזירה רשימה של n מספרי פיבונאצ'י הראשונים.</div>

In [5]:
def fibonacci(n):
    if n == 1:
        return [1]
    l = [1, 1]
    i = 2
    while i < n:
        l.append(l[-1]+l[-2])
        i = i+1
    return l
fibonacci(6)
Out[5]:
[1, 1, 2, 3, 5, 8]

<font color = blue> <div dir = rtl> מציירים עם צב</div></font>

<img src = http://bestanimations.com/Animals/Reptiles/turtles/funny-turtle-animated-gif.gif width =200><font color = blue> <div dir = rtl> החבילה mobilechelonian היא חבילה בעזרתה ניתן ליצור שרטוטים מגניבים, אבל יתרונה הגדול הוא בכך שהיא תעזור לכם להכיר מושגים שונים בתכנות מונחה עצמים. בעזרת פקודות פשוטות ניתן להזיז את הסמן על המסך כאשר הוא משאיר אחריו קו. באופן כזה ניתן לשרטט כל שרטוט שתעלו על דעתכם. החבילה מכילה מחלקה בשם Turtle, באמצעות מחלקה זו תוכלול ליצור אוביקט שיאפשר לכם לשרטט צורות שונות על מסך המחשב. קטע הקוד שבהמשך יצור על מסך המחשב תמונה מלבנית ובמרכזה תמונה של צב. צב זה "נושא" איתו עיפרון. באמצעות הפקודות penup ו- pendown ניתן להרים את העיפרון או להורידו. הפקודה $forword(50)$ תניע את הצב קדימה 50 צעדים. במידה והעיפרון למטה הצב יצייר קו על המסך. באמצעות הפקודה $right(90)$ אפשר לסובב את הצב ימינה ב- 90 מעלות ובאמצעות הפקודה left אפשר לסובבו שמאלה. הריצו את כל אחד מהתאים שלמטה זה אחרי זה ובידקו מה קורה.</div></font>

<font color = red><div dir = rtl > כדי שהקוד יעבוד אתם צריכים שחוברת העבודה תהיה חוברת עבודה קלאסית. תוכלו לבחור מצב זה מהתפריט הניפרש לפניכם כאשר אתם מקלידים על הפריט File.</div></font>

In [0]:
from mobilechelonian import Turtle
t = Turtle()
t.forward(50)
In [103]:
t.forward(50)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-103-2f0bc3b705a7> in <module>()
----> 1 t.forward(50)

NameError: name 't' is not defined
In [42]:
t.left(90)
In [43]:
t.forward(50)
In [44]:
t.left(90)
In [110]:
t.pencolor("red")
t.forward(50)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-110-26ffdabfba4e> in <module>()
----> 1 t.pencolor("red")
      2 t.forward(50)

NameError: name 't' is not defined

<div dir =rtl> 8. כתבו קטע קוד שתפקידו לצייר באמצעות Turtle משושה שלכל צלע שלו צבע שונה.

In [3]:
from mobilechelonian import Turtle
t = Turtle()
for i in range(7):
    t.pencolor("random")
    t.forward(60)
    t.left(120)
Out[3]:
Turtle()

<div dir = rtl> 9. כתבו פונקציה המקבל מספר שלם n>2 ומציירת ברמצעות ה- Turtle מצולע משוכלל בעל n צלעות. </div>

In [0]:
 

9. במדע חישובי נעשה שימוש נרחב במספרים כאילו אקראיים (pseudorandom). חשוב לכן לדעת ליצור מספרים כאלו. בהמשך מוצגת שיטה לקבלת מספרים כאילו אקראיים בתחום שבין אפס לאחת. מתחילים ממספר מסוים, נניח $1>u_0 >0$. המספר הבא יינתן על ידי:$u_1=\text{fractional part of} (\pi + u_0)^5$( הוא החלק הלא שלם של תוצאת החישוב של $(\pi+u_0)^5$.) עבור $u_0=0.3$ נקבל $(\pi+u_0)^5=482.8334276$ כך ש- $u_1=0.8334276$. את המספר הבא ניתן לקבל על ידי הצבה של $u_1$ במקום $u_0$. כתבו פונקציה בשם get_random_list המקבלת שני פרמטרים מספריים. האחד מספר חיובי הקטן מ-1 (u0) ומספר שלם n. על הפונקציה להחזיר רשימה של n מספרים אקראיים.

In [0]:
 

<div dir = rtl>10.בזמן t=0 פרעוש קטן ניצב בראשית הצירים. בכל רגע הוא מבצע קפיצה בכיוון אקראי (בין 0 ל-$360^0$ ) ועובר מרחק אקראי (קטן מ-1) בכיוון הקפיצה. כתבו תוכנית המדמה באמצעות Turtle את מסלול הפרעוש אחרי n קפיצות.

In [0]: