تعلم بايثون, لغة الكبار – الفصل (3)

Posted: نوفمبر 18, 2010 in Tech
الوسوم:, , ,

تعلم لغة بايثون

ملاحظة: تتطلب قراءة هذا الفصل معرفة أساسية في البرمجة و تقنياتها.

ما هو الوضع التفاعلي Interactive Mode؟

عندما تقوم بتنصيب بايثون سوف تجد ملفاً تنفيذياً اسمه “python”, و عندما تقوم بتشغيله ستظهر لك واجهة أوامر تفاعلية (Terminal), و ستظهر أيضاً المعلومات التالية:

Python 2.7 (r27:82525, Jul  4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.
>>>

هذا هو الوضع التفاعلي في بايثون, هنا يمكنك كتابة تعليمات بايثون و المفسر سوف يقوم بتنفيذها بشكل فوري, كمثال:

>>> print “I Love Python”
I Love Python
>>> 2**10
1024
>>>

يمكنك كتابة أي تعليمة هنا (حتى لو لم تكن التعليمات على سطر واحد كما سنرى لاحقاً).

ذكرنا سابقاً أن مفسر و مترجم بايثون حاضر دائماً في الذاكرة, لهذا السبب استطعنا تنفيذ التعليمات السابقة فوراً, تقدم لنا هذه الميزة فائدة أخرى وهي أن برنامجك قد يستطيع تنفيذ تعليمات بايثون مكتوبة بواسطة مستخدم البرنامج, هذا ما تفعله بعض البرامج, إنها تمكن المستخدم من تعديل سلوك البرنامج نفسه بإضافة تعليماته الخاصة (الكود الخاص به) ضمن البرنامج.

لتنفيذ هذه المهمة نستخدم تعليمة exec :

>>> exec “print \”I Love Python\”"
I Love Python
>>>

هنا قمنا باستدعاء التابع exec, والذي يأخذ معامل (parameter) نصي String, يحوي هذا المعامل كود بايثون و المفسر سوف يقوم بتنفيذه, ولذلك بإمكانك -وبكل سهولة- استقبال تعليمات بايثون -في برنامجك – من المستخدم و القيام بتنفيذها من أجله, هذا التابع متوفر أينما كتبت بلغة بايثون (وليس فقط في الوضع التفاعلي), يمكنك ملاحظة استخدام مفاتيح الهروب Escape Characters (“\) ضمن المعامل و ذلك ليعلم المفسر أن هذه العلامة (“) هي ليست نهاية المعامل (أي الكود المراد تنفيذه), هناك ميزة أخرى في الوضع التفاعلي, وهي أننا لسنا مضطرون لكتابة Print عند كل تعليمة, يمكننا تنفيذ التعليمات بلا Print من دون أية أخطاء:

>>> “I Love Python”
‘I Love Python’
>>>

ولكن عليك الانتباه! يجب استخدام print في أي وضع آخر (في ما عدا الوضع التفاعلي), ذلك لأن الوضع التفاعلي تم تصميمه منذ البداية لإظهار النتائج بشكل فوري.

في هذا السياق, يمكن للقارئ أن يسأل, ماذا لو تم تنفيذ تعليمة لا تعيد أي نتائج ضمن الوضع التفاعلي؟

الجواب ببساطة: لا تظهر أية نتائج, كمثال لدينا تعليمة الإسناد:

>>> text = “I Love Python”
>>>

في هذه التعليمة تم اسناد القيمة النصية “I Love Python” للمتحول text.

للخروج من الوضع التفاعلي يجب عليك الضغط على مفتاح الخروج Break Character, (وهي Ctrl+Z في Windows و Ctrl+D في Linux), ومن ثم الضغط على Return.

ما هي الوحدات Modules؟

لنتكلم عن بنية (هرمية) برنامج بايثون بشكل عام:

كل برنامج يتكون من وحدات Modules -> كل وحدة تتكون من مجموعة من التعليمات Statements -> كل تعليمة تتألف من مجموعة من التعابير Expressions -> كل تعبير ينشأ و يعالج مجموعة من الأغراض Objects -> الأغراض هي المواد الخام التي ستستعملها.

عندما تكتب برنامجاً بلغة بايثون, فإنك تكتبة بعدة ملفات, عادةً تسمى هذه الملفات وحدات Modules, الوحدات هي فضاءات أسماء Namespaces, ولذلك كل وحدة لها متحولاتها Variables, و توابعها – أو نسميها طرائقها Methods – الخاصة, يمكنك أن تنشأ متحولين بنفس الاسم, ولكن يجب أن تضع كل واحد منهما بوحدة.

الآن سوف نستخدم الوحدات لتشغيل الكود الذي سنكتبه, من عدة أماكن دون الحاجة  لكتابته مرة أخرى, يمكنك استخدام وحدة ما عن طريق تعليمة “Import”, دعنا نجرب ما يلي:

  • افتح المحرر الخاص بك و اكتب ما يلي :
    text = "I Love Python"
     print text
    
  • احفظ الملف في أي مكان و سمه “module1.py”
  • انشأ ملفاً جديداً و اكتب التالي فيه:
    import module1
     module1.text = "You Know I Love Python"
     print module1.text
    
  • احفظ الملف بنفس المكان و سمه “module2.py”
  • الآن دع مفسر بايثون يشغل الملف module2.py.
  • يجب أن ترى التالي: 

    I Love Python
    You Know I Love Python

ما الذي حدث للتو؟ في module2 قمنا فقط بتعديل المتحول text و طباعته و لكنه طبع قبل التعديل فما الذي حدث؟؟

الحقيقة أنه عندما يتم استيراد (Import) وحدة معينة فإنه يتم تنفيذها, لهذا السبب قام مفسر بايثون بتنفيذ module1 فرأيت I Love Python, و بعدها قام بتنفيذ Module2 فرأيت You Know I Love Python.

ولكن ماذا لو أردنا تنفيذ Module1 مرة أخرى؟ لا يمكننا استيراد المكتبة مرة أخرى لتنفيذها و لذلك لدينا التعليمة Reload التي تأخذ اسم الوحدة كمعامل و تقوم بتنفيذها مرة أخرى شرط أن تكون قد تم استيرادها من قبل في البرنامج.

جرب اضافة هذا السطر إلى الملف module2.py:


reload(module1)

أعد تشغيل module2  و سوف ترى:

I Love Python
You Know I Love Python
I Love Python

السطر الثالث هو في الحقيقة نتيجة تنفيذ تابع Print في الملف module1.

ما الفرق بين “import MODULE” و “from MODULE import”؟

في الحالة الأولى – import MODULE – يتم استدعاء الوحدة و تنفيذها, ولكن عندما تقوم بالوصول إلى متحولاتها الداخلية يجب أن تسبق اسم المتحول باسم الوحدة و من ثم نقطة, كما يلي (MODULE.VARIABLE).

أما في الحالة الثانية – from MODULE import – فإنه يتم استدعاء متحولات معينة من الوحدة (أي يجب تحديد المتحول الذي يتم استدعاؤه), ولذلك فإن استدعاء المتحول text من الوحدة MODULE يجب أن يكتب كما يلي:

from MODULE import text

ولاستدعاء عدة متحولات بتعليمة واحدة نقوم بذكر جميع المتحولات مفصولة بفاصلة كما يلي:

from MODULE import VAR1, VAR2, ... , VARn

والجدير بالذكر هنا أنه عند استدعاء المتحولات بهذه الطريقة يمكننا من استخدام تلك المتحولات من دون الحاجة لإضافة اسم الوحدة – التي ينتمي لها المتحول – قبل اسمها, يمكنك ببساطة استخدام المتحول text بمجرد كتابة اسمه.

ولكن يجب الانتباه إلى أن استدعاء متحول يحوي اسم مطابق لإسم متحول محلي يسبب استبدال المتحول المحلي بالمتحول المستدعى, كمثال على ذلك:

اكتب في الوحدة module1.py:

text = "You Know I Love Python"

وفي الوحدة module2.py:

text = "You Know I Love Python"
 from module1 import text
 print text

عند تنفيذ module2.py يجب أن يظهر:

I Love Python.

كيف أكتب ملاحظات (تعليقات) ضمن كود بايثون؟

بوضع المحرف ‘#’, حيث تعتبر العبارات ملاحظات من المحرف السابق إلى نهاية السطر, مثال:

text = "I Love Python" #a declaration of a variable named text

كلمة أخيرة

سوف نرى في الفصل القادم كيفية التعامل مع الأنماط مسبقة التعريف Built-in Types في بايثون, حتى ذلك الوقت عزيزي القارئ, حاول أن تستخدم تعليمات استدعاء الوحدات و أن تقوم ببعض الأخطاء لترى ماذا سيحدث, يمكنك أن تجرب التقسيم على صفر مثلا.

يمكنك الرجوع إلى الموضوع الأصلي باللغة الإنكليزية عبر هذا الرابط.

و إلى اللقاء في الفصل القادم. :)

اترك رد

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / تغيير )

Twitter picture

You are commenting using your Twitter account. Log Out / تغيير )

Facebook photo

You are commenting using your Facebook account. Log Out / تغيير )

Connecting to %s