עזרה | בהבנת דרך פיתרון לתרגיל פייתון
-
@THMHE לבעיה שתיארת זה הקוד הנכון:
def fix_age(age): if age == 13 or age == 14 or age == 17 or age == 18 or age == 19: return 0 else: return age def filter_teens(a=13, b=13, c=13): a = fix_age(a) b = fix_age(b) c = fix_age(c) return a + b + c print(filter_teens(45, 13, 15))
הסיבה, אצלך קראת לפונ' אבל לא עדכנת את הערך של המשתנה עם ערך ההחזרה של הפונ' fix_age.
-
א. להבנתי,
print(0)
לא מחזיר 0 אלא רק מדפיס אותו.
אתה רוצה שהערך ישתנה אז צריך return 0.ב. בתכנות, בדרך כלל פונקציה שמקבלת פרמטר השינויים שלה בערכו לא משפיעים על המשתנה בו השתמשו לשליחת הפרמטר. כלומר אם אני שולח a לפונקציה והפונקציה משנה אותו לערך כל שהוא, a יישאר כפי שהיא (במקרה שהפרמטר הוא רק מצביע (כמו באובייקט בJS) אז בסופו של דבר גם המקור משתנה כי הם מציעים על אותו אובייקט).
לכן צריך להחזיר את הערך המתוקן לתוך המשתנה:a = fix_age(a)
וכך לכל השלוש.
-
@THMHE כתב בעזרה | בהבנת דרך פיתרון לתרגיל פייתון:
@shloimy כלומר בגלל שורות 4 ו5?
המחשב לא יודע לבד שאם לא החזרתי כלום זה נשאר על מה שהיה קודם?לא בגלל 4 5.
שורות 9 10 11.שורות 4 5 הוספתי למקרה שהפונ' לא משנה כלום המשתנה היה הופך ל - NoneType.
-
@תוכניתן כתב בעזרה | בהבנת דרך פיתרון לתרגיל פייתון:
א. להבנתי,
print(0)
לא מחזיר 0 אלא רק מדפיס אותו.
אתה רוצה שהערך ישתנה אז צריך return 0.נכון, את זה הבאתי רק לראיה שהפונקציה השניה מצליחה לקרוא את הפונקציה הראשונה..
@תוכניתן כתב בעזרה | בהבנת דרך פיתרון לתרגיל פייתון:
ב. בתכנות, בדרך כלל פונקציה שמקבלת פרמטר השינויים שלה בערכו לא משפיעים על המשתנה בו השתמשו לשליחת הפרמטר. כלומר אם אני שולח a לפונקציה והפונקציה משנה אותו לערך כל שהוא, a יישאר כפי שהיא (במקרה שהפרמטר הוא רק מצביע (כמו באובייקט בJS) אז בסופו של דבר גם המקור משתנה כי הם מציעים על אותו אובייקט).
חידדת לי כאן נקודה ממש חשובה!
אבל אם כן למה כאן:@תוכניתן כתב בעזרה | בהבנת דרך פיתרון לתרגיל פייתון:
לכן צריך להחזיר את הערך המתוקן לתוך המשתנה:
a = fix_age(a)
וכך לכל השלוש.הפיתרון של @shloimy עבד גם בלי לעשות את זה?
אני זוכר שפעם אחד המתכנתים הסביר לי שצריך לעשות את זה ושכחתי..
עריכה: אני רואה ש @shloimy כן הוסיף את המשתנים לתוך הקוד שלו.. -
@THMHE דבר ראשון בפונקציה fix_age לא כתבת מה קורה אם התנאים לא מתקיימים, אתה צריך להגדיר
else: return age
דבר שני בפונקציית filter_teens אתה לא שומר את הערכים של fix_age בשום מקום, כשאתה כותב fix_age(a) זה לא משנה את a, זה פשוט מביא לך את התוצאה, שאותה אתה אמור לשמור במשתנה.
א"כ אתה צריך לכתוב את זה כך:a = fix_age(a)
ואז זה מעדכן ב a את התוצאה של הפונקציה.
-
@shloimy כתב בעזרה | בהבנת דרך פיתרון לתרגיל פייתון:
@THMHE כתב בעזרה | בהבנת דרך פיתרון לתרגיל פייתון:
@shloimy כלומר בגלל שורות 4 ו5?
המחשב לא יודע לבד שאם לא החזרתי כלום זה נשאר על מה שהיה קודם?לא בגלל 4 5.
שורות 9 10 11.שורות 4 5 הוספתי למקרה שהפונ' לא משנה כלום המשתנה היה הופך ל - NoneType.
ניסיתי כרגע להריץ את הפונקציה בלי שורות 4 ו5 ונכשלתי
הם כן דרושות
עכשיו אני נזכר שבאחד הנסיונות שלי להבין למה הקוד לא עובד הגדרתי משתנים חדשים ועדיין זה לא עבד..
כי 4 ו5 הם כן קריטיות -
@דני-ו כתב בעזרה | בהבנת דרך פיתרון לתרגיל פייתון:
@THMHE דבר ראשון בפונקציה fix_age לא כתבת מה קורה אם התנאים לא מתקיימים, אתה צריך להגדיר
else: return age
דבר שני בפונקציית filter_teens אתה לא שומר את הערכים של fix_age בשום מקום, כשאתה כותב fix_age(a) זה לא משנה את a, זה פשוט מביא לך את התוצאה, שאותה אתה אמור לשמור במשתנה.
א"כ אתה צריך לכתוב את זה כך:a = fix_age(a)
ואז זה מעדכן ב a את התוצאה של הפונקציה.
מצוין!
תודה על העזרה
זה בעצם סיכום תמציתי של מה שכתבו חבריך הטובים @shloimy ו @תוכניתן .. -
@THMHE כתב בעזרה | בהבנת דרך פיתרון לתרגיל פייתון:
ניסיתי כרגע להריץ את הפונקציה בלי שורות 4 ו5 ונכשלתי
כתבתי לך למה.
@shloimy כתב בעזרה | בהבנת דרך פיתרון לתרגיל פייתון:
שורות 4 5 הוספתי למקרה שהפונ' לא משנה כלום המשתנה היה הופך ל - NoneType.
וכאשר אתה מנסה להשתמש באופרטור + למשתנה NoneType אתה מקבל שגיאה.
-
@THMHE אני ממליץ על הספר https://data.cyber.org.il/python/python_book.pdf. לדוגמה הפרק העוסק בעניין הscope והעותק ש @תוכניתן הזכיר:
CleanShot 2024-01-31 at 19.37.16@2x.pdf -
@צדיק-תמים ממה שאני רואה במקורות באינטרנט זה עובד באופן מעניין, אם לא מבבצעת השמה של ערך בפרמטר הוא לא מועתק ורק בהשמה נוצר משתנה חדש בעצם, בשונה משפות תכנות אחרות (אין נפק"מ אבל זו התנהגות שונה בקריאה לפונקציה ואולי גם מהירה יותר וחסכנית יותר).
-
-
@צדיק-תמים כתב בעזרה | בהבנת דרך פיתרון לתרגיל פייתון:
CleanShot 2024-01-31 at 19.37.16@2x.pdf
תודה על הספר!
שגיאה 403.. (אני בנטפרי) -
@THMHE כתב בעזרה | בהבנת דרך פיתרון לתרגיל פייתון:
שגיאה 403.. (אני בנטפרי)
תשבית בהגדרות סינון את אזהרת שיבוש קבצים
אבל מה שצירפתי פה זה רק עמודים ספציפיים, זה המלא: https://data.cyber.org.il/python/python_book.pdf
-
-
@מנדי-הלפרין היי
אני סקרן
אפשר בבקשה הסבר??