שיעורי מודול (3/4)
*ארגס ו**קווארגס
לפעמים אתה רוצה פונקציה שמקבלת מספר משתנה של
טיעונים. Python נותן לך שני כלים: *args (אוסף ארגומנטים מיקוםיים
לתוך tuple) ו-**kwargs (אוסף ארגומנטים של מילות מפתח לכדי dict).
*args: ארגומנטים מיקום משתנים
def somma_tutto(*nums):
totale = 0
for n in nums:
totale += n
return totale
somma_tutto(1, 2, 3) # 6
somma_tutto(1, 2, 3, 4, 5) # 15
somma_tutto() # 0בתוך הפונקציה, nums הוא טופל עם כל הערכים שעברו. ה
השם הוא רק מוסכמה: *args הוא הנפוץ ביותר, אבל *nums או
*valori תקפים לחלוטין.
**kwargs: ארגומנטים משתנים של מילת מפתח
def crea_config(**opzioni):
return opzioni
crea_config(debug=True, port=8080)
# {'debug': True, 'port': 8080}בתוך הפונקציה, opzioni הוא dict עם {param_name: value}.
משלב הכל
הסדר הקבוע הוא: **פרמטרים רגילים, *args, פרמטרי ברירת מחדל, **kwargs**.
def f(primo, *args, opzione="x", **kwargs):
print(primo, args, opzione, kwargs)
f(1, 2, 3, opzione="y", extra=10)
# 1 (2, 3) y {'extra': 10}פורקים בשיחה: * ו**
אותו מפעיל עובד הפוך: "לפוצץ" רשימה/טופל לתוך ארגומנטים מיקוםיים או הכתבה לארגומנטים של מילות מפתח.
def punto(x, y, z):
return (x, y, z)
coords = [1, 2, 3]
punto(*coords) # punto(1, 2, 3) → (1, 2, 3)
opts = {"x": 1, "y": 2, "z": 3}
punto(**opts) # punto(x=1, y=2, z=3)דפוס עטיפה
def log_chiamata(fn, *args, **kwargs):
print(f"chiamo {fn.__name__} con {args=} {kwargs=}")
return fn(*args, **kwargs)
log_chiamata(max, 3, 1, 2) # calls max(3, 1, 2)
log_chiamata(sorted, [3, 1, 2], reverse=True)סדר פרמטרים בחתימות פונקציות
בעת הגדרת פונקציה המקבלת מספר סוגי ארגומנטים, עליך להקפיד על סדר קפדני בחתימה:
- פרמטרי מיקום סטנדרטיים.
- נקודות מיקום
*args. - פרמטרים של מילת מפתח עם ערכי ברירת מחדל.
- מילת מפתח varargs
**kwargs.
נסה את זה
הגדר `average(*nums)` שמחזיר את הממוצע האריתמטי (סכום / ספירה). קרא לזה עם 10, 20, 30 והקצה את התוצאה ל-'m'. הערך 'm'.
הצג רמז
sum(nums) / len(nums)
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
בהינתן הפונקציה `def point(x, y, z): החזר x + y + z` וה-dict `coords = {'x': 1, 'y': 2, 'z': 3}`, התקשרו לנקודת פירוק קוורדים והקצה את התוצאה ל-`s`. הערך `s`.
הצג רמז
נקודה(**קוורדים)
הפתרון זמין לאחר 3 ניסיונות
אתגר נוסף
Write a function `multiply_all(*args)` that returns the product of all numbers passed as arguments. If no arguments are passed, it should return `1`. Finally, evaluate the call `multiply_all(2, 3, 4)`.
הצג רמז
השתמש בלולאת for כדי לחזור על האלמנטים ב- args ולצבור את המוצר שלהם.
הפתרון זמין לאחר 3 ניסיונות