אליבי לרוצחים-הקדמה לפתרון

למיטב הבנתי, אני צריך להיכנס לתוך הtuple שהצגתם עם ** (זה לדעתי בוודאות יידרש בתוך התרגיל) וככה לחלץ את הסוגיות הנוגעות לשם ולהוכחות. בשביל לעשות את זה שיחקתי קצת עם פונקציה דומה שאתם סיפקתם, וראיתי משהו מוזר מאוד.
מדובר בפונקציה שמקבלת שני משתנים X Y, ומדפיסה את המשתנים הללו בתוספת הסימונים המקובלים לאורך ורוחב N E. כאשר אנחנו משתמשים ב** ברשימה או בtuple שבו יש מילון, והמילון מרכיב את המפתחות X Y ואת הערכים המתקבלים לכל מפתח, אזי ה** נכנס לתוך המילון ומוציא את הערכים (בניגוד לפקודה * שאז הוא היה נכנס “חצי דרך” ומוציא רק את המפתחות), כדי אז להחיל עליהם את הפקודות של הפונקציה, שמקבלת שני משתנים.
נראה בצילום:


עד כאן הכול טוב ויפה.
אממה, יש פה משהו שממש פוצץ לי את המוח. בוא נחליף את המפתח (הנומינלי לחלוטין, חסר משמעות, סטרינג ולא יותר) “X” במפתח “B”. ונריץ את אותה פקודה. הרי הפונצקיה מקבלת עדיין שני משתנים, זה שאנחנו כינינו אותם בשמות X וY לא אמור לשנות. מה נקבל?

ג’יזז! נראה שהבחור ממש מאוכזב מזה שלא הבאנו לו את המשתנה “X”. ואת זה אני ממש ממש ממש לא מבין. תודה רבה ואחלה יום!

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

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

הפונקציה תקבל את המילון לפי **kwargs ללא קשר לשמות המפתח: ערך , אבל אם אתה רוצה גם לקרוא להם ללא לדעת את שמם, צריך לכתוב לולאה מתאימה בתוך הפונקציה. רק להחליף את שם המפתח ל b ואז לנסות לקרוא לו ב x או להיפך לא יעבוד. שים לב שפה הפונקציה כמו שהוגדרה מקבלת את המפתח (ממש, השם שלו) : מה שהפונקציה מקבלת כשאתה מעביר את **location זה מה שבתוך המילון ממש:
{‘b’: 36.671111, ‘y’: 65.808056’}
ולזה אתה מנסה לקרוא בתוך הפונקציה לפי שם המפתח

למיטב הבנתי, **kwargs משמש לקריאה למספר בלתי מוגבל של משתנים לפי שם (שבוע 5 מחברת 2), כשאתה מחליף את x ב b אתה מנסה למעשה לקרוא למשתנה לפי מיקום.

לייק 1

תודה!
לא הבנתי את כל מה שכתבת אבל אני רוצה להתייחס רק לפסקה הראשונה.
את אמרת ש" כדי לקבל ערך עבור מפתח מסוים, צריך לקרוא לו בשם שלו" אני חושב שעליתי פה על משהו שממש לא הבנתי וטוב שאני מסביר אותו לעצמי עכשיו. אשמח לשמוע את דעתך בעניין.
ראשית, ברור שהפונקציה print_treasure_location לא מחפשת מפתח. היא מקבל שני משתנים ומוסיפה להם שתי אותיות (N, E).
למשל, ברור שאם נכתוב בפונקציה: print_treasure_location בתוך הסוגריים את האותיות (“c”, “d”) או כול אות אחרת (שאינן X Y המוגדרות), הפונקציה תרוץ בלי בעיה. זה כמובן בדיוק העניין של פונקציות הם מקבלות משתנים שמוגדרים מחוץ אליהן ופועלות בהתאם. יותר מזה, כאשר אני שם כוכבית אחת, כלומר כאשר אני מפנה את הפונקציה להדפסת המפתח ולא הדפסת הערך, הפונקציה רצה בלי בעיות ואכן מדפיסה כל מפתח שהוא, לדוגמא כאן שיניתי שוב את הX לB והפונקציה הדפיסה אותו בלי בעיה:


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

אני ממליצה להסתכל בשבוע 5 מחברת 2 באופן כללי, ובמונחים לקראת הסוף במיוחד. אני חזרתי לשם בשביל השאלה הזו, וגם אני הסתבכתי קצת עם ה unpacking באיזשהוא שלב. מה שאני הבנתי בסוף זה ככה: פייתון מוכנה לעשות הרבה ‘תרגום’ של פרמטרים שנשלחים לפונקציה, וזאת בתנאי שהם נשלחים בצורה שאינה דו משמעית, ולכן יש מוסכמות בינינו לבין פייתון איך אנחנו שולחים פרמטרים לפונקציה. בין השאר אנחנו יכולים לשלוח פרמטרים לפי מיקום או פרמטרים לפי שם. כאשר אנחנו שולחים פרמטרים לפי מיקום, זה לא משנה איך קוראים להם - אנחנו אומרים לפייתון - קחי את המשתנה הראשון שאת רואה ותעשי איתו {…} ואת המשתנה השני ו {…}. זה מה שקורה כשכתוב x, y או b, y וכן הלאה. הסימון * מאפשר לנו לשלוח איטרבל שמכיל משתנים שישלחו לפי מיקומם (למעשה מיקומם באיטרבל) - עבור הדוגמא שלנו דמיין רשימת המפתחות הראשון נשלח ל x עבורו מוגדרת הפונקציה והשני עבור הy.
לעומת זאת, בשימוש ב **kwargs אנחנו שולחים משתנים לפי שם פייתון מתרגמת את זה כך עבור הדוגמא הספציפית הזאת:ש:
(b’=36.671111, y=65.808056’)
ואז חייבים לקרוא למשתנים בשמם שהרגע סיפקנו, כי שלחנו לפייתון משתנים לפי שם ולא לפי מיקום.

לייק 1