דילוג לתוכן המרכזי
מודול 5 · שיעור 2 מתוך 418/36 בקורס~12 min
שיעורי מודול (2/4)

פרמטרי ברירת מחדל ומילות מפתח

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

פרמטרי ברירת מחדל

Python
def saluta(nome, saluto="Ciao"):
    return f"{saluto}, {nome}!"

saluta("Ada")              # 'Ciao, Ada!'
saluta("Ada", "Hello")     # 'Hello, Ada!'

פרמטרים עם ברירת מחדל חייבים לבוא אחרי אלה ללא:

Python
def f(a, b=1):     # OK
def f(a=1, b):     # SyntaxError

ארגומנטים של מילות מפתח

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

Python
def crea_utente(nome, eta, attivo=True):
    return {"nome": nome, "eta": eta, "attivo": attivo}

crea_utente("Ada", 36)
crea_utente(nome="Ada", eta=36, attivo=False)
crea_utente(eta=36, nome="Ada")     # any order when all are keyword

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

Python
crea_utente("Ada", eta=36)            # OK
crea_utente(nome="Ada", 36)           # SyntaxError

⚠️ מלכודת ברירת המחדל הניתנת לשינוי

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

Python
def aggiungi(elemento, lista=[]):   # BUG!
    lista.append(elemento)
    return lista

aggiungi(1)    # [1]
aggiungi(2)    # [1, 2]    !!! not [2] as you'd expect
aggiungi(3)    # [1, 2, 3]

הדפוס הנכון: השתמש ב-None כזקיף וצור אותו בפנים:

Python
def aggiungi(elemento, lista=None):
    if lista is None:
        lista = []
    lista.append(elemento)
    return lista

הסכנה של ארגומנטים ברירת מחדל משתנים

לעולם אל תשתמש באובייקטים הניתנים לשינוי (כמו רשימות או מילונים) כערכי ברירת מחדל עבור פרמטרים: למשל def add(x, my_list=[]). ערך ברירת המחדל מוערך פעם אחת בלבד כאשר הפונקציה מוגדרת, כלומר קריאות עוקבות יחלקו בדיוק את אותו אובייקט שניתן לשינוי! השיטה הטובה ביותר היא להשתמש ב-None:

Python
def add(x, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(x)
    return my_list

נסה את זה

פעילות גופנית#python.m5.l2.e1
ניסיונות: 0טוען...

הגדר 'כוח (בסיס, מעריך=2)' שמחזיר מעריך בסיס **. חישוב 'ריבוע = עוצמה(5)' ו-'קוביה = חזקה(5, מעריך=3)'. הערך את `(ריבוע, קובייה)`.

טוען עורך...
הצג רמז

החזר בסיס ** מעריך

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#python.m5.l2.e2
ניסיונות: 0טוען...

הגדר `create_record(name, values=None)` שכאשר הערכים הוא None, ישתמש ברשימה ריקה חדשה. הוסף 1 לערכים והחזר את הרשומה dict {'name': name, 'values': values}. קרא לזה פעמיים בלי להעביר ערכים והקצה ל-'a' ו-'b'. הערך `(a['values'], b['values'])`.

טוען עורך...
הצג רמז

השתמש ב-None כברירת מחדל וצור את הרשימה בתוך הפונקציה.

הפתרון זמין לאחר 3 ניסיונות

אתגר נוסף

פעילות גופנית#python.m5.l2.e3
ניסיונות: 0טוען...

הגדר פונקציה \`greet(name, message="Hello")\` שמחזירה את המחרוזת המעוצבת \`"{הודעה}, {name}!"\`. בדוק את הפונקציה על ידי קריאה ל\`greet("Bob")\` כביטוי האחרון.

טוען עורך...
הצג רמז

השתמש בפרמטר ברירת המחדל message="Hello" ובמחרוזת f עבור הברכה שהוחזרה.

הפתרון זמין לאחר 3 ניסיונות