دروس الوحدة (2/4)
المعلمات الافتراضية والكلمات الرئيسية
يمكن أن تحتوي معلمات الدالة على قيم افتراضية: إذا لم ينجح المتصل لهم، يتم استخدام الإعدادات الافتراضية. يمكنك أيضًا استدعاء دالة لتمرير المعلمات بالاسم (وسائط الكلمات الرئيسية).
المعلمات الافتراضية
def saluta(nome, saluto="Ciao"):
return f"{saluto}, {nome}!"
saluta("Ada") # 'Ciao, Ada!'
saluta("Ada", "Hello") # 'Hello, Ada!'يجب أن تأتي المعلمات ذات الإعدادات الافتراضية بعد المعلمات التي لا تحتوي على:
def f(a, b=1): # OK
def f(a=1, b): # SyntaxErrorوسيطات الكلمات الرئيسية
يمكنك تمرير الوسيطات بالاسم، بأي ترتيب، مما يجعل المكالمة أكثر قابلة للقراءة:
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القاعدة الذهبية: في المكالمة، تأتي الوسائط الموضعية قبل وسائط الكلمات الرئيسية.
crea_utente("Ada", eta=36) # OK
crea_utente(nome="Ada", 36) # SyntaxError⚠️ المأزق الافتراضي المتغير
** لا تستخدم مطلقًا ** كائنًا قابلاً للتغيير (list، dict، set) كقيمة افتراضية: the يتم تقييم القيمة الافتراضية مرة واحدة، عندما يتم تعريف الوظيفة ومشاركتها عبرها جميع المكالمات.
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 كحارس وقم بإنشائه بالداخل:
def aggiungi(elemento, lista=None):
if lista is None:
lista = []
lista.append(elemento)
return listaخطر الحجج الافتراضية القابلة للتغيير
لا تستخدم أبدًا كائنات قابلة للتغيير (مثل القوائم أو القواميس) كقيم افتراضية للمعلمات: على سبيل المثال def add(x, my_list=[]). يتم تقييم القيمة الافتراضية مرة واحدة فقط عند تحديد الوظيفة، مما يعني أن الاستدعاءات اللاحقة ستشارك نفس الكائن القابل للتغيير بالضبط! أفضل الممارسات هي استخدام None:
def add(x, my_list=None):
if my_list is None:
my_list = []
my_list.append(x)
return my_listجربه
حدد `power(base, exponent=2)` الذي يُرجع الأساس ** الأس. احسب "المربع = القدرة (5)" و"المكعب = القدرة (5، الأس = 3)". قم بتقييم `(مربع، مكعب)`.
إظهار التلميح
قاعدة الإرجاع ** الأس
الحل متاح بعد 3 من المحاولات
تمرين المراجعة
حدد `create_record(name,values=None)` الذي يستخدم قائمة فارغة جديدة عندما تكون القيم بلا. قم بإلحاق 1 بالقيم وإرجاع إملاء السجل {'name': name, 'values': value}. اتصل به مرتين دون تمرير القيم وقم بتعيين `a` و`b`. قم بتقييم `(أ['القيم']، ب['القيم'])`.
إظهار التلميح
استخدم لا شيء كإعداد افتراضي وقم بإنشاء القائمة داخل الوظيفة.
الحل متاح بعد 3 من المحاولات
التحدي الإضافي
حدد وظيفة \`greet(name, message="Hello")\` التي تُرجع السلسلة المنسقة \`"{message}, {name}!"\`. اختبر الدالة عن طريق استدعاء \`greet("Bob")\` كتعبير أخير.
إظهار التلميح
استخدم رسالة المعلمة الافتراضية = "Hello" وسلسلة f للترحيب الذي تم إرجاعه.
الحل متاح بعد 3 من المحاولات