أغسطس 22، 2009

سلسلة بايثون للمبتدئين - 04

سنتعلم اليوم مجموعة من الأشياء الجديدة بخصوص المتغيرات النصية و القوائم. بالإضافة إلى تعريف القواميس و طريقة إستخدامها.

المتغيرات ككائنات: المتغيرات النصية
لنقم بتعريف المتغيرة msg كما يلي:
msg = "learning python is fun!"

الآن لنقم بتنفيذ:
print msg
النتيجة هي أننا نقوم بعرض محتوى المتغيرة msg و بما أنه سبق و أن تعلمنا (في التدوينة السابقة) أن هذه المتغيرات يمكن أن نتعامل معها ككائنات فسنقوم بإكتشاف بعض وظائفها. لننفد ما يلي:
print msg.upper()
فتكون النتيجة هي:
LEARNING PYTHON IS FUN!
.upper() هي وظيفة تقوم بتحويل حروف الرسالة النصية إلى الأحرف الكبيرة.

ننفد بعدها:
print msg.title()
.title() وظيفة تقوم بتكبير الحرف الأول من كل كلمة لنحصل على رسالة مكتوبة على شكل عنوان.

بعدها قم بعرض محتوى msg من جديد:
print msg
تظهر الرسالة على شكلها الأصلي و لم تتغير أحرفها رغم تنفيذ .upper() أو .title() لماذا؟ لسبين:
1.  .upper() و .title() من الوظائف، و الوظائف تقوم بإرجاع (returns) نتيجة العملية التي قامت بها و لا تغير الأصل.
2. لأن المتغيرة msg هي من النوع str (متغيرة نصية) و هذا النوع يعتبر immutable بمعنى أن قيمته ثابتة أو غير قابلة للتغيير!

ستتساءل ما هذا الهراء؟ متغيرة غير قابلة للتغيير!؟ *o*
صبرك علي حتى أشرح :)
عندما نكتب
msg = "learning python"
يتبادر إلى دهننا أن المتغيرة msg تحتوي/تساوي تلك القيمة "learning python". في الواقع عند بايثون لا. بايثون ينسب مٌعرف المتغيرة msg إلى القيمة و ليس العكس (ينسب القيمة إلى مٌعرف المتغيرة كما نعتقد).
و عندما نقوم بتغيير القيمة من "learning python" إلى "hello python" مثلا:
msg = "hello python"
فما يطرأ هو أنه يتم حجز مكان جديد من الذاكر يكتب فيه "hello python" ثم يُعرف بـ أو ينسب إليه المُعرف msg، و تترك القيمة الأولى في الذاكرة إلى أن يقوم بايثون بكنسها من خلال garbage collector بطريقة تلقائية (لا نتدخل في ذلك كمبرمجين)

هذه هي الطريقة التي يعمل بها بايثون من الداخل و هذا هو معنى immutability (إنعدام قابلية التغيير) في المتغيرات.

هنالك العديد من وظائف التي يمكن إستخدامها مع النوع string و يمكن الإطلاع عليها على موقع التوثيق الخاص ببايثون


المتغيرات ككائنات: القوائم

نقوم بتعريف المتغيرة names كما يلي:
names = ["Wael", "Farid", "Ali", "Jamal"]
عدد العناصر هو 4 و أول عنصر ترتيبه هو 0
print names[0]

إذا أردنا أن نضيف أي عنصر جديد يمكن إستخدام إحدى هذه الطرق:
names = names + ["Karim"]
أو
names += ["Adel"]
أو
names.append("Amal")
أو
names.extend(["Noura"])

طبعا هنالك إختلاف بسيط بينهم من حيث الطريقة التي يتم بها إضافة العنصر/العناصر إلى القائمة، لكن لا تهمنا تلك التفاصيل. الأفضل من حيث السرعة هي names += ["Adel"]

كل تلك الطرق تقوم بإضافة العنصر الجديد إلى آخر القائمة. أما إدا أردنا إضافة عنصر إلى بداية القائمة مثلا يكفي أن نستخدم .insert() كالتالي:
names.insert(0, "Fouad")
.append() .extend() و .insert() كلها وظائف تعمل مع القوائم أو الكائن list

بالنسبة لقابلية التغيير (mutability) فإن قوائم تتغير، أي على عكس المتغيرات النصية string. لنقم بتنفيذ ما يلي:
print names
تقوم بعرض محتوى المتغيرة names بأكمله
names.reverse()
تقوم بعكس رتبة كل عنصر داخل القائمة (الأول يصبح الأخير و الأخير يأخذ مكان الأول)
print names
تقوم بعرض المحتوى من جديد و يظهر جليا التغير الذي طرأ على names. ثم إذا قمنا بتنفيذ الأمر التالي نحصل على قائمة بعناصر مرتبة حسب الترتيب الأبجدي.
names.sort()
print names

هذا كل شيء تقريبا بخصوص المتغيرات النصية و القوائم بإعتبارها ككائنات في هذه السلسلة من التدوينات و يمنك تعلم المزيد من خلال قراءة كتاب بايثون. كل ما تبقى هو جزئية بسيطة بخصوص الحلاقات التسلسلية for و الجمل الشرطية if و طريقة إستخدامها مع القوائم.


قبل أن نكمل هنالك ملاحظة بسيطة: يمكن تعريف و إستخدام قوائم صالحة للقراءة فقط تسمى بـ tuples و يتم تعريفها بإستخدام الأقواس () بدلا من []
speed = (25, 50, 75, 100)
في هذه الحالة نضمن أن تلك القائمة لن تستطيع إكتساب/إضافة عنصر جديد إليها.


القواميس (dictionaries)

القواميس مثلها مثل القوائم تسمح بالإحتفاظ بأكثر من معلومة داخلها، بالإضافة إلى أنها تسمح بالتميز بين كل مجموعة من المعلومات و آخرى من خلال تسميات مفتحية تماما كالقاموس.

المتغيرات/الكائنات على شكل قواميس تتشكل من قسمين القسم الأول يضم القيمة المفتحية و القسم الثاني يضم القيمة أو القيم المعبَر عنها.

و تكتب القواميس بين علامتي {} و يُفصل بين القسمين بعلامة :
مثال:
students = { "id100" : "Youssef", "id120" : "Adel", "id121" : "Noura", "id133" : "Karim" }

في هذا المثال قمنا بتعريف متغيرة على شكل قاموس إسمها students و تضم أربعة عناصر. كل عنصر يضم التسمية المفتحية و قيمتها.
العنصر الأول هو "id100" : "Youssef" تسميته المفتحية هي "id100" و قيمته التي يعبر عنها هي "Youssef"

لعرض محتوى المتغيرة بأكمله ننفد:
print students

لعرض محتوي إحدى التسميات المفتحية، مثلا "id120" ننفد:
print students["id120"]

لعرض كل التسميات المفتحية للمتغيرة students ننفد:
print students.keys()

لعرض كل القيم المتواجدة داخل المتغيرة students ننفد:
print students.values()

لإضافة تسمية مفتحية و قيمتها ننفد:
students["id116"] = "Ayman"
print students

لتعديل أي عنصر "id120" ننفد:
students["id120"] = "Farid"
print students

لحذف أي عنصر "id133" ننفد:
del students["id133"]
print students


القواميس تجعل من التعامل مع المعطيات/المعلومات المركبة أمرا سهلا، و يمكن إعتبارها كنوع من أنواع قواعد البيانات البسيطة.

ملاحظتين بخصوص القواميس:
1. القواميس مثلها مثل القوائم من حيث قابلية التغيير (mutable)
2. القسم الثاني الذي يعبِر عن القيمة يمكن أن يأخذ أي شكل من المتغيرات سواءا كان نصي، عددي، قائمة، كائن، وظيفة أو حتى قاموس آخر.

ليست هناك تعليقات:

إرسال تعليق