Python: المعاملات المتقدمة والنطاق

آخر تحديث: 2026-09-22

الآن بعد أن تعلمت أساسيات الدوال، دعنا نستكشف بعض التقنيات المتقدمة. كم طريقة يمكنك كتابة المعاملات بها؟ ماذا يعني "نطاق المتغير"؟ ما هي العودية؟ هذه المفاهيم سترفع فهمك للدوال إلى المستوى التالي.


كلمات مفتاحية / عبارات ذات صلة:return global print None len

1. المعاملات الافتراضية

المعاملات الافتراضية تتيح لك حذف الوسائط عند استدعاء دالة:

▶ مثال: المعاملات الافتراضية الأساسية

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully

(1) ⚠️ فخ المعامل الافتراضي

قيم المعاملات الافتراضية تُقيّم مرة واحدة فقط، عند تعريف الدالة، وليس في كل مرة تُستدعى فيها الدالة. إذا كان الافتراضي كائناً قابلاً للتعديل (مثل قائمة أو قاموس)، يمكن أن يؤدي هذا إلى سلوك غير متوقع:

▶ مثال: فخ المعامل الافتراضي القابل للتعديل

TEXT 📖 للعرض فقط
def add_item(item, items=[]):   # ❌ خطير!
    items.append(item)
    return items

print(add_item("apple"))     # ['apple']
print(add_item("banana"))    # ['apple', 'banana'] — وليس ['banana']!
print(add_item("orange"))    # ['apple', 'banana', 'orange']

لماذا؟ القائمة الفارغة items=[] تُنشأ مرة واحدة عند تعريف الدالة. كل استدعاء لاحق يُضيف إلى نفس القائمة.

الطريقة الصحيحة: استخدم None كافتراضي وأنشئ قائمة جديدة داخل الدالة:

▶ مثال: معامل افتراضي آمن

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully
💡 قاعدة ذهبية: يجب أن تكون المعاملات الافتراضية دائماً قيماً غير قابلة للتعديل (None، أرقام، سلاسل نصية، صفوف). لا تستخدم أبداً كائنات قابلة للتعديل مثل القوائم أو القواميس كمعاملات افتراضية.



2. الوسائط المفتاحية

عند استدعاء دالة، يمكنك تحديد القيم باسم المعامل، مما يسمح بتمرير الوسائط خارج الترتيب:

▶ مثال: الوسائط المفتاحية

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully


3. *args: وسائط موضعية متغيرة

إذا كنت لا تعرف عدد الوسائط التي ستستقبلها الدالة، استخدم *args:

▶ مثال: *args لدالة الجمع

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully

*args يحزم جميع الوسائط الموضعية في صف:

▶ مثال: فحص args

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully


4. **kwargs: وسائط مفتاحية متغيرة

**kwargs تقبل أي عدد من الوسائط المفتاحية وتحزمها في قاموس:

▶ مثال: **kwargs لبناء ملفات تعريف المستخدمين

▶ جرّب الكود

المخرجات:

TEXT 📖 للعرض فقط
User Profile:
  name: Alice
  age: 25
  city: Beijing
  job: Engineer

▶ مثال: دمج *args و **kwargs

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully
💡 ترتيب المعاملات ثابت: المعاملات العادية ← *args ← المعاملات الافتراضية ← **kwargs



5. النطاق: قاعدة LEGB

أين يمكن الوصول إلى متغير؟ هذا يحدده النطاق. لدى بايثون أربعة مستويات من النطاق:

▶ مثال: تداخل نطاق LEGB

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully

LEGB تعني:

تبحث بايثون عن المتغيرات بترتيب L → E → G → B.

(1) global و nonlocal

لتعديل متغير عالمي داخل دالة، استخدم global:

▶ مثال: استخدام global

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully
⚠️ قلّل من استخدام global. المتغيرات العالمية تجعل الكود أصعب في الفهم والتصحيح. يجب أن تستقبل الدوال المدخلات من خلال المعاملات وتُخرج النتائج من خلال return، وليس تعديل المتغيرات العالمية سراً.



6. أساسيات العودية

العودية هي عندما تستدعي دالة نفسها. الفكرة الأساسية: قسم مشكلة كبيرة إلى مشكلات فرعية أصغر ومتشابهة.

▶ مثال: العودية لحساب المضروب

▶ جرّب الكود

التنفيذ:

TEXT 📖 للعرض فقط
factorial(5) = 5 * factorial(4)
             = 5 * 4 * factorial(3)
             = 5 * 4 * 3 * factorial(2)
             = 5 * 4 * 3 * 2 * factorial(1)
             = 5 * 4 * 3 * 2 * 1
             = 120

▶ مثال: متتالية فيبوناتشي (الصعوبة ⭐⭐⭐)

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully
💡 عنصران أساسيان في العودية: ① شرط الإنهاء (وإلا عودية لا نهائية ← فيض في المكدس). ② شرط العودية (كل استدعاء يقترب من الإنهاء). ليست كل المشكلات مناسبة للعودية — إذا كانت الحلقة تعمل، فضّل الحلقة. العودية مثالية للهياكل الشجرية وخوارزميات فرق تسد، إلخ.



7. حالات الاستخدام الشائعة



كلمات مفتاحية / عبارات ذات صلة:return global print None len

❓ أسئلة شائعة

س هل يمكنني إعادة تسمية args و kwargs؟
ج نعم. *args و kwargs مجرد اصطلاحات تسمية — النجميات هي المهمة. يمكنك كتابة *numbers، options. لكن اتباع الاصطلاح موصى به حتى يفهمه مبرمجو بايثون الآخرون فوراً.
س العودية مقابل الحلقات — أيهما أفضل؟
ج إذا كانت الحلقة يمكنها حل المشكلة، فضّل الحلقة. الحلقات أداء أفضل، ولن تسبب فيضاً في المكدس، وأسهل في الفهم. العودية مناسبة لسيناريوهين: اجتياز الهياكل الشجرية (الدلائل، JSON) والتعريفات الرياضية العودية (المضروب، فيبوناتشي). العودية أكثر إيجازاً لكنها أصعب في الفهم.
س لماذا يمكنني قراءة متغير عالمي داخل دالة لكن لا يمكنني تعديله؟
ج عند القراءة، تجد بايثون المتغير العالمي باتباع قواعد LEGB. لكن عند الإسناد، تنشئ بايثون متغيراً محلياً جديداً افتراضياً — x = 10 داخل دالة يُعامل كـ "أنشئ متغيراً محلياً x." إذا كنت حقاً بحاجة لتعديل عالمي، استخدم global. لكن ذلك عادة يعني أن تصميمك يمكن تحسينه.

📖 ملخص


📝 تمارين

  1. أساسي (الصعوبة ⭐): اكتب دالة multiply(*nums) تقبل أي عدد من الأرقام وتُرجع حاصل ضربها. إذا لم تكن هناك وسائط، أرجع 0.

  2. متوسط (الصعوبة ⭐⭐): اكتب دالة create_student(name, **scores) تستقبل اسم طالب وأي عدد من درجات المواد (وسائط مفتاحية)، وتحسب وتُرجع المتوسط. مثال استدعاء: create_student("Alice", Chinese=85, Math=92, English=78).

  3. تحدي (الصعوبة ⭐⭐⭐): اكتب دالة عودية sum_digits(n) تحسب مجموع أرقام عدد صحيح موجب. مثال: sum_digits(123) تُرجع 1+2+3=6. تلميح: باقي القسمة على 10 يعطي الرقم الأخير؛ القسمة الأرضية على 10 تزيله. شرط الإنهاء: n < 10.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%