المعاملات في الدوال بايثون (Parameters)

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

تخيل أن الدالة هي آلة صنع العصير: المعاملات هي الفواكه التي تضعها فيها. يمكنك وضع تفاح أو برتقال أو مزيج منهما، وستحصل على نتائج مختلفة. بايثون توفر أنواعاً متعددة من المعاملات تجعل دوالك أكثر مرونة وسهولة في الاستخدام.

في هذا الدرس، ستتعلم جميع أنواع المعاملات في بايثون: من الأساسية إلى المتقدمة، مع فهم متى ولماذا تستخدم كل نوع.

1. الفرق بين Parameters و Arguments

غالباً ما يُستخدم هذان المصطلحان بالتبادل، لكن هناك فرق تقني بينهما من المهم فهمه.

المصطلح الوصف متى يُستخدم
Parameter (معامل) المتغير في تعريف الدالة عند إنشاء الدالة
Argument (وسيط) القيمة الفعلية المُمررة عند استدعاء الدالة
params_vs_args.py
# name هو Parameter (معامل)
def greet(name):
    print(f"مرحباً يا {name}!")

# "أحمد" هو Argument (وسيط)
greet("أحمد")

2. المعاملات الموضعية (Positional Parameters)

المعاملات الموضعية هي الأكثر شيوعاً. القيم تُمرر بناءً على موضعها (ترتيبها) في استدعاء الدالة.

positional_params.py
def create_profile(name, age, city):
    """إنشاء ملف تعريفي"""
    print("=" * 35)
    print("      الملف الشخصي")
    print("=" * 35)
    print(f"   الاسم: {name}")
    print(f"   العمر: {age} سنة")
    print(f"   المدينة: {city}")
    print("=" * 35)

# الترتيب مهم جداً!
create_profile("أحمد", 25, "القاهرة")

print()

# إذا غيرت الترتيب، ستحصل على نتائج خاطئة
create_profile(30, "الرياض", "سارة")  # خطأ منطقي!
النتيجة
=================================== الملف الشخصي =================================== الاسم: أحمد العمر: 25 سنة المدينة: القاهرة =================================== =================================== الملف الشخصي =================================== الاسم: 30 العمر: الرياض سنة المدينة: سارة ===================================

3. المعاملات المسماة (Keyword Arguments)

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

keyword_args.py
def create_profile(name, age, city):
    print(f"الاسم: {name} | العمر: {age} | المدينة: {city}")

# استخدام المعاملات المسماة (الترتيب لا يهم)
create_profile(name="أحمد", age=25, city="القاهرة")
create_profile(city="الرياض", name="سارة", age=30)
create_profile(age=28, city="دبي", name="محمد")

# يمكن المزج بين الموضعية والمسماة
# لكن الموضعية يجب أن تأتي أولاً
create_profile("فاطمة", city="جدة", age=22)
النتيجة
الاسم: أحمد | العمر: 25 | المدينة: القاهرة الاسم: سارة | العمر: 30 | المدينة: الرياض الاسم: محمد | العمر: 28 | المدينة: دبي الاسم: فاطمة | العمر: 22 | المدينة: جدة

4. المعاملات الافتراضية (Default Parameters)

يمكنك تحديد قيم افتراضية للمعاملات. إذا لم يُمرر المستخدم قيمة، تُستخدم القيمة الافتراضية.

default_params.py
def greet(name, greeting="مرحباً", punctuation="!"):
    """ترحيب مع خيارات افتراضية"""
    print(f"{greeting} يا {name}{punctuation}")

# استخدام كل القيم الافتراضية
greet("أحمد")

# تغيير قيمة واحدة
greet("سارة", "أهلاً وسهلاً")

# تغيير كل القيم
greet("محمد", "صباح الخير", ".")

# تغيير قيمة محددة باستخدام الاسم
greet("فاطمة", punctuation="...")
النتيجة
مرحباً يا أحمد! أهلاً وسهلاً يا سارة! صباح الخير يا محمد. مرحباً يا فاطمة...
قاعدة مهمة: المعاملات بدون قيم افتراضية يجب أن تأتي قبل المعاملات ذات القيم الافتراضية.

5. المعاملات المتغيرة (*args)

ماذا لو أردت دالة تقبل عدداً غير محدد من القيم؟ هنا يأتي دور *args الذي يجمع كل القيم الإضافية في tuple.

args_example.py
def calculate_sum(*numbers):
    """جمع عدد غير محدد من الأرقام"""
    total = sum(numbers)
    print(f"الأرقام: {numbers}")
    print(f"المجموع: {total}")
    return total

# استدعاء بأعداد مختلفة من القيم
calculate_sum(1, 2)
print()
calculate_sum(1, 2, 3, 4, 5)
print()
calculate_sum(10, 20, 30, 40, 50, 60, 70)
النتيجة
الأرقام: (1, 2) المجموع: 3 الأرقام: (1, 2, 3, 4, 5) المجموع: 15 الأرقام: (10, 20, 30, 40, 50, 60, 70) المجموع: 280

6. المعاملات المسماة المتغيرة (**kwargs)

بينما *args يجمع القيم الموضعية، **kwargs يجمع المعاملات المسماة في قاموس (dictionary).

kwargs_example.py
def create_user(**user_info):
    """إنشاء مستخدم بمعلومات متنوعة"""
    print("-" * 40)
    print("   معلومات المستخدم:")
    print("-" * 40)
    
    for key, value in user_info.items():
        print(f"   {key}: {value}")
    
    print("-" * 40)

# استدعاء بمعلومات مختلفة
create_user(name="أحمد", age=25)

create_user(
    name="سارة",
    age=30,
    city="الرياض",
    job="مهندسة",
    email="sara@email.com"
)
النتيجة
---------------------------------------- معلومات المستخدم: ---------------------------------------- name: أحمد age: 25 ---------------------------------------- ---------------------------------------- معلومات المستخدم: ---------------------------------------- name: سارة age: 30 city: الرياض job: مهندسة email: sara@email.com ----------------------------------------

7. ترتيب المعاملات الصحيح

عند استخدام أنواع مختلفة من المعاملات في نفس الدالة، يجب اتباع ترتيب محدد.

الترتيب الصحيح:
  1. المعاملات الموضعية العادية
  2. *args (المعاملات المتغيرة)
  3. المعاملات الافتراضية
  4. **kwargs (المعاملات المسماة المتغيرة)
complete_order.py
def complete_function(pos1, pos2, *args, default="قيمة", **kwargs):
    print(f"موضعي 1: {pos1}")
    print(f"موضعي 2: {pos2}")
    print(f"args: {args}")
    print(f"افتراضي: {default}")
    print(f"kwargs: {kwargs}")

complete_function("أ", "ب", 1, 2, 3, default="جديد", x=10, y=20)

8. أفضل الممارسات

افعل
  • استخدم أسماء معاملات واضحة ومعبرة
  • حدد قيماً افتراضية منطقية
  • استخدم المعاملات المسماة للوضوح
  • وثق المعاملات في docstring
لا تفعل
  • لا تستخدم عدداً كبيراً جداً من المعاملات
  • لا تستخدم قوائم/قواميس كقيم افتراضية mutable
  • لا تخلط الترتيب بشكل عشوائي
  • لا تفرط في استخدام *args و **kwargs
ملخص الدرس
  • المعاملات الموضعية تعتمد على الترتيب
  • المعاملات المسماة (keyword) أوضح ولا تعتمد على الترتيب
  • المعاملات الافتراضية توفر قيماً جاهزة
  • *args لعدد غير محدد من القيم الموضعية
  • **kwargs لعدد غير محدد من القيم المسماة

الخطوة التالية

تعلم كيفية إرجاع القيم من الدوال باستخدام return

الدرس التالي: القيم المرجعة (return)
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن