אשמח להסבר סדר פרמטרים מחברת 2

אם אפשר, למרות שלא כתוב במחברת אשמח להסבר של הסדר: (אני יכולה לנחש אבל עדיף לי לדעת את ההגיון מאחורי זה)

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

  1. ברור שהפרמטרים שהמיקום שלהם קבוע צריכים להיות לפני אלו שהמיקום שלהם לא קבוע, כדי שיהיה אפשר לקרוא להם בלי השם שלהם.
  2. בגזרת הפרמטרים ללא השם: אלו שאנחנו יודעים מי הם הולכים להיות חייבים להיות לפני *args, כיוון שאם יהיו אחרי *args לא נדע מתי סיימנו להסתכל על *args והתחלנו להסתכל על הפרמטרים שמיקומם קבוע.
  3. בגזרת הפרמטרים עם השם: הפרמטרים שהשמות שלהם ידועים חייבים להיות לפני אלו עם השמות הלא ידועים, כיוון שאפשר עדיין לא לציין את השם שלהם וזה יעבוד, לעומת **kwargs ששם אין דרך להתחמק מלציין את השם.

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

מתחילים עם ארגומנט במיקום קבוע כי הוא הראשון (אם הוא לא args*). אנחנו יודעים מי הוא הולך להיות כי זה או True או False?
ומה ההבדל בין ingredients ל prices? ההבדל הוא בגלל שingredients הם רק שמות ואין להם ערך שיכול להשתנות? כלומר בגלל שingredients במקום השני זה בסדר שהם נשארים שם אבל בגלל שאחריהם אי אפשר לשים עוד רשימת ארגומנטים אז קודם שמים משהו אחר כמו משהו שהערך שלו נקבע בראש הפונקציה.
האם “שמותיהם לא ידועים מראש” מקביל ל"לא יודעים מי הם הולכים להיות"?

תודה מראש, אני יודעת שזה קצת מתסכל לעבור על זה כשזה נראה כל כך ברור

זה לא מתסכל, אבל אני קצת מתקשה להבין מה השאלה ^^"

לא הבנתי את ההגדרות של מיקום קבוע, “יודעים מי הוא הולך להיות” ו “שמותיהם ידועים מראש”.

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

  1. יש פשוט פרמטרים שהשם שלהם כתוב בכותרת הפונקציה וזהו. בלי כוכביות, בלי שווה, פשוט אך ורק השם שלהם. אלו פרמטרים שהשם שלהם קבוע והם ימסרו בארגומנטים לפי הסדר שהם הוגדרו בכותרת הפונקציה.
  2. הפרמטרים שבאים אחרים זה *args – עוד ערכים, שלא ציינו את השם שלהם ולא יודעים כמה מהם הולכים לבוא. בתוך המשתנה הזה ששמו הוגדר אחרי כוכבית אחת ישמר tuple, בו יהיה את כל הפרמטרים שהועברו עם ערכים בלבד (positional arguments), שלא בצורה x=y.
  3. אח"כ באים פרמטרים עם ערך דיפולטי שהשם שלהם ידוע מראש והוגדר בכותרת הפונקציה, כמו x=1, לדוגמה (השם הוא x, ערך ברירת המחדל הוא 1).
  4. אח"כ יהיו פרמטרי **kwargs, שהשם שלהם לא ידוע (אפשר להעביר להם מה שהם רוצים). המשתנה שיש לפניו 2 כוכביות בכותרת הפונקציה יהיה משתנה מילוני שמקבל את כל שמות הפרמטרים והערכים שלהם
3 לייקים

תודה רבה! החידוד מאוד עזר !

מצטרפת לשאלה - הנושא עדיין לא ברור לי (גם אחרי החידודים)

  • באופן כללי לגבי סדר הארגומנטים:
  1. הארגומנט apply_discount הוא עם מיקום קבוע - פשוט כי הוא מופיע ראשון? כי הוא מכיל ערך יחיד? כי יש לו שם ידוע?
  2. הארגומנט ingredients הוא עם מיקום קבוע כי הוא מופיע אחרי ארגומנט עם ערך יחיד?
  3. מה ההבדל בין ingredients ו - prices מבחינת הסדר שלהם? בשני המקרים לא ידוע מה השם ומה האורך של הארגומנטים
  4. למה ארגומנטים עם ערך דיפולטי נמצאים בין ארגומנטים עם כוכבית וארגומנטים עם שתי כוכביות?
  • שאלה נוספת לגבי התרגיל:

האם אמורים להעתיק את הפונקציה כמו שהיא, כאשר הארגומנטים בלי כוכביות ועם סדר שונה?
כאשר שמים את prices אחרון מקבלים את השגיאה הבאה:

SyntaxError: non-default argument follows default argument

לפי השגיאה נראה ש discount_rate=10 צריך להיות אחרון (מאחר וארגומנטים בלי ברירת מחדל לא יכולים להיות אחרי ארגומנטי עם ברירת מחדל)
אך כאשר שמים את discount_rate=10 בסוף, מקבלים את השגיאה הבאה:

TypeError: calculate_cake_price() got an unexpected keyword argument ‘chocolate’

אשמח אם מישהו יוכל להסביר איפה אני טועה