חידוד בנוגע להבדלים בין return לprint (וגם if קשור כאן)

תגיות: ,

כאן אני מתייחס לנושא 6 בשבוע 2.
נדרשנו ליצור פונקציה (או בצורה אחרת):

  • אם משתמש הקליד 5, הדפיסו לו 005.
  • אם משתמש הקליד 007, הדפיסו לו 007.
  • אם משתמש הקליד 70, הדפיסו לו 070.
  • אם משתמש הקליד 700, הדפיסו לו 700.
  • אם משתמש הקליד -1, הדפיסו לו “Wrong Category”.
  • אם משתמש הקליד Art, הדפיסו לו “Wrong Category”.
    הרעיון מבחינתי הוא פשוט. קודם כל-לזהות אם מדובר בקלט שהוא לא רק מספר. אם זה המצב-לשלוח הודעת שגיאה. ברגע שהקלט הוא כן רק מספרי, אז קודם כל להמיר אותו לint ואז להחיל עליו תנאים בנוגע לצורך להוסיף אפסים כנגזרת מהגודל שלו . בדרך למדתי קצת על “תנאי על תנאי” שזה מה שאני עושה כאן. כי אני נותן פקודה להמיר לint שהיא מותנית בקיום תנאי, ואז אחרי שהמרתי אני מחיל תנאים נוספים.
    אני החלטתי להשתמש בפונקציה מסוימת. וכך היא נראתה בהתחלה.

    כמו שאפשר לראות, קורה משהו מוזר. כאשר אני מכניס קלט שאינו מספרי (נזכור-מדובר בסטרינג בכל מקרה) מה שהיה אמור לקרות מבחינתי זה שהתוכנה תזהה את התנאי הראשון שלי (הקלט אינו מספרי בלבד) ותחזיר לי הודעת שגיאה. במקום זה מה קרה? התוכנה המשיכה לרוץ לתנאים הבאים בתור, והתלוננה על פערים בין str לint. לכאורה, היא הייתה צריכה להפנים את התנאי הראשון ולהחיל אותו, ולא לרוץ הלאה, כי שאר התנאים לא רלוונטיים מבחינתה. הם פשוט לא חלים.
    הצלחתי לפתור את הבעיה הזו על ידי החלפת פקודת הprint בפקודה return.
    כך:

    זה עבד יופי. התוכנה באמת סיימה לרוץ אחרי הreturn כאשר הקלט לא היה מספרי בלבד.
    מה שאני לא מבין היא למה במצב שבו לא ממש אמרתי לה “תסיימי לרוץ” (באמצעות הפקודה) היא המשיכה לרוץ לתנאים שלכאורה בכלל לא התקיימו במצב הראשון.
    תודה רבה מראש!

אני מרגיש שפספסתי את השאלה.
הפונקציה מסיימת לרוץ רק כשהיא סיימה להריץ את כל הפקודות שבתוכה, או שהיא מגיעה ל־return ושם היא מסיימת את ריצתה.
ככה עובדת פייתון (ועוד כמה שפות). איפה החלק הפחות מובן?

זה קצת לא מובן לי. אני לא מבין למה היא ממשיכה לרוץ על תנאים שלא מתקיימים ומחזירה הודעת שגיאה בנוגע לתנאים האלה. לכאורה, התנאי שבו אני מבקש להמיר str לint חל רק כאשר המספר הוא רק דסימלי (כלומר יש רק מספרים בפלט), ולכן לא ברור לי למה כאשר אני מזין קלט שהוא לא רק דסימלי התוכנה מחילה אותו.

יש לך שם 2 בלוקים נפרדים – ה־if הראשון וה־if השני, והם רצים בלי תלות של אחד בשני.
בדוגמה הראשונה שנתת, אם הקלט אינו מספרי הפונקציה מדפיסה Wrong category (הבלוק הראשון) ועוברת לנסות להריץ את if number < 0. אתה חוטף TypeError כי אי אפשר להשוות בין מחרוזת למספר

מעולה הבנתי! אז אני רוצה לשאול אחרת.
השאלה שלי נבעה מכך, שחשבתי שהצלחתי ליצור “תנאי כפול”.
1-כלומר-אם זה לא מספרי תעשה X
2-ואם זה מספרי תעשי Y
3-ואז (אם זה מספרי):אם זה >0 וכו. כלומר שתנאי 3 יחול רק בתנאי שהתנאי השני יתקיים.
לא יכולתי לדעתי לעשות פה and כי תנאי 2 מחיל כבר פקודה של המרה למספר.
תודה!

בצורה אפילו יותר מחודדת.
אתה אמרת שהם רצים בלי תלות.
אני חשבתי שהם רצים עם תלות והייתי שמח להבין איך עושים את זה.

פשוט להזיח את הבלוק השני כך שיהיה בתוך הראשון.
(עם זאת, יותר מקובל לקטוע ריצה מוקדם ע"י return מאשר להזיח בלוקים)

לייק 1