| Hosted by CoCalc | Download
Kernel: Python 3 (Anaconda 2019)
שמות בני הזוג לעבודה (קודם שמי ואחר כך של בן/בת זוג): איתי נתנאל ומייק שלפקוב

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

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

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

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

f(3)
2
תרגיל 1:הפונקציה שבהמשך מחשבת את שיפוע המיתר העובר בין הנקודות (x1,f(x1))(x_1,f(x_1)) ו- (x2,f(x2))(x_2,f(x_2)). ליד חלק מהשאלות מופיעה סולמית ולידה סימן שאלה. החליפו את סימן השאלה בהסבר הקוד המופיע בשורה.
import matplotlib.pyplot as plt import math
def hypotenuse_slope(f,x1,x2): x1, x2 = min(x1, x2), max(x1, x2) #הכנסת הערך המינימלי ל x1 והערך המקסימלי ל x2 return (f(x2) - f(x1))/(x2 - x1) # מחזיר את ערך השיפוע של הפונקציה hypotenuse_slope(lambda x: 3*x**2 - 4*x +1, 3,4) #הכנסת ערך לפרמטרים x1,x2 ,f
17.0
def main(x1,x2): x1, x2 = min(x1, x2), max(x1, x2) return x1,x2 main(4,3)
(3, 4)

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

y=ax+by = ax+b
def get_linear_function(a, b): return lambda x: a * x + b g = get_linear_function(2,-5) g(5)
5
תרגיל 2: על ידי שימוש בפונקציות hypotenuse_slope ו- get_linear_function כתבו פונקציה המקבלת פונקציה כלשהיא, את שיעורי המיתר העובר דרך הנקודות ששיעור ה - x שלהן הוא x1 ו- x2 ומחזירה פונקציה אחרת המיישמת את משוואת המייתר העובר דרך שתי הנקודות. עליכם לעשות שימוש בביטוי למבדה.
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt def get_linear_function(f,x1,x2): x1, x2 = min(x1, x2), max(x1, x2) a=(f(x2) - f(x1))/(x2 - x1) b=f(x1)-a*x1 k=a*x1+b x = [x1,x2] y = [f(x1),f(x2)] plt.plot(x ,y, 'ro')#איך קובעים את גודל הנקודה? plt.plot(x ,y, 'b.')#צבע plt.xlabel('x', fontsize = 12) plt.ylabel('y', fontsize = 12) plt.grid(True) #plt.title( "f(x)",a,"x+",b),fontsize = 18, color = 'blue') print("f(x)",a,'*x+',b) plt.plot([x1,x2],[f(x1),f(x2)],c='b',lw=3) get_linear_function(lambda x: 3*x**2 - 4*x +1, -3,5)
f(x) 2.0 *x+ 46.0
Image in a Jupyter notebook

לולאות for

for loop

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

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

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

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

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

from time import sleep def counter(n,sleep_time = 00.001):#sleep_time מתייחס לזמן האמיתי שיעבור בשניות (קצב התקדמות הזמן) בהתאם לערך שנקבע ב for i in range(n+1): #n קובע כמה פעימות לספור, לא את הזמן האמיתי בשורה קודמת קבענו את הקצב print(i) sleep(sleep_time) counter(4)
0 1 2 3 4
counter(11)
0 1 2 3 4 5 6 7 8 9 10
--------------------------------------------------------------------------- KeyboardInterrupt Traceback (most recent call last) <ipython-input-51-6ce35e770a09> in <module>() ----> 1 counter(11) <ipython-input-49-75486cc2e74d> in counter(n, sleep_time) 3 for i in range(n+1): #n קובע כמה פעימות לספור, לא את הזמן האמיתי בשורה קודמת קבענו את הקצב 4 print(i) ----> 5 sleep(sleep_time) 6 counter(4) KeyboardInterrupt:

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

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)
#0.25 #1 #1 #0.25
for i in range(-2, 3):#קובעת את הטווח b = i ** 2#מציבה את הערך של b if b != 0:#מציבה את התנאי להדפסה שb!=0 print(1 / b)#מדפיסה את הערך 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))
#0 #יודפס רק שלוש מכיוון שהפקודה return מחוץ לפונקציה for ונותנת את הערך האחרון שלו
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
for i in range(1, 100): if (i % 3) % 2 == 0: print(i)
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
i=1 while i<100: if (i%3)%2==0: print(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. מדידת טמפרטורה בניסוי מסוים הניבה את התוצאות הבאות
21,0,7.2,8.9,3021,0,7.2,-8.9,-30
הטמפרטורה נמדדה במעלות צלסיוס (C) הנוסחא למעבר מטמפרטורה במעלות צלסיוס לטמפטמפרטורה במעלות פרנהייט היא
F=95C+32F=\frac{9}{5}\cdot C+32
כאשר C זו הטמפרטורה במעלות צלסיוס ו-F הטמפרטורה במעלות פרנהייט. כתבו לולאת for המדפיסה טבלה, שעמודה אחת בה היא הטמפרטורה במעלות צלסיוס והשניה בפרנהייט. הקפידו על כותרת נכונה לעמודות.
for c in [21,0,7.2,-8.9,-30]: f=c*9/5+32 print ([c],[f])
[21] [69.8] [0] [32.0] [7.2] [44.96] [-8.9] [15.979999999999997] [-30] [-22.0]
5. כתבו פונקציה המקבלת רשימה של מספרים ומחזירה את הממוצע שלהם.
def fun(list): sum=0 for i in list: sum=sum+i return sum/len(list) fun([1,2,3,4])
2.5
def fun(list): return sum(list)/len(list) fun([1,2,3,4,5])
3.0
6.כתבו תוכנית המקבלת מהמשתמש רשימה המכילה ציוני מבחנים (רשימת ערכי a), ורשימה שנייה המכילה את משקלו של כל ציון (רשימת ערכי x שהם מספרים עשרוניים בין 0 ל 1). על התוכנית לחשב ולהדפיס את הממוצע המשוקלל של הציונים. החישוב, בהתאם לנוסחה הבאה. ממוצע משוקלל שווה ל:
(a1x1+a2x2+a3x3)/(a1+a2+a3)(a1x1+a2x2+a3x3) / (a1+a2+a3)
שימו לב שסכום הסך כל המשקלים צריך להיות שווה ל - 1. אורך רשימת המשקלים צריך להיות זהה לארוך הרשימה
def fun (a,x): lh=0 g=0 lk=0 for i in a: lo = i * x[g] lh= lh+lo g+=1 lk=lk+i print (lh/lk) fun([100,100,100],[0.3,0.5,0.2])
0.3333333333333333
7. מספרי פיבונאצ'י הם סידרת מספרים המגדרת באופן הבא: אם n=0 אזיfn=0 , אם n=1 אזי fn=1. עבור כל מספר טבעי n אחר מתקיים fn=fn-1+fn-2 . שבעת המספרים הראשונים (n=6) בסדרה הם: 0,1,1,2,3,5,8. כתבו פונקציה בשם fibonacci המקבלת כפרמטר מספר שלם n ומחזירה רשימה של n מספרי פיבונאצ'י הראשונים.
def fibonacci(n): n0=0 n1=1 print (n0) print(n1) for i in range (n): n_next=n0+n1 print (n_next) n0=n1 n1=n_next fibonacci(11)
0 1 1 2 3 5 8 13 21 34 55 89 144
8. במדע חישובי נעשה שימוש נרחב במספרים כאילו אקראיים (pseudorandom). לכן, חשוב לכן לדעת ליצור מספרים כאלו. בהמשך מוצגת שיטה לקבלת מספרים כאילו אקראיים בתחום שבין אפס לאחת. מתחילים ממספר מסוים, נניח
1>u0>01>u_0 >0
המספר הבא יינתן על ידי:
u1=חלק עשרוני של החישוב הזה (π+u0)5u_1=\text{חלק עשרוני של החישוב הזה } (\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 מספרים אקראיים.
from math import pi def get_random_list (u0,n): for i in range (n): un= (u0+pi)**3 print (un) i+=1 u0+=un get_random_list(0.3,4)
40.764150657749475 86384.55346237785 645616817366314.8 2.691066958744045e+44
9.בזמן t=0 פרעוש קטן ניצב בראשית הצירים. בכל רגע הוא מבצע קפיצה בכיוון אקראי (בין 0 ל-3600360^0 ) ועובר מרחק אקראי (קטן מ-1) בכיוון הקפיצה. כתבו תוכנית המשרטטת את מסלול הפרעוש אחרי n קפיצות. רמז: אתם יכולים להשתמש בפונקציה הפסאודורנדומאלית שיצרתם בתרגיל הקודם
import matplotlib.pyplot as plt