Python للذكاء الاصطناعي متوسط · Intermediate 12 دقيقة

الدوال

Functions

تنظيم الشيفرة في وحدات قابلة لإعادة الاستخدام باستخدام def والمعاملات والقيم المعادة.

تقدّمك في المسار0%

تعريف دالة

def accuracy(correct, total):
    """تعيد نسبة الإجابات الصحيحة."""
    if total == 0:
        return 0.0
    return correct / total

print(accuracy(45, 50))   # 0.9

النص بين علامات الاقتباس الثلاثية هو docstring، ويظهر عند كتابة help(accuracy).

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

def train(epochs=10, lr=0.01):
    print(epochs, lr)

train()                 # 10 0.01
train(lr=0.001)         # 10 0.001

*args و**kwargs

def mean(*values):
    return sum(values) / len(values)

def show(**options):
    for k, v in options.items():
        print(k, "=", v)

mean(1, 2, 3)            # 2.0
show(model="CNN", depth=3)

النطاق

threshold = 0.5           # متغير عام
def classify(p):
    label = 1 if p >= threshold else 0   # label محلي
    return label

يمكن قراءة المتغير العام داخل الدالة، لكن الأفضل تمرير القيم كمعاملات لجعل الدالة مستقلة وسهلة الاختبار.

دوال lambda

دوال قصيرة بلا اسم تُستخدم غالباً كمعامل لدوال أخرى:

pairs = [("a", 0.7), ("b", 0.9)]
pairs.sort(key=lambda t: t[1], reverse=True)

تلميحات الأنواع

def scale(x: float, factor: float = 2.0) -> float:
    return x * factor

التلميحات لا تُفرض وقت التشغيل، لكنها تساعد المحررات وأدوات الفحص الساكن.

مزلق شائع

لا تستخدم كائناً قابلاً للتعديل كقيمة افتراضية:

def add(item, bag=None):
    if bag is None:
        bag = []
    bag.append(item)
    return bag

مصطلحات الدرس

الدالة Function
كتلة شيفرة مسماة تؤدي مهمة محددة ويمكن استدعاؤها مرات متعددة بمدخلات مختلفة.
النطاق Scope
المنطقة من البرنامج التي يكون فيها اسم المتغير معرَّفاً ومتاحاً.

الملخص

الدالة كتلة شيفرة مسماة تُعرَّف بالكلمة def، تستقبل معاملات وتعيد قيمة بالكلمة return. تدعم Python المعاملات الافتراضية والمسماة و*args و**kwargs، وللمتغيرات نطاق (scope) محلي داخل الدالة. توثيق الدالة بنص docstring وتلميحات الأنواع يحسّن قابلية القراءة.

أسئلة مراجعة

  1. ماذا تعيد الدالة التي لا تحتوي على return؟

    تعيد None.

  2. لماذا يُفضّل عدم استخدام قائمة كقيمة افتراضية لمعامل؟

    لأن القيمة الافتراضية تُنشأ مرة واحدة عند تعريف الدالة وتُشارك بين الاستدعاءات، فتتراكم التعديلات عليها.

المصادر والمراجع

  1. Defining Functions — Python documentation
  2. More on Defining Functions — Python documentation

إكمال الدرس