دورة Python للمبتدئين

1: البرمجة بلغة بايثون – Numbers, Strings, Lists

Python3.8

السلام عليكم و رحمة الله تعالي و بركاته

في هذا الدرس، سنكتب أول أكواد برمجية لنا.

بعض الحسابات الرياضية بِـبايثون:

في هذه الخطوة، سنقوم فقط ببعض التطبيقات البسيطة جدا للتعرف على قدرات هذه اللغة. أول خطوة نقوم بها هي أن نفتح “المترجم” أو Intrepreter الخاص ب بايثون.

IDLE Python 3.8 64 bit

عمليات حسابية بسيطة

>>> 10 + 13
23
>>> (3 - 4)/5
-0.2
>>> 8/2
4.0
>>> 12 + 6 * (2 / 4)
15.0

نلاحظ إذا كيف أن المترجم يشتغل تماما كآلة حاسبة. إذ يكفي أن تكتب العملية و تضغط على زر Enter لتحصل على النتيجة. و يمكن أيضا استعمال الأقواس كما في الآلة الحاسبة تماما.

يمكن أن تكونوا قد لاحظتم أن خارج القسمة له صيغة عدد عشري حتى و لو كان مجرد رقم فردي، أي بدل أن يكون الخارج فقط 4، أضاف له المترجم فاصلة و صفرا! حسنا، هذا ليس خطأ، إنما في لغة بايثون، تقوم القسمة دائما بإخراج أعداد عشرية.

Floor division و modulo

>>> 12 / 5
2.4
>>> 12 // 5
2
>>> 12 % 5
2
>>> 5 * 2 + 2
12

القسمة العادية 12/5 تعطي دائما خارجا عشريا.

القسمة التالية تسمى بـ floor division، تعطي فقط الجزء الصحيح من الخارج أو الخارج الصحيح فقط. في المثال أعلاه، 12/5 تساوي 2,4، و لكن عندما نأخذ الجزء الصحيح من هذا الخارج يصبح لدينا 2 فقط، و هذا ما يفسر نتيجة 5//12. مثال آخر: 16/3 تساوي 5,33 ، إذا فنتيجة 3//16 هي 5، أي الجزء الصحيح فقط.

أما بالنسبة للأداة % فهي تدعى modulo، النتيجة التي تعطيها هي الباقي. ففي المثال أعلاه، لدينا 5 % 12 تساوي 2، يعني 5 * 2 + 2 (الباقي) = 12. مثال آخر: 7 % 29 يساوي 1، أي 7 * 4 + 1 = 29، (7*4 = 28).

حساب القوى

حساب القوى باستخدام بايثون بسيط جدا، يكفي استعمال نجمتين و بعدها القوة.

>>> 5 ** 3
125
>>> 2 ** 3
8
>>> 10 ** 2
100

استعمال المتغيرات

>>> a = 4
>>> b = 7
>>> a * b
28
>>> a + b
11
>>> b % a
3
  • يمكن استعمال متغيرات فقط بإدراج قيمة رقمية إلى المتغير من خلال أداة “=” .
  • الأداة “=” في هذه الحالة تقوم بإعطاء المتغير a مثلا قيمة 4 (هذا لا يعني أن a تحمل دائما القيمة 4 فقط، و لكن يمكن إدراج قيمة أخرى في المتغير a و هكذا تزال القيمة السابقة كما لو لم تكن).
  • يمكن إجراء العمليات الرياضية على المتغيرات التي تحمل قيما رقمية.
  • إذا لم تقم بإدراج قيمة ما في متغير معين، فإن المحرر سيقوم بإظهار رسالة خطأ Error كالتالي:
>>> c
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    c
NameError: name 'c' is not defined

نلاحظ أن الرسالة Traceback تحدد السطر الذي يحتوي على الخطأ (line 1)، و نوع الخطأ محدد بـ NameError، أي أن الخطأ متعلق باسم متغير أو اسم دالة ما، و التوضيح الأكثر دقة هو (name ‘c’ is not defined )، أي أن الإسم c غير معرف. و هذا لأننا لم نقم بإدخال قيمة ما داخل المتغير c.

>>> D = 10
>>> d = 5
>>> D
10
>>> d
5

يجب أن نكون حذرين خلال كتابة أسماء المتغيرات، فالمترجم (Intepreter) يأخذ بعين الاعتبار الحروف الكبيرة و يعتبرها مختلفة عن الحروف الصغيرة، كما هو موضح في المثال أعلاه.

الرمز _

>>> Value1 = 12
>>> Value2 = 3
>>> Value1
12
>>> Value2 + _
15

العلامة ” _ ” في بايثون تقوم بحفظ آخر قيمة تم طبعها، أي إظهارها للمستخدم. في المثال أعلاه، عندما طبعنا المتغير Value1 ظهرت لنا القيمة 12 و التي قمنا بإدراجها فيه مسبقا. و هكذا تم تسجيل الرقم 12 بشكل أوتوماتيكي في المتغير ” _ ” ، و عندما جمعنا بين المتغير Value2 و المتغير ” _ ” تظهر لنا النتجية 15، أي 12 + 3 . و عندما نطبع المتغير ” _ ” بمفرده تظهر لنا القيمة 15 أي آخر قيمة تم طبعها. هذا المتغير معرف مسبقا في مكتبة بايثون و لكن لا بد من وجود قيمة مطبوعة مسبقا حتى يتم تسجيلها بشكل أوتوماتيكي فيه.

التعاليق Comments

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

>>> #This is our first comment
>>> c = 123 #Let's try another one
>>> c #It's really fun!
123

كتابة النصوص String

>>> Hello
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    Hello
NameError: name 'Hello' is not defined
>>> 'Hello'
'Hello'
>>> "Hello"
'Hello'

عندما نكتب كلمة أو جملة دون وضعها بين علامتي الاقتباس ‘ ‘ ، يعتبرها المترجم متغيرا غير معرف. لذا عند كتابة النصوص يجب وضعها بين علامتي اقتباس، سواء كانت أحادية أو مزدوجة. إذا يمكن اللجوء إلى استعمال علامة اقتباس مزدوجة في بعض الحالات، هل يمكنكم أن تحزروا متى يفضل استعمالها؟ حسنا، لنلق نظرة على الصورة التالية:

>>> 'I don't like coffee.
SyntaxError: invalid syntax

اعتبر المترجم علامة الاقتباس في كلمة don’t تابعة للعلامة الأولى فقام بقفل النص عندها و هذا ما يسبب في ظهور خطأ. لذا بدل استعمال علامة اقتباس أحادية في حالة وجود كلمات كهذه يفضل استعمال علامة مزدوجة، أو استعمال الخط المائل قبل العلامة ‘\ كما في الصورة التالية:

>>> "I don't like coffee"
"I don't like coffee"
>>> 'I don\'t like coffee'
"I don't like coffee"
>>> "\"Python\" is a programming language"
'"Python" is a programming language'

إذا للحفاظ على علامة اقتباس محددة داخل النص يجب استعمال الخط المائل \ قبلها.

>>> 'Hello world'
'Hello world'
>>> print('Hello world')
Hello world
>>> a = 'Hello world'
>>> a
'Hello world'

() print

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

>>> print('Ths is \n an example')
Ths is 
 an example
>>> a = 'This is \n an example'
>>> a
'This is \n an example'

الرمز n\

التعبير “n\” يعبر عن سطر جديد. كما تلاحظون أعلاه، عندما طبعنا جملة باستعمال الدالة print() تظهر لنا تتمة الجملة بعد n\ في سطر آخر جديد.

لكن عندما طبعنا المتغير بمفرده دون الدالة تظهر لنا العبارة نفسها كما كتبناها، هذا يجعلنا ندرك أن طبع المتغير بمفرده يسمح لنا برؤية ما بداخله دون تغيير. أما الدالة فهي تحول التعبير n\ إلى سطر جديد:

>>> a = 'This is \n an example'
>>> a
'This is \n an example'
>>> print(a)
This is 
 an example

و لكن ماذا لو أردنا إظهار التعبير n\ في الجملة بشكل عادي دون تحويله إلى سطر جديد باستعمال الدالة print() ؟

>>> print(r'Oranges and \n Apples')
Oranges and \n Apples

يكفي أن نستعمل الحرف r قبل علامة الاقتباس.

طباعة نص كبير

في حالة أردنا كتابة نص كبير يحتوي على عدة مساحات و أسطر، بإمكاننا استعمال ثلاث علامات اقتباس ”’”’ أو “”” “”” .

يمكن استعمال الرمز \ من أجل منع المترجم من الانتقال إلى سطر جديد في بعض الأماكن. كما في الصورة أسفله:

>>> print('''Example:\
List:
	- Element 1;
	- Element 2;
	- Element 3.
''')
Example:List:
	- Element 1;
	- Element 2;
	- Element 3.

>>> print('''Example:
List:
	- Element 1;
	- Element 2;
	- Element 3.
''')
Example:
List:
	- Element 1;
	- Element 2;
	- Element 3.

جمع و تكرار النصوص

النصوص يمكن أن تُجْمَع باستعمال الرمز + أو تٌكرَّر باستعمال رمز * ، أي الضرب. و ذلك كالتالي:

>>> 'Hello' + 'world'
'Helloworld'
>>> 'Hello' + ' world'
'Hello world'
>>> 2 * 'Hi! '
'Hi! Hi! '
>>> 4 * 'Hello ' + 'world'
'Hello Hello Hello Hello world'

تقسيم النصوص

عندما نكتب نصوص داخل علامتي اقتباس جنب بعضها البعض، يقوم المترجم بجمعها بشكل أوتوماتيكي:

>>> 'Ar' 'abic'
'Arabic'
>>> 'Pro' 'gramming'
'Programming'

عندما نرغب في تقسيم نص ما و إدراجه في متغير نستعمل الأقواس لجمع النصوص المقسمة (ولا ننس المساحة في آخر القسم الأول أو بداية القسم الثاني):

>>> example = ('The creator of Python'
		'is Guido van Rossum.')
>>> example
'The creator of Pythonis Guido van Rossum.'
>>> example = ('The creator of Python '
		'is Guido van Rossum.')
>>> example
'The creator of Python is Guido van Rossum.'

عند استعمال متغيرات تحمل نصوص، لا يمكن جمعها بوضعها جنب بعض كما هو الوضع مع النصوص فقط. و لكن في هذه الحالة نستعمل الرمز + .

>>> A = 'Lang'
>>> B = 'uage'
>>> A B
SyntaxError: invalid syntax
>>> A 'uage'
SyntaxError: invalid syntax
>>> A + B
'Language'
>>> A + 'uage'
'Language'

الفهرسة Indexing في النصوص:

النصوص مفهرسة حسب حروفها، حيث يرتبط أول حرف بالرقم 0. و من خلال هذه الإمكانية، نستطيع أن نحدد أي جزء نرغب بإظهاره من النصوص.

>>> word = 'Python'
>>> word[0]
'P'
>>> word[1]
'y'
>>> word[2]
't'
>>> word[3]
'h'
>>> word[4]
'o'
>>> word[5]
'n'

ماذا لو استعملنا رقما سالبا ؟ مثلا 2- :

>>> word[-1]
'n'
>>> word[-2]
'o'
>>> word[-3]
'h'
>>> word[-4]
't'
>>> word[-5]
'y'
>>> word[-0]
'P'

نلاحظ أن [0-] = [0] و يشير دائما إلى أول حرف، و أن علامة” – ” تبدأ العد من النهاية، أي أن آخر حرف في نص ما سيكون ذا الوضع [1-]

تقطيع جزء معين من النص Slicing

عندما نريد أن نقص جزءا ما فقط من النص و نظهره نستعمل الطريقة التالية:

>>> word = 'SHAFRAH TECH'
>>> word[0:6]
'SHAFRA'
>>> word[0:7]
'SHAFRAH'

[0:6] تعني أن التقطيع يبدأ من الرقم على اليسار 0 ، بلوغا للرقم على اليمين 6. و لكن في هذه الحالة لم نحصل على كلمة SHAFRAH كاملة. و هذا لأن الرقم على اليمين غير متضمن في التقطيع، أي أن التقطيع يتوقف عنده و لا يضمه. لذا يجب أن نضيف درجة من أجل الحصول على الحرف ذو المرتبة 6. و لذلك قمنا بكتابة [0:7]

>>> word[0:6] + word[7:12]
'SHAFRA TECH'
>>> word[:6]
'SHAFRA'
>>> word[7:]
' TECH'
>>> word[:6] + word[7:]
'SHAFRA TECH'

بهذه الطريقة يمكننا جمع النصوص المقطعة بسهولة. و من أجل تقليل الجهد أيضا يمكن ألا نكتب الرقم على اليمين، كـ [:7] و هذا يعني أن المترجم سيقطع النص ابتداء من الرقم 7 إلى النهاية . أما [6:]، أي عدم كتابة الرقم على اليسار، يعني أن المترجم سيقطع النص من بدايته حتى الرقم 6 و من ثمة يتوقف عنده.

الدالة ()len تقوم بحساب عدد أحرف النص. مثلا:

>>> word
'SHAFRAH TECH'
>>> len(word)
12

بعض الأمور التي يجب الانتباه لها

  • كتابة رقم أكبر من عدد أحرف النص كالتالي يظهر خطأً:
>>> word
'SHAFRAH TECH'
>>> len(word)
12
>>> word[14]
Traceback (most recent call last):
  File "<pyshell#30>", line 1, in <module>
    word[14]
IndexError: string index out of range
  • و لكن عند التقطيع، لا ضير من استعمال أرقام كبيرة:
>>> word[:14]
'SHAFRAH TECH'
>>> word[34:100]
''
>>> 
  • النصوص في بايثون غير قابلة للتعديل، لذا لا يمكن تغيير نص ما كالتالي:
>>> word = 'SHAFRAH TECH'
>>> word[2] = 'r'
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    word[2] = 'r'
TypeError: 'str' object does not support item assignment

لنلاحظ العبارة : TypeError: ‘str’ object does not support item assignment

هذه العبارة تصرح بأن النصوص Strings لا تدعم التغيير بعد إنشائها.

القوائم Lists

القائمة أو List في بايثون تسمح باحتواء مجموعة من البيانات تحت متغير واحد. يمكن أن تتضمن عناصر من أنواع مختلفة: عدد، نص، قائمة أخرى… كما يمكن أن تتضمن بيانات من نفس النوع. و في الغالب تكون العناصر المكونة لقائمة ما متشابهة النوع.

مثال:

>>> even_numbers = [2,4,6,8,10]
>>> even_numbers
[2, 4, 6, 8, 10]

الفهرسة و التقطيع

يمكننا فهرسة و تقطيع القوائم أيضا كما سبق و فعلنا مع النصوص تماما.

Indexing

>>> even_numbers
[2, 4, 6, 8, 10]
>>> even_numbers[0]
2
>>> even_numbers[-3]
6

Slicing

>>> even_numbers
[2, 4, 6, 8, 10]
>>> even_numbers[:-4]
[2]
>>> even_numbers[3:]
[8, 10]

Creating a copy

>>> even_numbers[:]
[2, 4, 6, 8, 10]

Concatenating

>>> even_numbers
[2, 4, 6, 8, 10]
>>> even_numbers + [12,14,16,18,20]
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

Appending

يمكن توسيع القائمة بإضافة عنصر ما باستعمال طريقة append :

>>> odd_numbers = [1,3,5,7,9]
>>> odd_numbers.append(11)
>>> odd_numbers
[1, 3, 5, 7, 9, 11]

append يمكن أن تحتوي أيضا على عمليات حسابية:

>>> odd_numbers
[1, 3, 5, 7, 9, 11]
>>> odd_numbers.append(2*6+1)
>>> odd_numbers
[1, 3, 5, 7, 9, 11, 13]

Clearing a list

لحذف محتوى القائمة، نستعمل الطريقة التالية علما أن [] تعني قائمة فارغة.

>>> odd_numbers = []
>>> odd_numbers
[]

Removing values

من أجل حذف عنصر ما من عناصر القائمة، نختار المقطع الذي نرغب بحذفه و نجعله مساويا للقائمة الفارغة []:

  • لحذف عنصر واحد : الحرف d مثلا
>>> letters = ['a','b','c','d','e','f','g','h']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> letters[3:4] = []
>>> letters
['a', 'b', 'c', 'e', 'f', 'g', 'h']
  • لحذف أكثر من عنصر: الحروف f و e مثلا
>>> letters = ['a','b','c','d','e','f','g','h']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> letters[4:6] = []
>>> letters
['a', 'b', 'c', 'd', 'g', 'h']

Replacing values

لتغيير قيمة عناصر القائمة نقوم ببساطة اختيار العنصر أو العناصر التي نريد تغييرها و إدخال القيم الجديدة فيها (مع احترام الترتيب):

>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> letters[0:2] = ['A','B']
>>> letters
['A', 'B', 'c', 'd', 'e', 'f', 'g', 'h']

len() function

لحساب عدد العناصر المكونة لقائمة ما:

>>> letters
['A', 'B', 'c', 'd', 'e', 'f', 'g', 'h']
>>> len(letters)
8

قائمة في قائمة:

عندما نرغب في حذف عنصر ما، من غير الصحيح اختيار رتبة العنصر المُختَار فقط، بل يجب إضافة رتبة العنصر التالي أيضا. فإذا لم نضف الرتبة التالية، سيعتبر المترجم أننا نرغب في إدخال قائمة فارغة مكان العنصر المراد حذفه:

>>> letters
['A', 'B', 'c', 'd', 'e', 'f', 'g', 'h']
>>> letters[1] = []
>>> letters
['A', [], 'c', 'd', 'e', 'f', 'g', 'h']

فالقوائم في بايثون قادرة على احتواء قوائم أخرى:

>>> letters[1] = ['B','b']
>>> letters
['A', ['B', 'b'], 'c', 'd', 'e', 'f', 'g', 'h']

نهاية الدرس الأول

موعدنا في الدرس التالي بحول الله.

سنتوقف في هذا الدرس هنا، قد تكون كمية المعلومات كثيرة و لكنها مع الوقت تصير محفوظة عن ظهر قلب. لذا أدعوكم إلى ممارسة ما تعلمناه في هذا الدرس حتى يصير منقوشا في أدمغتكم. نجدد ترحيبنا بمحبي البرمجة و ندعوكم إلى طرح تساؤلاتكم و ملاحظاتكم في قسم التعليقات أسفله حتى نعمل على تطوير المحتوى معا.

السابق
تثبيت مترجم بايثون على وندوز Windows
التالي
2: البرمجة بلغة بايثون – Constants, Variables و أنواع البيانات