المصطلحات: استدعاء الدوال والأساليب (Methods)
حان الوقت لتوسيع مصطلحاتك قليلًا.
كل من print وlen دالة (Function). جرّب بنفسك:
print(len)
print(print)
التعبير مثل len(things) أو print(things) يسمى استدعاء دالة (Function call)؛ فعندما تكتب ذلك فأنت تستدعي الدالة len أو print. وإمكان استدعاء الدالة بهذه الصورة يعني أن الدوال قابلة للاستدعاء (Callable):
print(callable(len))
معظم الأشياء في بايثون ليست قابلة للاستدعاء، ولذلك فإن محاولة استدعائها ستؤدي إلى خطأ:
f = 'a string'
print(callable(f))
f()
في الاستدعاء len(things) تُسمى things وسيطًا (Argument). وقد ترى أحيانًا كلمة معامل (Parameter)، وهي قريبة جدًا في المعنى. يمكنك تصور الأمر كأنك تعطي الوسيط للدالة؛ فنقول إن things يُمرر إلى len، وإن len تقبل أو تستقبل هذا الوسيط.
التعبير len(things) سيُقيَّم إلى عدد مثل 3، وعندها نقول إن الدالة len أرجعت (Returned) القيمة 3.
كل استدعاء دالة يجب أن يُرجع شيئًا، حتى لو كان ذلك الشيء يمثل «لا شيء مفيد». وظيفة print مثلًا هي عرض شيء على الشاشة، وليست إرجاع قيمة نافعة. لذلك تُرجع قيمة خاصة غير مفيدة في هذا السياق:
things = [1, 2, 3]
length = len(things)
printed = print(length)
print(printed)
None قيمة خاصة تمثل غياب قيمة مفيدة فعلية. تُستخدم كثيرًا كقيمة فارغة أو مكان مؤقت. والدوال التي لا تريد إرجاع شيء محدد تُرجع None افتراضيًا.
إذا رأيت رسالة خطأ تتحدث عن None أو NoneType فهذا يعني كثيرًا أنك أسندت إلى متغير قيمة مختلفة عما كنت تقصده. جرّب المثال:
things = print([1, 2, 3])
length = len(things)
الأسلوب (Method) هو دالة تنتمي إلى نوع معين، ويمكن استدعاؤها على قيم ذلك النوع باستخدام النقطة .. مثلًا، upper وlower أسلوبان للنصوص، ويمكن استدعاؤهما مثل word.upper():
word = 'Hello'
print(word.upper)
print(word.upper())
مثال آخر: append أسلوب خاص بالقوائم. لكن لا يمكنك استخدام .upper على قائمة، ولا .append على نص:
word = 'Hello'
word.append('!')
كلمة attribute في رسالة الخطأ تشير إلى استخدام النقطة .. والخطأ يحدث أصلًا عند الوصول إلى word.append حتى قبل محاولة استدعائه كدالة.