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

المعلمات الافتراضية والكلمات الرئيسية

يمكن أن تحتوي معلمات الدالة على قيم افتراضية: إذا لم ينجح المتصل لهم، يتم استخدام الإعدادات الافتراضية. يمكنك أيضًا استدعاء دالة لتمرير المعلمات بالاسم (وسائط الكلمات الرئيسية).

المعلمات الافتراضية

Python
def saluta(nome, saluto="Ciao"):
    return f"{saluto}, {nome}!"

saluta("Ada")              # 'Ciao, Ada!'
saluta("Ada", "Hello")     # 'Hello, Ada!'

يجب أن تأتي المعلمات ذات الإعدادات الافتراضية بعد المعلمات التي لا تحتوي على:

Python
def f(a, b=1):     # OK
def f(a=1, b):     # SyntaxError

وسيطات الكلمات الرئيسية

يمكنك تمرير الوسيطات بالاسم، بأي ترتيب، مما يجعل المكالمة أكثر قابلة للقراءة:

Python
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

القاعدة الذهبية: في المكالمة، تأتي الوسائط الموضعية قبل وسائط الكلمات الرئيسية.

Python
crea_utente("Ada", eta=36)            # OK
crea_utente(nome="Ada", 36)           # SyntaxError

⚠️ المأزق الافتراضي المتغير

** لا تستخدم مطلقًا ** كائنًا قابلاً للتغيير (list، dict، set) كقيمة افتراضية: the يتم تقييم القيمة الافتراضية مرة واحدة، عندما يتم تعريف الوظيفة ومشاركتها عبرها جميع المكالمات.

Python
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 كحارس وقم بإنشائه بالداخل:

Python
def aggiungi(elemento, lista=None):
    if lista is None:
        lista = []
    lista.append(elemento)
    return lista

خطر الحجج الافتراضية القابلة للتغيير

لا تستخدم أبدًا كائنات قابلة للتغيير (مثل القوائم أو القواميس) كقيم افتراضية للمعلمات: على سبيل المثال def add(x, my_list=[]). يتم تقييم القيمة الافتراضية مرة واحدة فقط عند تحديد الوظيفة، مما يعني أن الاستدعاءات اللاحقة ستشارك نفس الكائن القابل للتغيير بالضبط! أفضل الممارسات هي استخدام None:

Python
def add(x, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(x)
    return my_list

جربه

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

حدد `power(base, exponent=2)` الذي يُرجع الأساس ** الأس. احسب "المربع = القدرة (5)" و"المكعب = القدرة (5، الأس = 3)". قم بتقييم `(مربع، مكعب)`.

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

قاعدة الإرجاع ** الأس

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

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

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

حدد `create_record(name,values=None)` الذي يستخدم قائمة فارغة جديدة عندما تكون القيم بلا. قم بإلحاق 1 بالقيم وإرجاع إملاء السجل {'name': name, 'values': value}. اتصل به مرتين دون تمرير القيم وقم بتعيين `a` و`b`. قم بتقييم `(أ['القيم']، ب['القيم'])`.

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

استخدم لا شيء كإعداد افتراضي وقم بإنشاء القائمة داخل الوظيفة.

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

التحدي الإضافي

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

حدد وظيفة \`greet(name, message="Hello")\` التي تُرجع السلسلة المنسقة \`"{message}, {name}!"\`. اختبر الدالة عن طريق استدعاء \`greet("Bob")\` كتعبير أخير.

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

استخدم رسالة المعلمة الافتراضية = "Hello" وسلسلة f للترحيب الذي تم إرجاعه.

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