שאלה על מבנה של פונקציות

שבוע טוב!
ממשיך לשבור את הראש על פונקציות ומקווה שהפונקציות יישברו ראשונות :wink:
אז ככה, במטלה שדרשה מאיתנו לחשב האם דני יכול לרוץ מרתון בפחות משלוש שעות כתבתי את
הפונקציות הבאות. (אם אתה המשיב ורוצה לקצר-השאלה שלי נוגעת לפונקציה השנייה בשורה 4)
def kph (hrs, km):
kph=(km/hrs)
return kph
def success(kph):
hours_to_finish_marathon = 42.195 / kph
return hours_to_finish_marathon <= 3
def success_message ():
if success:
print(" you have made a marathon is less than three hours! that’s a Winner! “)
else: print(” run faster, faster you must run ! ")
נשים לב שכאן ניסיתי להיות קצת יותר מתוחכם ולהניח שלא תמיד דני רץ חמש קילומטר, ולכן היא מאפשרת הזנת משתנה המרחק בנוסף למשתנה הזמן.
התוכנה מסרבת להבין את הפונקציה השנייה. כלומר את:
success
והיא טוענת בתוקף:
TypeError: unsupported operand type(s) for /: ‘float’ and ‘function’
ואני ממש מתקשה בהבנה של העניין הזה, כי לכאורה הפונקציה הזו היא ממש חיקוי מדויק של העקרונות שאתם הפגנתם בפתרון לדוגמא. נתבונן בה:
def check_if_run_marathon_in_three_hours(km_per_hour):
hours_to_finish_marathon = 42.195 / km_per_hour
return hours_to_finish_marathon <= 3
והיא עובדת יופי ולכן אני לא מבין מה עשיתי לא נכון.
תודה מראש!

שים לב שתחת השם “kph” יש לך גם פונקציה וגם משתנה, לדעתי זה מה שיוצר את הבעיה :slight_smile:

לייק 1

תודה רבה!
לדעתי זה לא מה שיוצר את הבעיה, כי גם כאשר שיניתי את שם הפונקציה בהתאם להמלצך וכתבתי בשם הפונקציה
kilometers_per_hour
במקום:
kph
והשארתי את שם המשתנה כפי שהיה (kph) הבעיה לא נפתרה. ממש נראה שהבעיה היא בפונקציה השנייה, כלומר בפונקציה:
def success(kph):
hours_to_finish_marathon = 42.195 / kph
return hours_to_finish_marathon <= 3
ואני לא מצליח להבין מה היא. שימי לב שהפתרון שאת מציעה מתייחס להגדרה של הפונקציה הראשונה, ושם אין בעיות. בנוסף, אי אפשר לטעון שזה בעייתי להשתמש בשם משתנה שלקוח מפונקציה אחרת (כל עוד דרשת מהפונקציה להחזיר אותו). ולכן אני קצת תקוע. בכל אופן תודה על ההשקעה!

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

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

לייק 1

ממש תודה על התגובה. שימי לב שאני חושב שאת טוענת משהו קצת שונה. אלמוג אמרה שתחת השם “kph” יש לי גם פונקציה וגם משתנה. אבל אני שיניתי את זה. וכרגע יש תחת kph משתנה שמוגדר בפונקציה הראשונה, ואני משתמש בו בפוקנציה השנייה. ממה שאני מבין זה מה שאת אומרת. שבעייתי. גם אני חשבתי שזה יכול להיות בעייתי, אבל זה בדיוק מה שהחבר’ה עושים. נסתכל על הפונקציה שלהם:
ddef calculate_km_per_hour_for_5_km(hours_to_finish):
km_per_hour = 5 / hours_to_finish
return km_per_hour

def check_if_run_marathon_in_three_hours(km_per_hour):
hours_to_finish_marathon = 42.195 / km_per_hour
return hours_to_finish_marathon <= 3
מה הם עושים? מגדירים משתנה בפונקציה הראשונה, קוראים לה (ומקבלים אותו) ואז משתמשים בו בפונקציה השנייה.
נסתכל רגע על מה שאני עושה:
def kilometers_per_hour (hrs, km):
kph=(km/hrs)
return kph
def success(kph):
hours_to_finish_marathon = 42.195 / kph
return hours_to_finish_marathon <= 3
לכאורה, נראה בדיוק אותו דבר.

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

לייק 1

דבר ראשון שוב תודה על התגובות וכו.
אני לא בטוח שאני מבין אותך אבל בואי נשאל ככה.
איפה ההבדל בין הפעולה הנוכחית שלי לבין הפעולה של הפתרון לדוגמא?

בשמחה :slight_smile:

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

בתרגיל לדוגמה הוגדר מחוץ לפונקציות משתנה בשם km_per_hour ואנחנו עושים השמה לתוכו עם ערך ההחזרה של הפונקציה calculate_km_per_hour (במקרה גם בתוך הפונקציה זה השם של הערך).

המשתנה שלך נמצא בתוך הפונקציה, ולכן אין לו משמעות מחוץ לה, אלא אם נחזיר אותו. מה שחשוב לזכור הוא שגם אם נבחר להחזיר אותו, השם שלו כבר לא יהיה השם הקצר והקולע שלו אלא הקריאה לפונקציה עם הערכים הרלוונטיים.

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

3 לייקים

נראה לי שהבנתי (עכשיו גם נעזרתי בחבר מתכנת והוא אמר דברים דומים למה שאמרת).
תודה!