python 101 التعابير الشرطية والإزاحات (المساحات البيضاء) في بايثون


عبدالهادي الديوري

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

python-cond-indent.png.ed15af48ea4df1684

التعابير الشرطية Conditional Expressions

توفّر لنا لغة بايثون عدّة مُعاملات لمُقارنة القيّم، ونتيجة المُقارنة تكون قيمة منطقيّة Boolean إمّا True أو False.

>>> 2 < 3
False
>>> 2 > 3
True

إليك قائمة بالمُعاملات المُتوفّرة في لغة بايثون.

  • == يُساوي
  • =! لا يُساوي
  • > أصغر من
  • < أكبر من
  • => أصغر من أو تُساوي
  • =< أكبر من أو تُساوي

ويُمكن استعمال هذه المُعاملات أكثر من مرّة في السّطر الواحد:

>>> x = 5
>>> 2 < x < 10
True
>>> 2 < 3 < 4 < 5 < 6
True

وتعمل المعاملات على السّلاسل النّصية كذلك (التّرتيب يكون بشكل معجمي، أي حسب ترتيب الكلمات في المُعجم).

>>> "python" > "perl"
True
>>> "python" > "java"
True

يُمكن الجمع بين القيّم المنطقيّة بمعاملات منطقيّة:

  • a and b: صحيح فقط إذا كان كل من a و b يحملان القيمة True.
  • a or b: صحيح إذا كانت إحدى القيمتين صحيحة.
  • not a: صحيح فقط إذا كان a يحمل القيمة False.

وإليك مثالا على المُعاملات المنطقيّة:

>>> True and True
True
>>> True and False
False
>>> 2 < 3 and 5 < 4
False
>>> 2 < 3 or 5 < 4
True

الجملة الشرطية If

تُستعمل الجملة الشّرطيّة If (إذا كان) لتنفيذ جزء من الشّيفرة إذا كان الشّرط مُحقّقا:

>>> if x % 2 == 0:
...     print 'even'
...

even
>>>

في المثال أعلاه طُبعَت الكلمة even لأنّ باقي قسمة 42 على 2 يُساوي صفرا (x % 2 == 0)، وبالتّالي فقد تحقّق الشّرط، فلو أنّ الشّرط لم يتحقّق لما أرجع المُفسّر أي نتيجة.

يُمكن استخدام If كشرط لتنفيذ جزء منفصل من الشيفرة بالإزاحة (انظر فصل الإزاحة والمساحات أسفله)، ويكون هذا الأمر مُفيدا عندما يحتوي برنامجك على الكثير من الجمل. لاحظ بأنّ الجمل التّابعة للسّطر if x % 2 == 0 مُزاحةٌ بأربع مسافات بيضاء.

الجملة else

يُمكن أن تزيد على جملة If بند else وترجمته (وإلّا / إذا لم يكن ذلك صحيحًا)، والتي تنفّذ الشيفرة التّي من بعدها إذا كان الشّرط الأول خاطئا.

>>> x = 3
>>> if x % 2 == 0:
...     print 'even'
... else:
...     print 'odd'
...
odd
>>>

في المثال أعلاه، كان الشّرط الأول خاطئا لأن باقي قسمة 3 على 2 لا يُساوي صفرًا، ولذلك انتقل البرنامج لتنفيذ الشّيفرة بعد جملة else وقام بطباعة كلمة odd.

الجملة elif

يُمكن كذلك أن تزيد جملة elif وهي اختصار لـ else if والتّي تعني "إذا لم يتحقّق الشرط فانظر الشّرط التّالي":

>>> x = 42
>>> if x < 10:
...     print 'one digit number'
... elif x < 100:
...     print 'two digit number'
... else:
...     print 'big number'
...
two digit number
>>>

في المثال أعلاه، هناك شرطان مختلفان، أولا عند تحقّق شرط كون قيمة المتغيّر x أصغر من العدد 10 فسيطبع البرنامج الجملة التي تقول بأنّ قيمة المتغير x عبارة عن رقم واحد، إذا لم يتحقّق الشّرط السّابق فسينتقل البرنامج إلى الشّرط الذي يليه وهو ما يتبع الجملة elif أي إذا كانت قيمة المتغيّر x أصغر من 100 فسيطبع البرنامج الجملة التي تفيد بأنّ قيمة المتغير x عبارة عن رقمين والجملة else تنفَّذُ إذا لم يتحقّق أي شرط وتفيد بأنّ قيمة المتغيّر x عبارة عن عدد كبير (لأنّه يتكون من 3 أرقام فأكثر).

المساحة والمسافات والإزاحة

المساحات التّي تسبق الشّيفرات في بايثون مُهمّة جدّا لترتيب شيفرة البرنامج ولتسهيل قراءته، كما أنّها تكون ضروريّة في بايثون، فإن لم تتّبع قوانين الإزاحة فلن يعمل البرنامج، وتُستعمل هذه الطّريقة لفصل الشّيفرات التّابعة لجزء معيّن من البرنامج، والإزاحة تكون بكتابة الشّيفرة بعد عدد معيّن من المسافات، ومن المُفضّل أن تكون أربع مسافات بيضاء، انظر المثال:

هل الشّرط محقّق؟ 
.... نعم الشّرط محقّق 
.... لا الشرط غير محقق
انتهى البرنامج

في المثال أعلاه، الجملتان "نعم الشّرط محقّق" و "لا الشّرط غير محقّق" تابعتان للجملة "هل الشّرط محقّق؟" أمّا الجملة "انتهى البرنامج" فتابعة للبرنامج عامّة. وقد اعتمدت على النّقاط لتوضيح فكرة الإزاحة فقط وعليك أن تستبدل النّقاط بالمسافات في ملفّات بايثون.

يُمكن كذلك أن تكون الشّيفرة تابعة لجملة ما، والتّي بدورها تابعة لجملة أخرى، لتتّضحك الأمور أكثر، فكّر في شجرة عائلة تتكوّن من الآباء والأولاد:

جدّ 
....أب 1 
........ابن 1.1
........ابن 1.2 
....أب 2 
........ابن 2.1 
........ابن 2.2

للجد ابنان، ولكل ابن ابنان، نستنتج من هذا أنّ كلّ ابن تابع لأبيه بإزاحة أربع مسافات، أمّا الحفيد فتابع للجدّ بثماني مسافات.

وإلى الآن تعرّفنا على موضع واحد تكون فيه الإزاحة إجباريّة وهي الجمل الشّرطيّة، فمثلا البرنامج التّالي:

x = 42
if x % 2 == 0:
    print 'even'
print 'Hello World'

في المثال أعلاه جميع السّطور المزاحة بأربع مسافات (أي الجملة التي تطبع كلمة even) تُنفّذ عند تحقّق الشّرط فقط، أي أنّها جزء مرتبط بالشّرط في البرنامج، أمّا الشيفرة التي لم تُسبق بمسافات فتنفّذ بشكل طبيعي وتعتبر ضمن البرنامج عامّة.

أمّا إذا أردنا أن نطبع جملة بعد التّحقّق من شرطين فسيكون البرنامج كالتّالي: 

الشّرط الأول محقّق، إذن انتقل إلى الشّرط الثّاني. 
الشّرط الأول غير محقّق، إذن لا تنتقل إلى الشّرط الثّاني. 

إليك تطبيقا للأمر في لغة بايثون:

# البرنامج
x = 42
if x % 2 == 0:
    print 'even'
    if x / 2 == 21:
        print '42/2 = 21 Is true'

print 'Hello World'

# المُخرج
even
42/2 = 21 Is true
Hello World

في المثال أعلاه، قمنا بالتّحقّق من أنّ باقي قسمة العدد 42/2 يساوي 0، وبما أنّ الشّرط مُحقّق فقد طبعت الكلمة even وانتقل المُفسّر إلى الشّرط التّالي وهو التّحقّق من أن 42/2 يُساوي 21 وبما أنّه بدوره شرط مُحقّق أيضا فقد قام البرنامج طباعة الجملة 42/2 = 21 Is true وبعدها قام بطباعة الجملة Hello World لأنّها غير مُرتبطة بأي شرط. 
وبطبيعة الحال إذا لم يكن الشّرط الأول محقّقا، فلن ينتقل المُفسّر للشّرط التّالي ولن يقوم بأي شيء حتّى ولو كان الشّرط مُحقّقا.

الحصول على قيم من مستخدم البرنامج

يُمكن أن تطلب من المُستخدم أن يُدخل قيمة معيّنة، ثمّ تسند هذه القيمة إلى مُتغيّر في البرنامج، فمثلا لنقل بأنّك ترغب بالتّرحيب بالمُستخدم، أولا يجب أن تطلب منه أن يُدخل اسمه، بعدها تقوم بطباعة الجملة "Hello, Person"، بحيث تستبدل Person بالقيمة التّي أدخلها المُستخدم، انظر المثال:

>>> person = raw_input('Enter your name: ')
>>> 'Hello ', person

إذا نفّذت البرنامج فسيكون المُخرج كالتّالي:

Enter your name: 

وبعد إدخال اسمي والضّغط على مفتاح ENTER، فإنّ المُخرج سيكون كالتّالي:

Hello Abdelhadi

ما يحدث هو أن البرنامج يأخذ القيمة المُدخلة ويُسندها للمُتغيّر person وبعدها تستطيع أنت أن تطبع المُتغيّر للمُستخدم.

تطبيق

لنطبّق ما تعلّمناه ولننشئ برنامجا بسيطًا لجدولة مُقابلات العمل:

سنطلب من المُستخدم توفير المعلومات التّاليّة: 

  • اسم المُتقدّم 
  • اسم المسؤول عن المُقابلة 
  • وقتُ المُقابلة 

وبعدها سنطبع جملة تحتوي على جميع المعلومات التّي قدّمها المُستخدم، افتح ملفّا باسم interview.py واكتب فيه التّالي:

applicant = raw_input('Enter the applicant name: ')
interviewer = raw_input('Enter the interviewer name: ')
time = raw_input('Enter the appointment time: ')
print interviewer, "will interview", applicant, "at", time

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

جرّب الأمر بنفسك، وأسند القيّم التّي تريد، وانظر إلى النّتيجة، العب بالشّيفرة، أضف مميّزات أخرى كالتّحقّق من أن عُمر المُتقدّم أكبر من 18 عاما مثلا، وتذكّر بأنّ التعلّم بالتّطبيق أفضل من أي طريقة أخرى.

تطبيق عملي: إنشاء برنامج تسجيل دخول بسيط

الآن حان الوقت لنطبّق ما تعلّمناه، ولنقم بكتابة برنامج تسجيل دخول بسيط، ومبدأه كالتّالي: 

  • يُرحب البرنامج بالمُستخدم. 
  • يطلبُ منه معلومات التّسجيل. 
  • يفيد البرنامج المُستخدم بأنّ التّسجيل قد تم بنجاح أو بعكس ذلك. 
  • يطلب البرنامج معلومات الدّخول. 
  • يتحقّق البرنامج من أنّ المعلومات التّي أدخلها صحيحة. 
  • إذا كانت صحيحة، يطبع البرنامج رسالة نجاح. 
  • إذا كانت خاطئة، يطبع البرنامج رسالة فشل. 

المُتغيّرات التّي سنعتمد عليها: 

  • username: اسم المُستخدم 
  • password: كلمة المرور 
  • password_verification: تأكيد كلمة المرور (فقط للتّأكد من أنّ المُستخدم أدخل نفس كلمة المرور وأنّه يتذكّرها دون مشاكل).

أولا جملة التّرحيب:

print 'Hello User, this is a basic sign up/login Program'

ثانيّا لنطلب من المُستخدم توفير قيّم المتغيرّات (username: اسم المُستخدم، password: كلمة المرور، password_verification: تأكيد كلمة المرور):

username = raw_input('Enter your username please: ')
password = raw_input('Enter the your password please: ')
password_verification = raw_input('Verify password: ')

الآن لنتحقق من أنّ كلمة المرور التّي أدخلها المستخدم في البداية هي نفسها التّي أدخلها عند تأكيد كلمة المرور وذلك بمقارنة المتغيّرين password و password_verification فإذا كانا يحملان نفس القيمة فهذا يعني بأنّ التّسجيل ناجح وسنطبع للمُستخدم جملة تفيد بأنّ عملية التّسجيل قد نجحت. أما إذا لم تكن القيم متساوية سنطبع جملة تفيد المستخدم بأنّ كلمة المرور وتأكيدها لا يتوافقان، ويمكن القيام بالأمر بالأسطر الآتية:

if password == password_verification:
    print 'You have been successfully signed up!'
else:
    print 'The password and the password verification don't match! Please try again'

لقد انتهينا الآن من برمجة نظام التّسجيل، ويجب علينا الانتقال إلى الخطوة التّالية وهي مرحلة تسجيل الدّخول. 

بعد طباعة الجملة التّي تفيد بأنّ المستخدم قام بالتّسجيل بنجاح (انظر الشّيفرة أعلاه) سنطلب منه معلومات الولوج وذلك بإدخال اسم مُستخدمه وكلمة المرور، سنعيّن هذه القيم المدخلة حديثا إلى متغيّرين جديدين، وذلك لمقارنتهما مع قيم المتغيّرين القديمين، إذا كانت القيم توافق ما أدخله قبل قليل فسنطبع جملة تفيد بأنّ عمليّة الولوج قد نجحت، إذا لم يكن الأمر كذلك سنطبع جملة تفيد المستخدم بأنّ القيم التّي أدخلها خاطئة ثمّ يتوقّف البرنامج. الآن، لنطوّر الشّيفرة أعلاه وندخل عليها التّعديلات المطلوبة لإجراء عمليّة الولوج:

if password == password_verification:
    print 'You have Successfully Signed up! \n'
    username_sign_in = raw_input('Enter your username please: ')
    password_sign_in = raw_input('Enter your password please: ')
    if username_sign_in == username and password_sign_in == password:
        print 'You have Successfully Signed in!'
    else:
        print 'username or password do not match! Please try again!'
else:
    print 'The password and the password verification do not match! Please try again'

لاحظ استخدام المعامل المنطقي and عند التّحقّق من أنّ اسم المستخدم وكلمة المرور المدخلتان (المخزّنة في المتغيّرين username_sign_in و password_sign_in) توافقان ما تم إدخاله من قبل. العامل and يحرص على أنّ كلا الشّرطين محققان. وبهذا نكون قد انتهينا من البرمجية الصغيرة والبسيطة، وهذه هي الشّيفرة الكاملة:

print 'Hello User, this is a basic sign up/login Program'
username = raw_input('Enter your username please: ')
password = raw_input('Enter the your password please: ')
password_verification = raw_input('Verify password: ')
if password == password_verification:
    print 'You have Successfully Signed up! \n'
    username_sign_in = raw_input('Enter your username please: ')
    password_sign_in = raw_input('Enter your password please: ')
    if username_sign_in == username and password_sign_in == password:
        print 'You have Successfully Signed in!'
    else:
        print 'username or password do not match! Please try again!'
else:
    print 'The password and the password verification do not match! Please try again'

تمارين

تمرين 1

ما مُخرجات البرنامج التّالي:

print 2 < 3 and 3 > 1
print 2 < 3 or 3 > 1
print 2 < 3 or not 3 > 1
print 2 < 3 and not 3 > 1

تمرين 2

ما مُخرجات البرنامج التّالي:

x = 4
y = 5
p = x < y or x < z
print p

تمرين 3

ما مُخرجات البرنامج التّالي:

x = 4
y = 5
p = x < y or x < z
print p

تمرين 4

ماذا سيحدث بعد تنفيذ الشّيفرة التّالية، هل ستحدث أي أخطاء؟ علّل جوابك.

x = 2
if x == 2:
    print x
else:
    print y

تمرين 5

ماذا سيحدث بعد تنفيذ الشّيفرة التّالية، هل ستحدث أي أخطاء؟ علّل جوابك.

x = 2
if x == 2:
    print x
else:
    x +

تمرين 6

هل الإزاحة في البرنامج التّالي صحيحة؟ إذا لم يكن الأمر كذلك، فأصلح الخطأ.

x = 2
if x == 2:
    print x
    if x+1 == 3:
    print 'x+1 = 3'
else:
    print x + 2

مصادر

درس Input and Output للكاتب Dr. Andrew N. Harrington.
كتاب Python Practice Book لكاتبه Anand Chitipothu.



1 شخص أعجب بهذا


تفاعل الأعضاء


مقالة ممتازة..
الجدير بالذكر أنه في الإصدارات القديمة لبايثون (بايثون<2.4) كان يوجد إضافة لـلمعامل =! المعامل: <> الذي يقوم بنفس العمل.
وفي بايثون 3 ألغيت الدالة raw_input() وأبقي على الدالة input() التي أصبحت تقوم بنفس عمل الدالة raw_input().

شارك هذا التعليق


رابط هذا التعليق
شارك على الشبكات الإجتماعية

مقالة ممتازة..
الجدير بالذكر أنه في الإصدارات القديمة لبايثون (بايثون<2.4) كان يوجد إضافة لـلمعامل =! المعامل: <> الذي يقوم بنفس العمل.
وفي بايثون 3 ألغيت الدالة raw_input() وأبقي على الدالة input() التي أصبحت تقوم بنفس عمل الدالة raw_input().

شارك هذا التعليق


رابط هذا التعليق
شارك على الشبكات الإجتماعية

تمرين 1
ما مُخرجات البرنامج التّالي:

اقتباس

 

print 2 < 3 and 3 > 1

True

print 2 < 3 or 3 > 1

True

print 2 < 3 or not 3 > 1

True

print 2 < 3 and not 3 > 1

False

 

:

تمرين 2

ما مُخرجات البرنامج التّالي:

اقتباس

 

x = 4

y = 5

p = x < y or x < z

print p

True

 

تمرين 4

ماذا سيحدث بعد تنفيذ الشّيفرة التّالية، هل ستحدث أي أخطاء؟ علّل جوابك.

اقتباس

 

x = 2
if x == 2:
    print x
else:
    print y

الجواب     :   لايحدث أي خطآ والسبب ان اكس تساو اثنان           2

 

تمرين 5

ماذا سيحدث بعد تنفيذ الشّيفرة التّالية، هل ستحدث أي أخطاء؟ علّل جوابك.

اقتباس

x = 2
if x == 2:
    print x
else:

+  x

الجواب    :          2

تمرين 6

هل الإزاحة في البرنامج التّالي صحيحة؟ إذا لم يكن الأمر كذلك، فأصلح الخطأ.

اقتباس

x = 2
if x == 2:
    print x
    if x+1 == 3:
    print 'x+1 = 3'
else:
   print x + 2

 الجواب : الأزاحه ليست صحيحه ، والخطأ يكمن هناا

if x+1 == 3:
    print 'x+1 = 3'
else:
    print x + 2

 

 

 

 

 

تمّ تعديل بواسطة مدمن

شارك هذا التعليق


رابط هذا التعليق
شارك على الشبكات الإجتماعية


يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن