Kodokon kodokon.com

الدوال: def، الوسائط، return والنطاق

نظِّم شيفرتك في دوال قابلة لإعادة الاستخدام، وأتقن القيم الافتراضية، وافهم نطاق المتغيرات.

10 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

أنت تعرف بالفعل كيف تكتب الحلقات والشروط؛ حان الآن وقت تنظيم شيفرتك. تعزل الدالة مهمة محددة خلف اسم واضح: تكتبها مرة واحدة، وتختبرها مرة واحدة، وتستدعيها في كل مكان. تُصرِّح الكلمة المفتاحية def بالدالة، وتتلقّى الوسائط قيم الدخل، وتُرسِل return النتيجة إلى المُستدعي. تذكّر أمرًا كثيرًا ما يُغفَل: الدالة التي لا تحتوي على return تُرجِع None.

PYTHON
def net_price(price, tax_rate):
    total = price * (1 + tax_rate)
    return round(total, 2)

result = net_price(100, 0.2)
print(result)  # 120.0
تتلقّى الدالة وسيطين وتُرسِل قيمة باستخدام return.

تجعل القيم الافتراضية الدالة مرنة دون مضاعفة صيغها: صرِّح بها بعد الوسائط الإلزامية. وعند الاستدعاء، توثّق المُعطيات المسمّاة (currency="USD") نيّتك. في الشيفرة الاحترافية، تستخدمها حالما تتجاوز الدالة وسيطين اثنين: يُقرأ الاستدعاء بوضوح دون فتح تعريف الدالة.

PYTHON
def format_price(amount, currency="EUR", digits=2):
    return f"{amount:.{digits}f} {currency}"

print(format_price(19.9))                  # 19.90 EUR
print(format_price(19.9, currency="USD"))  # 19.90 USD
print(format_price(19.9, digits=0))        # 20 EUR
تتيح لك المُعطيات المسمّاة تحديد ما يتغير فقط.
PYTHON
def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

print(add_item("pen"))   # ['pen']
print(add_item("book"))  # ['book']
مع نمط None، ينطلق كل استدعاء من قائمة جديدة.

يحدّد النطاق المكان الذي يوجد فيه المتغير. المتغير المُنشأ داخل دالة هو متغير محلي: يختفي عند انتهاء الاستدعاء. يمكن للدالة أن تقرأ متغيرًا عامًا، لكن أيّ إسناد ينشئ متغيرًا محليًا جديدًا - ويبقى المتغير العام كما هو. عادة جيدة: بدلًا من تعديل المتغيرات العامة، مرِّر وسائط وأرجِع نتائج؛ فتصبح شيفرتك متوقَّعة وقابلة للاختبار.

PYTHON
rate = 0.2

def apply_tax(price):
    return round(price * (1 + rate), 2)

def set_rate(new_rate):
    rate = new_rate  # local variable, no effect

print(apply_tax(100))  # 120.0
set_rate(0.1)
print(apply_tax(100))  # 120.0, the global is untouched
قراءة متغير عام تعمل؛ أما إسناده فينشئ متغيرًا محليًا.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. ماذا تُرجِع دالة بايثون لا تحتوي على تعليمة return؟
    • 0
    • None
    • سلسلة نصية فارغة
    • يُطلَق خطأ
  2. لماذا ينبغي تجنّب def add_item(item, items=[])؟
    • تُنشأ القائمة الافتراضية مرة واحدة وتُشارَك بين الاستدعاءات
    • لا يمكن استخدام قائمة كقيمة افتراضية
    • تُطلق خطأ SyntaxError عند التعريف
  3. ماذا يحدث عندما تُسنِد قيمة لمتغير داخل دالة بينما يوجد متغير عام يحمل الاسم نفسه؟
    • تعدّل بايثون المتغير العام
    • تنشئ بايثون متغيرًا محليًا، ويبقى المتغير العام كما هو
    • تُطلق بايثون خطأ تعارض في الأسماء