שיעורי מודול (2/4)
פרמטרי ברירת מחדל ומילות מפתח
לפרמטרים של פונקציה יכולים להיות ערכי ברירת מחדל: אם המתקשר לא עובר אותם, נעשה שימוש בברירות המחדל. אתה יכול גם לקרוא לפונקציה שמעבירה פרמטרים בשם (ארגומנטים של מילת מפתח).
פרמטרי ברירת מחדל
def saluta(nome, saluto="Ciao"):
return f"{saluto}, {nome}!"
saluta("Ada") # 'Ciao, Ada!'
saluta("Ada", "Hello") # 'Hello, Ada!'פרמטרים עם ברירת מחדל חייבים לבוא אחרי אלה ללא:
def f(a, b=1): # OK
def f(a=1, b): # SyntaxErrorארגומנטים של מילות מפתח
אתה יכול להעביר טיעונים לפי שם, בכל סדר, מה שהופך את השיחה ליותר קריא:
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כלל זהב: בקריאה, ארגומנטים מיקוםיים מגיעים לפני ארגומנטים של מילות מפתח.
crea_utente("Ada", eta=36) # OK
crea_utente(nome="Ada", 36) # SyntaxError⚠️ מלכודת ברירת המחדל הניתנת לשינוי
לעולם אל השתמש באובייקט שניתן לשנות (רשימה, dict, set) כערך ברירת מחדל: ה ברירת המחדל מוערכת פעם אחת, כאשר הפונקציה מוגדרת ומשותפת על פניה כל השיחות.
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 כזקיף וצור אותו בפנים:
def aggiungi(elemento, lista=None):
if lista is None:
lista = []
lista.append(elemento)
return listaהסכנה של ארגומנטים ברירת מחדל משתנים
לעולם אל תשתמש באובייקטים הניתנים לשינוי (כמו רשימות או מילונים) כערכי ברירת מחדל עבור פרמטרים: למשל def add(x, my_list=[]). ערך ברירת המחדל מוערך פעם אחת בלבד כאשר הפונקציה מוגדרת, כלומר קריאות עוקבות יחלקו בדיוק את אותו אובייקט שניתן לשינוי! השיטה הטובה ביותר היא להשתמש ב-None:
def add(x, my_list=None):
if my_list is None:
my_list = []
my_list.append(x)
return my_listנסה את זה
הגדר 'כוח (בסיס, מעריך=2)' שמחזיר מעריך בסיס **. חישוב 'ריבוע = עוצמה(5)' ו-'קוביה = חזקה(5, מעריך=3)'. הערך את `(ריבוע, קובייה)`.
הצג רמז
החזר בסיס ** מעריך
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
הגדר `create_record(name, values=None)` שכאשר הערכים הוא None, ישתמש ברשימה ריקה חדשה. הוסף 1 לערכים והחזר את הרשומה dict {'name': name, 'values': values}. קרא לזה פעמיים בלי להעביר ערכים והקצה ל-'a' ו-'b'. הערך `(a['values'], b['values'])`.
הצג רמז
השתמש ב-None כברירת מחדל וצור את הרשימה בתוך הפונקציה.
הפתרון זמין לאחר 3 ניסיונות
אתגר נוסף
הגדר פונקציה \`greet(name, message="Hello")\` שמחזירה את המחרוזת המעוצבת \`"{הודעה}, {name}!"\`. בדוק את הפונקציה על ידי קריאה ל\`greet("Bob")\` כביטוי האחרון.
הצג רמז
השתמש בפרמטר ברירת המחדל message="Hello" ובמחרוזת f עבור הברכה שהוחזרה.
הפתרון זמין לאחר 3 ניסיונות