المعاملات في الدوال بايثون (Parameters)
في الدرس السابق، تعلمنا أساسيات إنشاء الدوال. الآن حان وقت التعمق في أحد أهم جوانب الدوال: المعاملات (Parameters). المعاملات هي القنوات التي تمرر من خلالها البيانات إلى الدالة، وفهمها جيداً يفتح لك إمكانيات لا حصر لها في كتابة دوال مرنة وقوية.
تخيل أن الدالة هي آلة صنع العصير: المعاملات هي الفواكه التي تضعها فيها. يمكنك وضع تفاح أو برتقال أو مزيج منهما، وستحصل على نتائج مختلفة. بايثون توفر أنواعاً متعددة من المعاملات تجعل دوالك أكثر مرونة وسهولة في الاستخدام.
في هذا الدرس، ستتعلم جميع أنواع المعاملات في بايثون: من الأساسية إلى المتقدمة، مع فهم متى ولماذا تستخدم كل نوع.
1. الفرق بين Parameters و Arguments
غالباً ما يُستخدم هذان المصطلحان بالتبادل، لكن هناك فرق تقني بينهما من المهم فهمه.
| المصطلح | الوصف | متى يُستخدم |
|---|---|---|
| Parameter (معامل) | المتغير في تعريف الدالة | عند إنشاء الدالة |
| Argument (وسيط) | القيمة الفعلية المُمررة | عند استدعاء الدالة |
# name هو Parameter (معامل)
def greet(name):
print(f"مرحباً يا {name}!")
# "أحمد" هو Argument (وسيط)
greet("أحمد")
2. المعاملات الموضعية (Positional Parameters)
المعاملات الموضعية هي الأكثر شيوعاً. القيم تُمرر بناءً على موضعها (ترتيبها) في استدعاء الدالة.
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, "الرياض", "سارة") # خطأ منطقي!
3. المعاملات المسماة (Keyword Arguments)
المعاملات المسماة تسمح لك بتحديد اسم المعامل عند الاستدعاء، مما يجعل الكود أوضح ويلغي أهمية الترتيب.
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)
4. المعاملات الافتراضية (Default Parameters)
يمكنك تحديد قيم افتراضية للمعاملات. إذا لم يُمرر المستخدم قيمة، تُستخدم القيمة الافتراضية.
def greet(name, greeting="مرحباً", punctuation="!"):
"""ترحيب مع خيارات افتراضية"""
print(f"{greeting} يا {name}{punctuation}")
# استخدام كل القيم الافتراضية
greet("أحمد")
# تغيير قيمة واحدة
greet("سارة", "أهلاً وسهلاً")
# تغيير كل القيم
greet("محمد", "صباح الخير", ".")
# تغيير قيمة محددة باستخدام الاسم
greet("فاطمة", punctuation="...")
5. المعاملات المتغيرة (*args)
ماذا لو أردت دالة تقبل عدداً غير محدد من القيم؟ هنا يأتي دور *args الذي يجمع كل القيم الإضافية في tuple.
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)
6. المعاملات المسماة المتغيرة (**kwargs)
بينما *args يجمع القيم الموضعية، **kwargs يجمع المعاملات المسماة في قاموس (dictionary).
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"
)
7. ترتيب المعاملات الصحيح
عند استخدام أنواع مختلفة من المعاملات في نفس الدالة، يجب اتباع ترتيب محدد.
- المعاملات الموضعية العادية
- *args (المعاملات المتغيرة)
- المعاملات الافتراضية
- **kwargs (المعاملات المسماة المتغيرة)
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)