שבוע 2- תנאים- טיפול במקרים מרובים

כשבונים תנאי בתוך תנאי ויש היררכיה, איך אני יודעת מה התנאי הראשון שממנו צריך להתחיל? האם יש לזה חשיבות?
האם העיקרון הוא שאני מתחילה בתנאי המגביל יותר ומשם יורדת לתנאים הפחות מגבילים? או שהעיקרון הוא שהתנאי הראשון דווקא מכיל בתוכו את התנאים הבאים ובמידה ולא מתקיים ממשיכים רק לחלקים מתוכו שאולי מתקיימים?
לדוגמה במחברת 3 בתרגיל “פיזבאז”- קודם להתחיל במצב בו המספר המבוקש מתחלק גם ב-3 וגם ב-5 ובמידה ולא מתקיים להמשיך למצב בו מתחלק רק ב-3 או רק ב-5? או דווקא להתחיל מהמצבים הכלליים יותר (מספר שמתחלק ב-3 ותחתיו לבדוק האם בנוסף מתחלק גם ב-5)?
דוגמה אחרת במחברת 2 בדירוג האלבומים- מתחילים בתנאי של אלבום היהלום שאינו בהכרח מכיל תחתיו את כל שאר התנאים (כי שאר האלבומים מצריכים מספר נמוך יותר של מכירות) ובמידה ולא מתקיים ממשיכים לתנאים פחות מגבילים.

סליחה על הסיבוך, מקווה שהשאלה הועברה פחות או יותר.

לייק 1

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

4 לייקים

היי! גם השאלה מצוינת וגם התשובה של אלמוג מצוינת, אבל אחדד:

לפעמים יש צורך מבחינה לוגית לסדר את התנאים לפי סדר מסוים. פייתון קורא את הקוד מלמעלה למטה, ואם אחד התנאים בבלוק מתקיים (נניח ה־if הראשון), שאר התנאים לא יבדקו בכלל (שאר ה־elifים או ה־else). אפשר לראות דוגמה כזו במחברת, על אלבום היהלום וכו’.

כשלא עולה צורך כזה, נהוג לבחור באחת משתי אפשרויות:

  1. זה קצת קשוח, אבל אנסה להסביר טוב יותר אם זה לא מובן – לכתוב את התנאים בסדר שמחמיא ליעילות התוכנית. זאת אומרת: לבדוק כמה כל אחד מהתנאים שאנחנו הולכים לכתוב נפוץ, וכמה זמן הולך לקחת להריץ את התנאי.
    1.1 לדוגמה, אם יש לנו שלושה תנאים שהסבירות שיתקיימו היא 1/3 כל אחד, אבל לבדיקת התנאי הראשון והשני לוקח 5 דקות לרוץ ולבדיקת התנאי השלישי לוקח 3 שניות לרוץ, אנחנו נשים ב־if את התנאי השלישי (3 שניות) ואת התנאים הראשון והשני נשאיר ל־elif ול־else.
    1.2 אותו דבר נעשה אם זמן ההרצה של כל התנאים זהה, אבל הסיכוי שהתנאי הראשון והשני יתקיימו הוא 10% עבור כל אחד, ו־80% עבור התנאי השלישי. נעדיף לרשום את התנאי השלישי למעלה, כי זה יחסוך לתוכנה שלנו לבדוק “סתם” את התנאי הראשון והשלישי כל פעם.
  2. אם אין הבדל גדול בין הסיכוי שכל אחד מהתנאים יקרה, או ביעילות שלהם (זה מה שקורה בד"כ, כנראה), עדיף לרשום את זה בצורה כמה שיותר “סיפורית”, ככה שקוראים אחרים יצליחו לקרוא ולהבין את ההשתלשלות הלוגית.

מקווה שהבהרתי את הנושא ופיזרתי מעט את הערפל.
– ים

4 לייקים