برمجة بايثون 2026 — جامعة هلسنكي › الجزء 1: البدء 1 / 15 السابق التالي

المزيد عن المتغيّرات

أهداف التعلّم

بعد إتمام هذا القسم

  • ستكون قادرًا على استخدام المتغيّرات في سياقات مختلفة
  • ستعرف أي نوع من البيانات يمكن تخزينه في المتغيّرات
  • ستفهم الفرق بين السلاسل النصية والأعداد الصحيحة والأعداد العشرية

يُرجى ملء هذا الاستبيان قبل أن تبدأ في هذا القسم. ستحصل على نقطة تمرين مقابل الإجابة.

اختبار: (مكون تفاعلي غير متاح في النسخة الثابتة - ID: 87834513-84c8-5714-90b1-404e2943ad90)

تُستخدم المتغيّرات لأغراض مختلفة في البرمجة. ويمكنك استخدام المتغيّرات لتخزين أي معلومة ستحتاج إليها لاحقًا أثناء تنفيذ البرنامج.

في برمجة Python تُنشأ المتغيّرات هكذا:

variable_name = ...

هنا تعني ... القيمةَ المخزّنة في المتغيّر.

مثلًا، حين استخدمتَ الأمر input لقراءة سلسلة نصية من المستخدم، خزّنتَ السلسلة النصية في متغيّر ثم استخدمتَ هذا المتغيّر لاحقًا في برنامجك:

name = input("What is your name? ")
print("Hi, " + name)
What is your name? **Ghosty**
Hi, Ghosty

يمكن أيضًا تعريف القيمة المخزّنة في متغيّر باستخدام متغيّرات أخرى:

given_name = "Paul"
family_name = "Python"

name = given_name + " " + family_name

print(name)
Paul Python

هنا القيم المخزّنة في المتغيّرات الثلاثة لا تأتي من مُدخَل المستخدم. فهي تبقى كما هي في كل مرة يُنفَّذ فيها البرنامج. ويشار إلى هذا بـ_الترميز الثابت_ (hard-coding) للبيانات في البرنامج.

تغيير قيمة متغيّر

وكما يوحي اسم متغيّر (variable)، فإن القيمة المخزّنة في المتغيّر يمكن أن تتغيّر. وفي القسم السابق لاحظنا أن القيمة الجديدة تحلّ محلّ القديمة.

أثناء تنفيذ البرنامج التالي، سيأخذ المتغيّر word ثلاث قيم مختلفة:

word = input("Please type in a word: ")
print(word)

word = input("And another word: ")
print(word)

word = "third"
print(word)
Please type in a word: **first**
first
And another word: **second**
second
third

تتغيّر القيمة المخزّنة في المتغيّر في كل مرة يُسنَد فيها إلى المتغيّر قيمة جديدة.

يمكن اشتقاق القيمة الجديدة لمتغيّر من قيمته القديمة. وفي المثال التالي يُسنَد إلى المتغيّر word أولًا قيمة مبنية على مُدخَل المستخدم. ثم يُسنَد إليه قيمة جديدة، وهي القيمة القديمة مع ثلاث علامات تعجّب مضافة إلى نهايتها.

word = input("Please type in a word: ")
print(word)

word = word + "!!!"
print(word)
Please type in a word: **test**
test
test!!!

اختيار اسم جيد للمتغيّر

  • من المفيد في كثير من الأحيان تسمية المتغيّرات بحسب ما تُستخدم له. فمثلًا، إذا كان المتغيّر يحتوي على كلمة، فإن الاسم word خيار أفضل من الاسم a مثلًا.

  • لا يوجد حدّ ثابت لطول اسم المتغيّر في Python، لكن هناك قيود أخرى. ينبغي أن يبدأ اسم المتغيّر بحرف، ولا يمكن أن يحتوي إلا على حروف وأرقام وشرطات سفلية _.

  • الأحرف الصغيرة والحرف الكبيرة محارف مختلفة. المتغيّرات name وName وNAME كلها متغيّرات مختلفة. ومع أن لهذه القاعدة بعض الاستثناءات، فإننا سنتجاهلها الآن.

  • من الممارسات الشائعة في برمجة Python استخدام أحرف صغيرة فقط في أسماء المتغيّرات. فإذا كان اسم المتغيّر يتكوّن من عدّة كلمات، فاستخدم الشرطة السفلية بين الكلمات. ومع أن لهذه القاعدة أيضًا بعض الاستثناءات، فإننا سنتجاهلها الآن.

الأعداد الصحيحة

حتى الآن، لم نخزّن سوى السلاسل النصية في المتغيّرات، لكن هناك أيضًا أنواع كثيرة أخرى من المعلومات نرغب في تخزينها والوصول إليها لاحقًا. لننظر أولًا إلى الأعداد الصحيحة (integers). الأعداد الصحيحة هي أعداد لا تملك جزءًا عشريًا أو كسريًا، مثل -15 و0 و1.

ينشئ البرنامج التالي المتغيّر age، الذي يحتوي على قيمة عدد صحيح.

age = 24
print(age)

لا يطبع البرنامج سوى ما يلي:

24

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

إذًا، فلماذا يهمّ أن يكون للمتغيّرات نوع، مع أن البرنامج التالي لا يزال يطبع الشيء نفسه مرتين؟

number1 = 100
number2 = "100"

print(number1)
print(number2)
100
100

تهمّ أنواع المتغيّرات لأن العمليات المختلفة تؤثر في أنواع المتغيّرات المختلفة بطرق مختلفة. لننظر إلى مثال:

number1 = 100
number2 = "100"

print(number1 + number1)
print(number2 + number2)

يطبع هذا ما يلي:

200
100100

بالنسبة إلى القيم الصحيحة، تعني المشغّل + الجمع، أما بالنسبة إلى قيم السلاسل النصية فيعني الدمج، أي "الالتحام في سلسلة واحدة".

ليست كل المشغّلات متاحة لكل أنواع المتغيّرات. فبينما يمكن قسمة الأعداد باستخدام مشغّل القسمة /، فإن محاولة قسمة سلسلة نصية على عدد تُسبّب خطأ:

number = "100"
print(number / 2)
TypeError: unsupported operand type(s) for /: 'str' and 'int'

دمج القيم عند الطباعة

وبالمثل، لن يعمل البرنامج التالي، لأن "The result is " وresult من نوعين مختلفين:

result = 10 * 25
# the following line produces an error
print("The result is " + result)

لا يطبع البرنامج أي شيء، بل يطلق خطأً:

TypeError: unsupported operand type(s) for +: 'str' and 'int'

هنا تخبرك Python أن دمج نوعين مختلفين من القيم لن ينجح بهذه البساطة. في هذه الحالة، "The result is " من نوع السلسلة النصية، بينما القيمة المخزّنة في result من النوع الصحيح.

وإذا أردنا فعلًا طباعة سلسلة نصية وعدد صحيح في أمر واحد، فيمكن تحويل العدد الصحيح إلى سلسلة نصية بدالة str، ثم دمج السلسلتين النصيتين كالمعتاد. فمثلًا، سيعمل هذا:

result = 10 * 25
print("The result is " + str(result))
The result is 250

وللأمر print كذلك إمكانيات مدمجة تدعم دمج أنواع مختلفة من القيم. وأبسط طريقة هي وضع فاصلة بين القيم. وستُطبع كل القيم بغضّ النظر عن نوعها:

result = 10 * 25
print("The result is", result)
The result is 250

لاحظ أنه أُضيف هنا تلقائيًا محرف مسافة بين القيم التي تفصلها فاصلة.

الطباعة باستخدام السلاسل النصية ذات البادئة f

ماذا لو أردنا مرونة وتحكّمًا أكبر فيما نطبعه؟ إن ما يُسمى السلاسل النصية ذات البادئة f (f-strings) طريقة أخرى لتنسيق المخرجات في Python. قد يبدو بناء الجملة في البداية مربكًا بعض الشيء، لكن في النهاية تكون هذه السلاسل غالبًا أبسط طريقة لتنسيق النص.

مع السلاسل النصية ذات البادئة f سيبدو المثال السابق هكذا:

result = 10 * 25
print(f"The result is {result}")

لنقسّم هذا. في بداية السلسلة النصية التي نطبعها تمامًا يوجد المحرف f. وهذا يخبر Python أن ما يلي هو سلسلة نصية ذات البادئة f. وداخل السلسلة النصية، محاطًا بأقواس معقوفة، يوجد اسم المتغيّر result. وتصبح القيمة التي يحتوي عليها جزءًا من السلسلة النصية المطبوعة. والمخرجات مطابقة تمامًا لما في الأمثلة السابقة:

The result is 250

يمكن أن تحتوي سلسلة نصية ذات بادئة f واحدة على عدّة متغيّرات. فمثلًا هذه الشيفرة

name = "Mark"
age = 37
city = "Palo Alto"
print(f"Hi {name}, you are {age} years old. You live in {city}.")

تطبع ما يلي:

Hi Mark, you are 37 years old. You live in Palo Alto.

من الصعب إنشاء مخرجات مطابقة تمامًا لهذه باستخدام صيغة الفاصلة في الأمر print. فمثلًا، هذا البرنامج

name = "Mark"
age = 37
city = "Palo Alto"
print("Hi", name, ", you are", age, "years old. You live in", city, ".")

يطبع ما يلي:

Hi Mark , you are 37 years old. You live in Palo Alto .

لاحظ المسافة التي أُدرجت تلقائيًا بين كل جزء مفصول بفاصلة في المخرجات. ومن الممكن تقنيًا منع print من إضافة المسافات الزائدة، لكنه لا يستحق العناء بما يمكننا بدلًا من ذلك استخدام السلاسل النصية ذات البادئة f.

في بساطتها، تكون صيغة الفاصلة في الأمر print مفيدة في كثير من الأحيان، لكنها أحيانًا تسبب متاعب أكثر مما تستحق. والسلاسل النصية ذات البادئة f عادةً خيار أكثر موثوقية. وفي الجزء 4 ستتعلّم المزيد عن الميزات المفيدة للسلاسل النصية ذات البادئة f فيما يتعلق بتنسيق المخرجات.

السلاسل النصية ذات البادئة f وإصدارات Python

إذا كنت تستخدم إصدارًا أقدم من Python، فقد لا تعمل السلاسل النصية ذات البادئة f. فقد أُضيفت في الإصدار 3.6 من Python. وفي وقت لاحق من الدورة ستُنصّب Python على حاسوبك. وللأسف، لا تكون الإصدارات الأحدث من Python متاحة دائمًا لأنظمة التشغيل الأقدم. وإذا كان الأمر كذلك بالنسبة إلى حاسوبك، فيمكنك في الأجزاء الأولى من هذه الدورة تجربة هذه السلاسل في قوالب التمارين الموجودة داخل المتصفّح عندما تتطلب بعض التمارين استخدام السلاسل النصية ذات البادئة f.

تمرين تفاعلي: المسافة الزائدة

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

name = "Tim Tester"
age = 20
skill1 = "python"
level1 = "beginner"
skill2 = "java"
level2 = "veteran"
skill3 = "programming"
level3 = "semiprofessional"
lower = 2000
upper = 3000

print("my name is ", name, " , I am ", age, "years old")
print("my skills are")
print("- ", skill1, " (", level1, ")")
print("- ", skill2, " (", level2, ")")
print("- ", skill3, " (", level3, " )")
print("I am looking for a job with a salary of", lower, "-", upper, "euros per month")

ينبغي للبرنامج أن يطبع تمامًا ما يلي:

my name is Tim Tester, I am 20 years old

my skills are
 - python (beginner)
 - java (veteran)
 - programming (semiprofessional)

I am looking for a job with a salary of 2000-3000 euros per month

تعمل الشيفرة بشكل صحيح تقريبًا لكن ليس تمامًا. ويمرّن هذا التمرين بفحوص صارمة جدًّا تتحقّق من المخرجات في كل قطعة مسافة على حدة.

يُرجى إصلاح الشيفرة بحيث تبدو المخرجات صحيحة. ولاحظ بصيغة خاصة كيف تُدرج صيغة الفاصلة في الأمر print مسافة تلقائيًا حول الأجزاء المختلفة المفصولة بفواصل.

أسهل طريقة لتحويل الشيفرة بحيث تستوفي المتطلّبات هي استخدام السلاسل النصية ذات البادئة f.

تلميح: يمكنك طباعة سطر فارغ بإضافة أمر print فارغ، أو بإضافة محرف السطر الجديد \n إلى سلسلتك النصية.

ولا تنسَ أن تكون شديد الدقة في تنسيق المخرجات أيضًا في المستقبل في هذه الدورة. فبعض التمارين فيها فحوص تتطلّب أن تكون مخرجاتك مطابقة تمامًا لما هو محدّد في الأمثلة المعطاة. فمثلًا، يُرجى استخدام محارف مسافة فعلية في شيفرتك بدلًا من رموز ASCII لمحارف المسافة، أو ما شابه.

ملاحظة: هذا التمرين يتطلب بيئة TMC التفاعلية ولا يعمل في النسخة الثابتة.

الأعداد العشرية

كلمة Floating point number أو float (عدد عشري) مصطلح ستصادفه كثيرًا في البرمجة. وهو يشير إلى الأعداد التي تحتوي على نقطة عشرية. ويمكن استخدامها إلى حد كبير بالطريقة نفسها التي تُستخدم بها القيم الصحيحة.

يحسب هذا البرنامج متوسط ثلاثة أعداد عشرية:

number1 = 2.5
number2 = -1.25
number3 = 3.62

mean = (number1 + number2 + number3) / 3
print(f"Mean: {mean}")
Mean: 1.6233333333333333

تمرين تفاعلي: الحسابات

يحتوي هذا البرنامج أصلًا على متغيّرَي عدد صحيح، وهما x وy:

x = 27
y = 15

يُرجى إكمال البرنامج بحيث يطبع أيضًا ما يلي:

27 + 15 = 42
27 - 15 = 12
27 * 15 = 405
27 / 15 = 1.8

وينبغي أن يعمل البرنامج بشكل صحيح حتى لو تغيّرت قيمتا المتغيّرات. أي إذا استُبدل السطران الأولان بهذا

x = 4
y = 9

فينبغي أن يطبع البرنامج ما يلي:

4 + 9 = 13
4 - 9 = -5
4 * 9 = 36
4 / 9 = 0.4444444444444444

ملاحظة: هذا التمرين يتطلب بيئة TMC التفاعلية ولا يعمل في النسخة الثابتة.

تمرين تفاعلي: إصلاح الشيفرة: اطبع سطرًا واحدًا

يطبع كل أمر print عادةً سطرًا خاصًا به، منتهيًا بفاصل سطر. لكن إذا مُنح الأمر print وسيطًا إضافيًا هو end = ""، فلن يطبع فاصل سطر.

فمثلًا:

print("Hi ", end="")
print("there!")
Hi there!

يُرجى إصلاح هذا البرنامج بحيث تُطبع العملية الحسابية كاملة، بما في ذلك نتيجتها، في سطر واحد. لا تغيّر عدد أوامر print المستخدَمة.


print(5)
print(" + ")
print(8)
print(" - ")
print(4)
print(" = ")
print(5 + 8 - 4)

ملاحظة: هذا التمرين يتطلب بيئة TMC التفاعلية ولا يعمل في النسخة الثابتة.