الدوال في بايثون

الدوال في بايثون

توضح هذه المقالة الدوال في بايثون۔

YouTube Video

الدوال في بايثون

الدوال في بايثون هي ميزة أساسية لتعريف كتل رمز قابلة لإعادة الاستخدام، مما يتيح لك تنظيم وتبسيط برنامجك من خلال استدعائها عند الحاجة.۔ استخدام الدوال يمكن أن يحسن من قابلية قراءة الكود ويلتزم بمبدأ DRY (لا تكرر نفسك، تجنب كتابة نفس الكود عدة مرات).۔

تعريف الدوال

يتم تعريف الدوال باستخدام الكلمة المفتاحية def۔ الصيغة الأساسية كما يلي:۔

1def function_name(arg1, arg2, ..., argN):
2    """docstring (A brief description of the function)"""
3    processing
4    return return_value

على سبيل المثال، لتعريف دالة تجمع بين رقمين، يمكنك كتابة التالي:۔

1def add(x, y):
2    """A function that adds two numbers and returns the result"""
3    return x + y

استدعاء الدوال

يمكن استدعاء واستخدام الدالة المعرفة كما يلي:۔

1result = add(3, 4)
2print(result)  # Output: 7

مكونات الدالة

  1. اسم الدالة

    • اسم الدالة، يُستخدم عند استدعائها۔
  2. المعاملات (الوسائط)

    • أسماء المتغيرات التي تستقبل البيانات المُمررة عند الاستدعاء۔ يمكنك تعريف صفر أو أكثر من الوسائط۔
  3. سلسلة التوثيق (Docstring)

    • سلسلة تصف هدف واستخدام الدالة۔ اختياري۔
  4. جسم الدالة

    • كتلة متداخلة حيث تُكتب التعليمات التي تنفذها الدالة۔
  5. القيمة المُعادة

    • القيمة التي يتم إرجاعها إلى المستدعي باستخدام عبارة return۔ إذا تم حذف عبارة return، فسيتم إرجاع القيمة الافتراضية None۔

أنواع الوسائط (المعلمات)

في بايثون، هناك عدة أنواع من الوسائط۔

  1. المعاملات الموضعية
    • الطريقة المعتادة لتمرير المعاملات إلى الدالة۔
  2. المعاملات الافتراضية
    • تعيين قيم افتراضية للمعاملات بحيث يمكن تجاهلها عند استدعاء الدالة۔
1def greet(name, message="Hello"):
2    print(f"{message}, {name}")
3
4greet("Alice")  # "Hello, Alice"
5greet("Bob", "Good morning")  # "Good morning, Bob"
  1. المعاملات ذات الطول المتغير
    • args تستقبل عدة معاملات موضعية كمجموعة، وkwargs تستقبلها كمعجم۔
1def func(*args, **kwargs):
2    print("args:", args)
3    print("kwargs:", kwargs)
4
5func(1, 2, 3, a=4, b=5)
6# Output:
7# args: (1, 2, 3)
8# kwargs: {'a': 4, 'b': 5}

من خلال استخدام الدوال بشكل صحيح، يمكنك كتابة برامج Python بشكل أكثر فعالية وكفاءة۔

الدوال المجهولة (Lambda) في Python

في Python، تُستخدم دوال lambda لتعريف دوال مجهولة وصغيرة۔ على عكس الدوال المُعرفة باستخدام الكلمة المفتاحية def، تتيح لك lambda إنشاء دوال قصيرة في سطر واحد۔ هنا، سنشرح بالتفصيل دوال lambda في Python۔

أساسيات دوال lambda

تُستخدم دوال lambda، التي تُعرف أيضًا بالدوال المجهولة، لتعريف دوال مؤقتة بدون اسم، كما يوحي الاسم۔ الصيغة الأساسية كما يلي:۔

1lambda arguments: expression
  • المعاملات
    • يحدد معاملات الدالة۔ يمكن تحديد عدة وسيطات، مفصولة بفواصل۔
  • تعبير
    • تعبير يُقيّم بناءً على المعاملات۔ نتيجة التعبير تصبح القيمة المرجعة للدالة۔

على سبيل المثال، الكود التالي يعرّف وينفذ دالة lambda تجمع بين رقمين۔

1add = lambda x, y: x + y
2print(add(5, 3))  # Output: 8

في هذا المثال، lambda x, y: x + y هي وظيفة lambda تأخذ وسيطين، x و y، وتعيد مجموعهما۔

حالات استخدام دوال lambda

تعتبر دوال lambda مفيدة في الحالات التي تحتاج فيها إلى تعريف دالة بسيطة مباشرةً۔ تُستخدم بشكل خاص في الحالات التالية:۔

  1. عند تمريرها كوسيطات للدوال

    • إنه مفيد في الدوال عالية المستوى (الدوال التي تأخذ دوال أخرى كوسائط) عند تمرير دوال قصيرة ومؤقتة۔
  2. عند تحديد المفاتيح لفرز القوائم

    • تكون مفيدة لتحديد معايير الفرز (المفاتيح) في الدوال مثل sort() أو sorted()۔

استخدام مثال في الدوال العليا

أمثلة نموذجية على الدوال العليا تشمل map() و filter() و reduce()۔ تأخذ هذه الدوال دوال أخرى كوسيطات وتطبقها على تسلسلات مثل القوائم۔

1numbers = [1, 2, 3, 4, 5]
2squared = list(map(lambda x: x ** 2, numbers))
3print(squared)  # Output: [1, 4, 9, 16, 25]

في هذا المثال، يتم تمرير دالة lambda إلى دالة map() لتربيع كل رقم في قائمة۔

أمثلة على استخدام ترتيب القوائم

يمكن أحيانًا استخدام وظيفة lambda لتحديد مفتاح مخصص عند ترتيب قائمة۔ على سبيل المثال، الشيفرة التالية ترتب قائمة من الأزواج بناءً على العنصر الثاني۔

1pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
2pairs.sort(key=lambda pair: pair[1])
3print(pairs)
4# Output: [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

في هذا المثال، تُستخدم وظيفة lambda لترتيب الأزواج بناءً على العنصر الثاني (وهو سلسلة نصية)۔

filter() و lambda

تُستخدم وظيفة filter() لتصفية العناصر في قائمة (أو أي كائن قابل للتكرار) بناءً على شرط معين۔

1numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
2even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
3print(even_numbers)  # Output: [2, 4, 6, 8]

في هذا المثال، يتم تصفية الأرقام الزوجية في قائمة لإنشاء قائمة جديدة۔

lambda و reduce()

تُستخدم وظيفة reduce() لتقليص قائمة إلى قيمة واحدة۔ يمكن تنفيذها بسهولة باستخدام وظيفة lambda۔

1from functools import reduce
2
3numbers = [1, 2, 3, 4, 5]
4product = reduce(lambda x, y: x * y, numbers)
5print(product)  # Output: 120

في هذا المثال، يتم ضرب جميع العناصر في القائمة معًا للحصول على نتيجة۔

تجنب استخدام وظائف lambda المعقدة

تتميز وظائف lambda بإيجازها، ولكن يصبح من الصعب قراءتها عند استخدامها لتنفيذ منطق معقد۔ لذلك، من المناسب استخدامها للعمليات البسيطة التي يمكن التعبير عنها في سطر واحد۔ للعمليات المعقدة، يكون تعريف وظيفة باستخدام def أكثر قابلية للقراءة والصيانة۔

على سبيل المثال، يجب عليك تجنب استخدام وظائف lambda المعقدة مثل المثال أدناه۔

1# Complex and hard-to-read lambda function
2complex_func = lambda x, y: (x * 2 + y) if x > y else (x + y * 2)

في هذه الحالة، من الأفضل استخدام وظيفة معرفة بـ def، كما هو موضح أدناه۔

1def complex_func(x, y):
2    if x > y:
3        return x * 2 + y
4    else:
5        return x + y * 2

الخاتمة

وظائف lambda في بايثون هي أداة مريحة لتعريف الوظائف المؤقتة القصيرة۔ غالبًا ما تُستخدم في الوظائف عالية الترتيب أو عمليات القوائم لتعريف شروط محددة بإيجاز۔ ومع ذلك، يجب أن تقتصر وظائف lambda على المهام البسيطة، بينما يُفضل استخدام وظائف def للمنطق المعقد۔

يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔

YouTube Video