= "Adam"
name = 25
age print("My name is", name, "and I'm", age, "years old")
My name is Adam and I'm 25 years old
الإجراء (Procedure) هو جزء محفوظ من البرنامج يتم استدعاؤه مع تمرير عوامل مختلفة.
ويمكن استدعاؤه بعامل واحد:
int(x)
لإنشاء العدد الصحيح من النص. مثل: int("12")
ينتج: 12
.abs(x)
للقيمة المطلقة مثل: abs(-10)
ينتج: 10
.وقد يأخذ عاملين:
round(x, n)
مثل: round(10.259, 2)
ينتج: 10.26
.pow(x, y)
لرفع العدد x
إلى القوة y
. مثل: pow(2, 3)
ينتج: 8
.وقد يأخذ عاملاً واحدًا لكنَّهُ قائمة:
sum(numbers)
مثل: sum([1, 2, 3, 4, 5])
ينتج: 15
.max(numbers)
لأكبر عدد في القائمة. مثل: max([1, 2, 30, 4, 5])
ينتج: 30
.وقد يكون عدد عوامله لا محدودًا:
print(*values)
. فعلامة النجمة (*
) تشير لقبول عدد مطلق من العوامل. مثل:= "Adam"
name = 25
age print("My name is", name, "and I'm", age, "years old")
My name is Adam and I'm 25 years old
فإن print
قبلت خمسة عوامل:
"My name is"
name
"and I'm"
age
"years old"
ولدينا الإجراء help(func)
يطلب مساعدة الإجراء المعيَّن، بلا أقواس، هكذا:
help(sum)
Help on built-in function sum in module builtins:
sum(iterable, /, start=0)
Return the sum of a 'start' value (default: 0) plus an iterable of numbers
When the iterable is empty, return the start value.
This function is intended specifically for use with numeric values and may
reject non-numeric types.
وقد عرفت أن طلب التنفيذ يكون بالقوسين بعد اسمه ()
، وتوضَع العوامل فيهما وهي ضربان:
وفي كل ما سبق كانت العوامل من النوع المؤثر؛ لأنها كانت تؤثر في النتيجة ولا تتأثر بها.
أما المتأثر فنحو فعل الترتيب من مكتبة القائمة: list.sort(xs)
فإن المتأثر به القائمة نفسها، مثل:
= [40, 20, 10, 30]
xs list.sort(xs)
فأما جملة list.sort
فإننا حددنا اسم النوع list
وأردنا منه الإجراء sort
، وأتينا بالقوسين لطلب تنفيذه، ووضعنا المتأثر xs
فيه.
ومع أننا لم نعيِّن النتيجة (بجملة التعيين =
)، فقد تغيَّرت (تأثرت) القائمة بالإجراء:
print(xs)
[10, 20, 30, 40]
بعكس الترتيب بالإجراء الذي ليس من النطاق العام: sorted(xs)
فإنَّ القائمة فيه ليست متأثرًا؛ إذْ يُنتِجُ الإجراءُ قائمةً جديدةً ولا يغير القائمة المُدخلة:
= [40, 20, 10, 30]
xs = sorted(xs)
ys print(xs, "لم يعمل الإجراء في القائمة نفسها")
print(ys, "هي قائمة جديدة")
[40, 20, 10, 30] لم يعمل الإجراء في القائمة نفسها
[10, 20, 30, 40] هي قائمة جديدة
وقد تتساءل ما الفائدة من وجود طريقتين وكلاهما يعمل نفس العمل؟
list.sort(xs)
لا ترجع بشيء بل تعدل نفس القائمةsorted(xs)
ترجع قائمة جديدةفأما الطريقة الأولى فأصغر في الذاكرة لأنها لا تُنشئ نُسخة كما تفعل الطريقة الثانية. لكن الطريقة الثانية مفيدة إن أردت أن تُبقي القائمة الأصلية كما هي.
والأمر كذلك في الإجراءين:
list.reverse(xs)
reversed(xs)
ويجتمع المؤثر والمتأثر في نحو:
list.append(xs, 50)
فالإجراء list.append
يأخذ القائمة، ويضيف إليها القيمة 50
. ولذلك نقول الأوَّل متأثر والثاني مؤثر.
print(xs)
[40, 20, 10, 30, 50]
وقد وضعت اللغات الشيئية (Object-Oriented) مثل بايثون صياغة خاصَّةً: للإجراء المسند إلى الشيء. وبذلك يتحصل لدينا طريقتان كلتاهما تؤديان نفس المعنى:
list.append(xs, 25)
xs.append(25)
ومثاله أيضًا في الإجراء list.sort
للترتيب وكذلك في list.append
للإضافة:
= [20, 10, 30, 40]
xs = [20, 10, 30, 40]
ys
list.sort(xs)
ys.sort()assert xs == ys
list.append(xs, 50)
50)
ys.append(assert xs == ys
ويأتي الكلام بالتفصيل عن البرمجة الشيئية في الكتاب الثاني.
وقد تُعَيَّنُ العوامل بأحد طريقتين:
round(3.14159, 2)
round(number=3.14159, ndigits=2)
فلا يشترط فيه ترتيب العوامل.ويجوز استعمال الطريقتين معًا في نحو: list.sort(numbers, reverse=True)
ويشترط فيه تقدم التعيين بالموضع ليكون في مكانه، ثم يتبعه التعيين بالاسم حيث لا يشترط الترتيب فيه.