دروس الوحدة (3/4)
* الحجج و ** kwargs
في بعض الأحيان تريد دالة تقبل عددًا متغيرًا من
الحجج. تمنحك Python أداتين: *args (تجمع الوسائط الموضعية
في صف) و **kwargs (يجمع وسيطات الكلمات الرئيسية في الإملاء).
*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 عبارة عن tuple مع جميع القيم التي تم تمريرها. ال
الاسم مجرد اصطلاح: *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. - معلمات الكلمات الرئيسية ذات القيم الافتراضية.
- متغيرات الكلمات الرئيسية
**kwargs.
جربه
حدد `average(*nums)` الذي يُرجع المتوسط الحسابي (المجموع / العدد). أطلق عليها 10، 20، 30 وقم بتعيين النتيجة إلى `m`. تقييم "م".
إظهار التلميح
مجموع (الأعداد) / لين (الأعداد)
الحل متاح بعد 3 من المحاولات
تمرين المراجعة
بالنظر إلى الوظيفة `def point(x, y, z): إرجاع x + y + z` والإملاء `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 للتكرار على العناصر الموجودة في الوسائط وتجميع منتجاتها.
الحل متاح بعد 3 من المحاولات