السلام عليكم و رحمة الله و بركاته
في هذا الجزء من الدرس الأول، ستنعرف أكثر على المتغيرات في لغة البرمجة بايثون.
جدول المحتويات
Constants أو الغير متغيرات:
هي قِيَم ثابتة لا تتغير سواء كانت أرقاما، نصا، أو لائحة… و لهذا السبب تُسَمى بـ Constants، أي ثابتة.
مثال:
>>> print(23) 23 >>> print(2.45) 2.45 >>> print("Shafrah") Shafrah >>>
عندما نقوم بطبع رقم 23 مثلا يظهر لنا نفس الرقم دون تغيير، و هكذا.
ما هي الكلمات المحجوزة Reserved words ؟
الكلمات المحجوزة reserved words أو الكلمات المفتاحية keywords هي مُعرَّفة مسبقا من قبل اللغة البرمجية و لكل واحدة دور معين مخصص لها. مثلا، كلمة print هي دالة تقوم بإظهار عبارة معينة على الشاشة، كلمة if و هي تعني الدالة الشرطية التي تقوم بتنفيذ أمر ما عندما يتحقق شرط معين… إلخ
هذه لائحة بعض الكلمات المحجوزة الخاصة بلغة بايثون:
and assert in
del else raise
from if continue
not pass finally
while yield is
as break return
elif except def
global import for
or print lambda
with class try
exec
ما هي المتغيرات؟
كي نفهم أكثر مبدأ عمل المتغيرات، لنلاحظ المثال التالي:
لدينا أدراج معينة في خزانة ملابسنا أو مكتبنا، و في كل درج نضع أغراضا معينة بهدف تخزينها و الحفاظ عليها و أيضا سهولة إيجادها. فقد يحتوي درج على أقلام متنوعة و أدوات الرسم و الكتابة. و درج أخر قد يحتوي فقط على الدفاتر و الأوراق المخصصة للتخطيط أو الرسم مثلا. إذا نضع في كل درج غرضا محددا و كلما رغبنا في استعماله نبحث عنه و نجده هناك بسهولة تامة.
هذا هو الغرض من استعمال المتغيرات. فهي تحفظ جزءا معينا من المساحة على الحاسوب، و تخزن فيه قيمة معينة ندخلها نحن أو نعطي الخيار للمستخدم في إدخالها… فهي كصندوق تحمل قيما محددة و تخزنها في المساحة.
Assignment statement
Assignment statement أو تعبير “التكليف” يعني التعبير الذي يسمح لنا بتخزين قيمة ما في متغير معين. و يتم تخزين القيم في المتغيرات باستعمال الرمز = .
عند استعمال الرمز = ، لا يجب التفكير هنا بنفس منطق الرياضيات، أي أن المتغير number مثلا يساوي 12 دائما، و ما إذا كتبنا number = 10 نقول أن هذا خطأ لأن number = 12.

بل رمز التساوي هنا يعمل كسهم يُوجِّه القيمة نحو متغير محدد. يعني أن بفضله يمكن أن نضع 12 في المتغير number ، و إذا كتبنا number = 10 فهذا يعني أننا وضعنا 10 في المتغير و أزلنا القيمة السابقة فأصبح المتغير يحتوي على 10.
Assignment statement with expression
expression هنا تعني التعبير الرياضي أو عمليات رياضية. أي أننا نستطيع أن نُخزن قيمة ما في متغير باستعمال عملية رياضية:
>>> number = 12 >>> print(number) 12 >>> number = number * 2 >>> print(number) 24
في البداية لدينا المغير number = 12 ، و بعدها غيرنا قيمة المتغير number من خلال تخزين تعبير رياضي فيه و هو number * 2 .
البرنامج في هذه الحالة، سيبدأ أولا بتنفيذ التعبير الرياضي، يأخذ القيمة 12 و يضربها في 2، و من ثم يخزن النتيجة التي حصل عليها و هي 24 في المتغير number، و بالتالي عندما نقوم بطبع المتغير number باستعمال print (و هي كلمة مفتاحية keyword) نرى أن قيمة المغير تغيرت و أصبحت بالفعل 24.
ما شروط تسمية المتغيرات؟
هناك شروط معينة نتبعها من أجل اختيار أسماء متغيرات صحيحة في لغة بايثون:
- يجب أن يبتدئ اسم المتغير بحرف، أو بالواصلة السفلية _ فقط . مثال: spam ، _joke
- يمكن أن يُركَّب الاسم على حروف، أرقام و على الواصلة السفلية _ فقط
- لا يمكن استعمال رموز أخرى في الاسم كـ : # ، $ ، @ …
- الأسماء في بايثون تأخذ في الحسبان الحروف الكبيرة و الصغيرة، أي إذا كتبنا نفس المتغير بحروف كبيرة سيُعتَبرُ متغيرا آخرا، حتى لو كان الاسم بحرف كبير واحد. مثلا: SHAFRAH تختلف عن Shafrah و عن shafrah ، نقول أن المتغيرات في بايثون case sensitive، أي تتأثر بتغير الحروف الكبيرة و الصغيرة؛
- لا يمكن استعمال كلمات محجوزة كأسماء متغيرات.
Mnemonic variable names
نقصد هنا بـ mnemonic variables names أسماء المتغيرات التي تساعدنا على تذكر المغزى من شفرتنا و كيفية عملها. أنه أننا باختيارنا أسماء سهلة التذكر و ذات دلالة معينة فسيسهل علينا الأمر فهم الشفرة أكثر خصوصا بعد الرجوع إليها بعد مدة من الزمن.
لنقارن بين الشفرات التالية:
- الشفرة الأولى:
esjgqjgjq = 7000 esjgqjejq = 11 esjjqjejq = esjgqjgjq * esjgqjejq print(esjjqjejq)
- الشفرة الثانية:
a = 7000 b = 11 c = a * b print(c)
- الشفرة الثالثة:
Salary = 7000 Months_of_work = 11 Annual_Salary = Salary * Months_of_work print(Annual_Salary)
في الشفرة الأولى، كان تحديد اختلاف المتغيرات صعبا بسبب اختيار أسماء عشوائية طويلة مما يجعل قراءة و فهم الشفرة معقدا و مُرهقا. أما في الشفرة الثانية، اخترنا أسماءً قصيرة بسيطة جعلت الشفرة أكثر وضوحا. لكن الشفرة الثالثة قدمت لنا فكرة عن ما تقوم به بالضبط، و هو حساب الراتب السنوي من خلال استعمال كلمات تُعبر عن معنى كل متغير.
استعمال أسماء واضحة تساعدنا على تذكر الهدف من شفرتنا و سهولة فهمها، و لكن بايثون لا يبالي بأية أسماء نختار، فهو في كل الحالات سيشتغل ما دمنا نستعمل نفس الأسماء التي اخترناها.
ما أنواع المتغيرات؟
تدعم بايثون خمسة أنواع من البيانات:
- الأعداد Numeric
- النصوص String
- القوائم Lists
- المصفوفات Tuples
- القواميس Dictionnaries
- المجموعات Sets
الأعداد
- int (أعداد صحيحة)
a = 15
- float (القيم الحقيقية)
f = 12.07
- complex (أعداد معقدة)
c = 12 + 3j
j = الجذر التربيعي لـ 1-
- bool (يُرجِع قيمتين: صحيح True أو خطأ False )
bool هو اختصار لكلمة boolean. لدينا في المثال أعلاه f = 12.07
bool(f == 12.07)
هذه الدالة تتأكد من ما إذا كان المتغير f يساوي فعلا 12.07، أي f == 12.07
في حالة تحقق التساوي: تظهر كلمة True:
>>> f = 12.07 >>> bool(f== 12.07) True
في حالة عدم تحقق التساوي، لنضع مثلا f == 13 ، تظهر الكلمة False:
>>> f 12.07 >>> bool(f == 13) False
النصوص و القوائم:
تطرقنا للنصوص و القوائم في الدرس التمهيدي السابق.
المصفوفات، القواميس و المجموعات:
سنتطرق لها في وقت لاحق في هذه الدورة بحول الله.
تحويل أنواع البيانات
كما رأينا سابقا، يمكن تحويل أنواع البيانات باستعمال الدوال التالية:
-
-
-
-
-
-
-
-
-
-
-
-
- int()
- float()
- str()
-
-
-
-
-
-
-
-
-
-
-
لا يمكن تحويل نصوص تحتوي على حروف و أرقام، أو فقط حروف إلى رقم صحيح أو حقيقي:
>>> int("Shafrah") Traceback (most recent call last): File "<pyshell#13>", line 1, in <module> int("Shafrah") ValueError: invalid literal for int() with base 10: 'Shafrah' >>> int('01code') Traceback (most recent call last): File "<pyshell#14>", line 1, in <module> int('01code') ValueError: invalid literal for int() with base 10: '01code'
و لكن إذا كان النص يحتوي فقط على أرقام، فالتحويل ممكن:
>>> int('123') 123 >>> float('230') 230.0
Operators
لتلخيص ما تم التطرق إليه في الدرس الماضي:
- لحساب الجمع Addition نستعمل +
- لحساب الطرح Subtraction نستعمل –
- لحساب الضرب Multiplication نستعمل *
- لحساب القسمة العشرية Float division نستعمل /
- لحساب القسمة الصحيحة Integer division نستعمل //
- لحساب الباقي Remainder نستعمل %
- لحساب القوى Power نستعمل **
Assignment Operators
عندما نرغب في تخزين عملية رياضية بمتغير ما تحتوي على قيمته السابقة، مثلا a = a + 2، فإننا نختصر الأمر بكتابة a += 2 :
>>> a = 10 >>> a = a + 2 >>> print(a) 12 >>> a = 10 >>> a += 2 >>> print(a) 12
و هذا ينطبق أيضا على الباقي :
a += b # a = a + b a -= b # a = a - b a *= b # a = a * b a /= b # a = a / b a //= b # a = a // b a %= b # a = a % b
Comparison Operators
من أجل المقارنة بين المتغيرات مثلا، نستعمل الرموز التالية:
- == : التساوي
>>> 12 == 12 True
- =! : الاختلاف
>>> 12 != 13 True >>> 12 != 12 False
- <= و >= :
>>> 13 >= 12 True >>> 14 <= 14 True
- < و > :
>>> 12 < 6 False >>> 12 > 6 True
Membership Operators
معاملات العضوية أو membership operators تسمح لنا بالتأكد من عضوية قيمة ما. باستعمالهم يمكن لنا التحقق من تواجد قيمة ما في تسلسل sequence معين. نقصد بالتسلسل مثلا نص string (تسلسل حروف و/أو أرقام) أو قائمة list أو مصفوفة tuple.
- in operator :
مثال:
>>> text = 'Shafrah' >>> 't' in text False >>> 's' in text False >>> 'S' in text True >>> List1 = [1,2,3,5] >>> 4 in List1 False >>> 2 in List1 True
ملاحظات:
عند استعمال in ، فإننا نتحقق من تواجد قيمة ما، مثلا الحرف t في نص Shafrah.
فالأمر كما لو كنا نسأل المترجم هل توجد t في المتغير text الذي يحمل النص Shafrah ؟
- الحرف t لا يوجد في كلمة Shafrah، لذا ظهرت النتيجة False.
- الحرف s الصغير لا يوجد في كلمة Shafrah ، تظهر النتيجة False.
- الحرف S الكبير يوجد في الكلمة، تظهر النتيجة True.
=> نستنتج إذا أن المعامل in يعتبر الحروف الكبيرة مختلفة عن الحروف الصغيرة، مثلا s تختلف عن S.
- not in operator :
نأخذ نفس الأمثلة أعلاه و لكن هذه المرة نستعمل عكس المعامل in:
>>> text = 'Shafrah' >>> 't' not in text True >>> 's' not in text True >>> 'S' not in text False >>> list1 = [1,2,3,5] >>> 4 not in list1 True >>> 2 not in list1 False
إذا كان المعامل in يتحقق من تواجد قيمة ما في تسلسل معين، فإن المعامل not in يتحقق من عدك تواجد تلك القيمة في التسلسل المحدد.
فلنلاحظ الأمثلة أعلاه:
هنا نسأل هل لا يوجد الحرف t مثلا في النص Shafrah ؟
إذا كانت القيمة تتواجد فعلا في التسلسل (نص، قائمة…)، ستظهر النتيجة False، كما لو كانت الإجابة من المترجم: خطأ فالقيمة متواجدة.
أما إذا كانت القيمة غير متواجدة في التسلسل، ستظهر النتيجة True، كما لو كانت الإجابة من المترجم: صحيح، معكم حق، القيمة غير متواجدة.
Identity Operators
تُستعمل من أجل التأكد من انتماء متغير ما إلى نوع type معين أو قسم class معين.
- is operator :
>>> number = 23 >>> type(number) is int True >>> type(number) is float False
- is not operator :
>>> text = '47' >>> type(text) is not str False >>> type(text) is not int True