CoCalc Shared Filesassignment / assigment6 / assignment6-lists2-1.ipynbOpen in CoCalc with one click!
Author: Omer Lemel
Views : 100
Description: Jupyter notebook assignment/assigment6/assignment6-lists2-1.ipynb

שמות:

רשימות, לולאות for, ופונקציית למבדה

פונקציית למבדה

בתכנות לא פעם אנחנו מוצאים את עצמינו במצב שבו אנחנו צריכים להעביר פונקציה אחת כפרמטר לפונקציה אחרת. דרך פשוטה לעשות זאת הוא lambda notation . צורת כתיבה זו מאפשרת לנו להגדיר בפשטות פונקציות שכתיבתן מתאפשרת באמצעות שורה אחת. לדוגמא נניח שרוצים להגדיר את הפונקציה המתמטית f(x)=x23x+2f(x) = x^2-3x+2 . נוכל לעשות זאת באופן פשוט באמצעות הקוד שבהמשך:
In [31]:
f = lambda x: x ** 2 - 3 * x + 2

השימוש בפונקציית למבדה ייעשה כמו בכל פונקיית מחשב אחרת:

In [32]:
f(3)
2
תרגיל 1:הפונקציה שבהמשך מחשבת את שיפוע המיתר העובר בין הנקודות (x1,f(x1))(x_1,f(x_1)) ו- (x2,f(x2))(x_2,f(x_2)). ליד חלק מהשאלות מופיעה סולמית ולידה סימן שאלה. החליפו את סימן השאלה בהסבר הקוד המופיע בשורה.
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)
17.0

דוגמא: הפונקציה שבהמשך היא פונקציה המקבלת שני פרמטרים a ו-b ומחזירה פונקציית פייטון המיישמת את הפונקציה המתמטית y=ax+by = ax+b.

In [82]:
def get_linear_function(a, b): return lambda x: a * x + b g = get_linear_function(2,-5) g(6)
7
תרגיל 2: על ידי שימוש בפונקציות hypotenuse_slope ו- get_linear_function כתבו פונקציה המקבלת פונקציה כלשהיא, את שיעורי המיתר העובר דרך הנקודות ששיעור ה - x שלהן הוא x1 ו- x2 ומחזירה פונקציה אחרת המיישמת את משוואת המייתר העובר דרך שתי הנקודות. עליכם לעשות שימוש בביטוי למבדה.
In [ ]:
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)

לולאות for

דוגמא: בדומה ללולאת while לולאת ה- for מאפשרת לנו לחזור על קטע קוד מספר פעמים. למשל בעזרת קטע הקוד שבהמשך נוכל להדפיס את כל החזקות הריבועיות של המספרים מ- 1 ועד 5

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

דוגמא: קטע הקוד שבהשך מבצע פעולת כפל על כל איבר שברשימה:

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

דוגמא: קטע הקוד שבהמשך יוצר מונה:

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

דוגמא: נניח כי נתונה רשימה המכילה פנקציות ורוצים להפעיל את כל אחת מהפונקציות על אותו מספר. הדרך לעשות זאת היא באמצעות הקוד שבהמשך:

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

שאלות

1.מה ידפיס קטע הקוד שבהמשך? קודם ענו מבלי להריץ את הקוד ולאחר מכן בידקו את תשובתכם.
for i in range(-2, 3):
    b = i ** 2
    if b != 0:
        print(1 / b)
In [ ]:
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
2. מה ידפיס קטע הקוד שבהמשך? קודם ענו מבלי להריץ את הקוד ולאחר מכן בידקו את תשובתכם.
def g(i):
s = 0
for k in range(-i, i + 1):
    s = s + k
return s

print(g(3))
In [ ]:
# (-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
3. נתון קטע הקוד שבהמשך:
for i in range(1, 100):
    if (i % 3) % 2 == 0:
        print(i)
כתבו קטע קוד שפעולתו זהה אבל עם לולאת while
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
4. מדידת טמפרטורה בניסוי מסוים הניבה את התוצאות הבאות :-30,-21,0,7.2,8.9 הטמפרטורה נמדדה במעלות צלסיוס (C). הנוסחא למעבר מטמפרטורה במעלות צלסיוס לטמפטמפרטורה במעלות פרנהייט היא TF=95TC+32T_F=\frac{9}{5}T_C+32. TCT_C זו הטמפרטורה במעלות צלסיוס ו-TFT_F הטמפרטורה במעלות פרנהייט. כתבו לולאת for המדפיסה טבלה, שעמודה אחת בה היא הטמפרטורה במעלות צלסיוס והשניה בפרנהייט. הקפידו על כותרת נכונה לעמודות.
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 ---------------------------------
5. כתבו פונקציה המקבלת רשימה של מספרים ומחזירה את הממוצע שלהם.
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])
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])
64.0
7. מספרי פיבונאצ'י הם סידרת מספרים המגדרת באופן הבא: אם n=1 אזי fn=1f_n=1 , אם n=2 אזי fn=1f_n=1. עבור כל מספר טבעי n אחר מתקיים fn=fn1+fn2f_n=f_{n-1}+f_{n-2} . שבעת המספרים הראשונים (n=6) בסדרה הם: 1,1,2,3,5,8,13. כתבו פונקציה בשם fibonacci המקבלת כפרמטר מספר שלם n ומחזירה רשימה של n מספרי פיבונאצ'י הראשונים.
In [1]:
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(1)
[1]

מציירים עם צב

החבילה mobilechelonian היא חבילה בעזרתה ניתן ליצור שרטוטים מגניבים, אבל יתרונה הגדול הוא בכך שהיא תעזור לכם להכיר מושגים שונים בתכנות מונחה עצמים. בעזרת פקודות פשוטות ניתן להזיז את הסמן על המסך כאשר הוא משאיר אחריו קו. באופן כזה ניתן לשרטט כל שרטוט שתעלו על דעתכם. החבילה מכילה מחלקה בשם Turtle, באמצעות מחלקה זו תוכלול ליצור אוביקט שיאפשר לכם לשרטט צורות שונות על מסך המחשב. קטע הקוד שבהמשך יצור על מסך המחשב תמונה מלבנית ובמרכזה תמונה של צב. צב זה "נושא" איתו עיפרון. באמצעות הפקודות penup ו- pendown ניתן להרים את העיפרון או להורידו. הפקודה forword(50)forword(50) תניע את הצב קדימה 50 צעדים. במידה והעיפרון למטה הצב יצייר קו על המסך. באמצעות הפקודה right(90)right(90) אפשר לסובב את הצב ימינה ב- 90 מעלות ובאמצעות הפקודה left אפשר לסובבו שמאלה. הריצו את כל אחד מהתאים שלמטה זה אחרי זה ובידקו מה קורה.

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

In [ ]:
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
8. כתבו קטע קוד שתפקידו לצייר באמצעות Turtle משושה שלכל צלע שלו צבע שונה.
In [3]:
from mobilechelonian import Turtle t = Turtle() for i in range(7): t.pencolor("random") t.forward(60) t.left(120)
Turtle()
9. כתבו פונקציה המקבל מספר שלם n>2 ומציירת ברמצעות ה- Turtle מצולע משוכלל בעל n צלעות.
In [ ]:
from mobilechelonian import Turtle bobross = Turtle() def random(n): delta = 180 * (n - 2) / n for i in range(n): bobross.forward(60) bobross.left(180 - delta) random(5)
9. במדע חישובי נעשה שימוש נרחב במספרים כאילו אקראיים (pseudorandom). חשוב לכן לדעת ליצור מספרים כאלו. בהמשך מוצגת שיטה לקבלת מספרים כאילו אקראיים בתחום שבין אפס לאחת. מתחילים ממספר מסוים, נניח 1>u0>01>u_0 >0. המספר הבא יינתן על ידי:u1=fractional part of(π+u0)5u_1=\text{fractional part of} (\pi + u_0)^5( הוא החלק הלא שלם של תוצאת החישוב של (π+u0)5(\pi+u_0)^5.) עבור u0=0.3u_0=0.3 נקבל (π+u0)5=482.8334276(\pi+u_0)^5=482.8334276 כך ש- u1=0.8334276u_1=0.8334276. את המספר הבא ניתן לקבל על ידי הצבה של u1u_1 במקום u0u_0. כתבו פונקציה בשם get_random_list המקבלת שני פרמטרים מספריים. האחד מספר חיובי הקטן מ-1 (u0) ומספר שלם n. על הפונקציה להחזיר רשימה של n מספרים אקראיים.
In [4]:
import matplotlib.pyplot as plt from math import pi def get_random_list(u0, n): l = [u0] if u0 < 1: for i in range(n-1): u1 = (pi + l[-1]) ** 5 u1 = u1 % 1 l.append(u1) else: print('u0 must be smaller than 1') return l get_random_list(0.3, 6)
[0.3, 0.8334280393192444, 0.42333900420101145, 0.7792938031778931, 0.6619479274714877, 0.04986152501589913]
10.בזמן t=0 פרעוש קטן ניצב בראשית הצירים. בכל רגע הוא מבצע קפיצה בכיוון אקראי (בין 0 ל-3600360^0 ) ועובר מרחק אקראי (קטן מ-1) בכיוון הקפיצה. כתבו תוכנית המדמה באמצעות Turtle את מסלול הפרעוש אחרי n קפיצות.
In [ ]: