מחברת 6 איקס עיגול פונקציות בתוך פונקציות

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

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

לא הבנתי למה התכוונת. רק כדי להסביר, מעל כל הפונקציות יש לי משתנה בשם board שמכיל את הלוח. כשאני מריץ winner = check_board(board) אני בעצם מריץ את הפונקציה ומשים את התוצאה שלך בתוך winner ואז מדפיס את winner לצרכי בדיקה (או לפחות זה מה שחשבתי שעשיתי). לכן לא ברור לי מה הבעיה (השורה האחרונה רק מדפיסה את המשתנה).

אתה יכול להדביק פה את ההערה עצמה שזה נותן לך ?

זה כי דרסת את הפונק’ עם השם של עצמה :slight_smile:

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

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

ברגע שפייתון באה להריץ פונקציה, היא שומרת בצד את שמות כל המשתנים ש"חיים" בתוך הפונקציה.
בשורה של ההשמה, פייתון מסתכלת קודם על צד ימין. היא יודעת שבפונקציה הזו יש משתנה בשם horizontal, אבל היא מחפשת ורואה שעדיין לא השמת לתוכו. אז מבחינת פייתון – הולך להיות משתנה כזה בהמשך הפונקציה, אבל עדיין לא ביצעת לתוכו השמה. ולכן ה־UnboundLocalError – אתה מנסה לקרוא למשתנה שמבחינתה יהיה בו ערך בהמשך, אבל כרגע עדיין לא קיים.
היא לא מחפשת את הפונקציה החיצונית מכיוון שהיא “יודעת” שבתוך הפונקציה הפנימית הוגדר משתנה בשם horizontal, ולו היא נותנת את הקדימות

2 לייקים

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

מוסבר ב־FAQ של פייתון, אבל ארחיב.

שלבים עבור פייתון:

  1. נכנסת לשורה הראשונה של הפונקציה.
  2. מסתכלת על כל שמות המשתנים שהולכים להיות מוגדרים במהלך ריצת הפונקציה,
  3. שומרת את השמות שלהם בצד. “אלו משתנים מקומיים ואני צריכה להתייחס אליהם ככאלו”.
  4. בהשמה, כמו בכל השמה, פייתון לא מתייחסת לאגף שמאל עד שאגף ימין “פתור”. היא ממירה את board1 ללוח שלך, ואז באה לקרוא ל־horizontal עם board1 כפרמטר.
  5. אבל horizontal לפי סעיף 2 היא משתנה מקומי בכלל!
  6. אבל horizontal “המקומי” עדיין לא הוגדר בתוך הפונקציה, אין לו ערך כרגע.
  7. סתירה, קריסה, UnboundnLocalError
2 לייקים

גם אני מקבלת את התקלה הזו… , שיניתי את כל השמות בקוד כך שאין דברים שדומים זה לזה, ועדיין אותה תקלה… אשמח להכוונה

את יכולה לצלם את השגיאה שאת מקבלת ?<

הנה השגיאה:

image

את מגדירה את המשתנה שאת מעוניינת להחזיר רק אם את נכנסת לאחד מהתנאים. כלומר, ייתכן שיהיו מקרים בהם לא תגדירי את המשתנה ובכל זאת תנסי להחזיר אותו, וזו שגיאה

לייק 1

יש, עזרת לי מאוד, תודה רבה!