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

*ארגס ו**קווארגס

לפעמים אתה רוצה פונקציה שמקבלת מספר משתנה של טיעונים. Python נותן לך שני כלים: *args (אוסף ארגומנטים מיקוםיים לתוך tuple) ו-**kwargs (אוסף ארגומנטים של מילות מפתח לכדי dict).

*args: ארגומנטים מיקום משתנים

Python
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: ארגומנטים משתנים של מילת מפתח

Python
def crea_config(**opzioni):
    return opzioni

crea_config(debug=True, port=8080)
# {'debug': True, 'port': 8080}

בתוך הפונקציה, opzioni הוא dict עם {param_name: value}.

משלב הכל

הסדר הקבוע הוא: **פרמטרים רגילים, *args, פרמטרי ברירת מחדל, **kwargs**.

Python
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}

פורקים בשיחה: * ו**

אותו מפעיל עובד הפוך: "לפוצץ" רשימה/טופל לתוך ארגומנטים מיקוםיים או הכתבה לארגומנטים של מילות מפתח.

Python
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)

דפוס עטיפה

Python
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)

סדר פרמטרים בחתימות פונקציות

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

  1. פרמטרי מיקום סטנדרטיים.
  2. נקודות מיקום *args.
  3. פרמטרים של מילת מפתח עם ערכי ברירת מחדל.
  4. מילת מפתח varargs **kwargs.

נסה את זה

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

הגדר `average(*nums)` שמחזיר את הממוצע האריתמטי (סכום / ספירה). קרא לזה עם 10, 20, 30 והקצה את התוצאה ל-'m'. הערך 'm'.

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

sum(nums) / len(nums)

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

סקירת התרגיל

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

בהינתן הפונקציה `def point(x, y, z): החזר x + y + z` וה-dict `coords = {'x': 1, 'y': 2, 'z': 3}`, התקשרו לנקודת פירוק קוורדים והקצה את התוצאה ל-`s`. הערך `s`.

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

נקודה(**קוורדים)

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

אתגר נוסף

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

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 ניסיונות