الانتقال إلى المحتوى الرئيسي
الوحدة 5 · الدرس 3 من 419/36 في الدورة~12 min
دروس الوحدة (3/4)

* الحجج و ** kwargs

في بعض الأحيان تريد دالة تقبل عددًا متغيرًا من الحجج. تمنحك Python أداتين: *args (تجمع الوسائط الموضعية في صف) و **kwargs (يجمع وسيطات الكلمات الرئيسية في الإملاء).

*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 عبارة عن tuple مع جميع القيم التي تم تمريرها. ال الاسم مجرد اصطلاح: *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. متغيرات الكلمات الرئيسية **kwargs.

جربه

تمرين#python.m5.l3.e1
المحاولات: 0جارٍ التحميل…

حدد `average(*nums)` الذي يُرجع المتوسط ​​الحسابي (المجموع / العدد). أطلق عليها 10، 20، 30 وقم بتعيين النتيجة إلى `m`. تقييم "م".

جارٍ تحميل المحرر…
إظهار التلميح

مجموع (الأعداد) / لين (الأعداد)

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#python.m5.l3.e2
المحاولات: 0جارٍ التحميل…

بالنظر إلى الوظيفة `def point(x, y, z): إرجاع x + y + z` والإملاء `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 للتكرار على العناصر الموجودة في الوسائط وتجميع منتجاتها.

الحل متاح بعد 3 من المحاولات