Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
AhmadAlsaadi
GitHub Repository: AhmadAlsaadi/Arabic-python-notebook
Path: blob/master/الفصل الثالث-التعامل مع البيانات التجميعية.ipynb
675 views
Kernel: Python 3 (ipykernel)
import style style._set_css_style("custom.css")

الفصل الثالث : التعامل مع البيانات التجميعة Collection Data


في الفصل السابق تعلمنا كيفية التعامل مع البيانات الأساسية وكان كل بيان من تلك البيانات يمثل معلومة مستقلة بذاتها. اما في هذا الفصل فسوف نوسع مفهوم البيانات الى نطاق أوسع بحيث يتم ترتيب هذه البيانات الأساسية بطريقة خاصة في مجموعات فتصبح هذه البيانات مستقلة بذاتها.

أهداف الفصل

عند اتمام هذا الفصل يجب ان يكون لديك المام بالآتي:

  • التعرف على البيانات التجمعية وأنواعها الرئيسية.

  • معرفة التعامل مع الانواع الأساسية للبيانات التجميعية.

  • التمييز بين الانواع الأساسية للبيانات التجميعية من خلال معرفة خصائص كل نوع.

  • التوسع في معرفة البيانات النصية وكيفية التعامل معها.

تعريف البيانات التحميعية

المقصود بالبيانات التجميعية في لغة بايثون هي بيانات أساسية (سواء كانت عددية او نصية او منطقية) اندرجت تحت مجموعة لها خصائص معينه ومحددة فأصبحت بيانات مستقلة بذاتها يتعامل معها مفسر بايثون بطريقة خاصة. وتنقسم هذه البيانات التجميعية الى أربعة أنواع رئيسية:
  • القوائم (lists)

  • الصفوف (tuples)

  • القواميس (dictionaries)

  • المجموعات (sets)

القوائم Lists

القوائم في لغة بايثون هي عبارة عن مجموعة من بيانات مختلطة توضع بين قوسين مربعين ويفصل بين كل بيان وآخر بفاصلة كما في المثال التالي:

data=['Ahmad', 2019, True, 23.5]
فالبيانات "المختلطة" في هذا التعريف تشير الى ان القوائم يمكن ان تحتوي على اكثر من نوع من البيانات فالقائمة في المثال السابق احتوت على بيانات نصية وبيانات عددية وبيانات منطقية. وتعتبر القوائم وسيلة مؤقتة لتخزين البيانات تهدف الى تسهيل التعامل مع البيانات متى ما اردنا معالجتها او تحليلها.

أنشاء القوائم

بالاضافة الى الطريقة التي السابقة التي اتبعناها في إنشاء القائمة data هناك طريقة اخرى تعتمد على استخدام الدالة ()list. فمثلا يمكن إنشاء قائمة من نص باستخدام الدالة ()list كما في المثال التالي:

list("hello python")
['h', 'e', 'l', 'l', 'o', ' ', 'p', 'y', 't', 'h', 'o', 'n']
ويمكن استخدام الدالة ذاتها لانشاء قائمة فارغة وذلك بعدم اعطاء الدالة ()list اي قيمة بين قوسيها كما في المثال التالي:
mylist=list() mylist
[]
كما يمكن انشاء قائمة فارغة بطريقة اسهل من الدالة السابقة وذلك باستخدام قوسين مربعين فارغين بعد اسم المتغير كما في المثال التالي:
mylist2=[] mylist2
[]

مؤشر القوئم List index

يتم الإشارة الى مكان البيانات في القائمة بارقام صحيحة تسمى مؤشر القائمة List Index تبدأ من اليسار بالقيمة صفر وتتزايد بالقيمة 1. فالقائمة data السابقة يشار الى القيمة الأولى فيها بالرقم 0 والقيمة الثانية بالرقم 1 وهكذا الى نهاية القيم في القائمة كما هو موضح في الجدول التالي.

مؤشر القائمة القيمة 0 "Ahmad 1 1990 2 True 3 23.5

وللحصول على قيمة معينة من قائمة فإننا نقوم بكتابة اسم القائمة متبوعاً بقوسين مربعين يوضع بينهما رقم مؤشر القائمة. فعلى سبيل المثال عندما نريد القيمة الأولى من قائمة data السابقة فإننا نكتب الكود التالي:

data[0]
'Ahmad'

وعندما نريد القيمة الثالثة مثلاً فإننا نكتب الكود التالي:

data[2]
True

كما يمكن الإشارة إلى القيم في قائمة من اليمين إلى اليسار أيضاً أي بمعنى آخر من آخر قيمة في القائمة. وللقيام بذلك نقوم باستخدم مؤشر قائمة يبدأ من القيمة 1- ويتناقص بالقيمة 1- كما هو موضح في الجدول التالي:

مؤشر القائمة القيمة -4 "Ahmad -3 1990 -2 True -1 23.5

فللحصول على آخر قيمة في القائمة data السابقة نكتب الكود التالي:

data[-1]
23.5

وللحصول على القيمة قبل الأخيرة في قائمة فإننا نستخدم المؤشر 2- داخل القوسين المربعين و 3- للقيمة التي بعدها وهكذا لباقي القيم في القائمة.

data[-2]
True
data[-3]
2019

العمليات على القوائم

لإضافة بيانات لقائمة قارغة أو قائمة تحتوي على بيانات سابقة يمكن استخدام الدالة ()append بحيث يكون البيان المضاف دائما في آخر القائمة كما في المثال التالي:

list1=[] list1.append('Sunday') list1.append('Monday') list1.append('Tuesday') list1
['Sunday', 'Monday', 'Tuesday']

لاحظ استخدام النقطة بعد اسم القائمة لتنفيذ الدالة. فهي تعنى قم بإضافة القيمة "Sunday" مثلاً لللقائمة list1.

كما يمكننا أن نغير قيم البيانات داخل قائمة باستخدام معامل الإسناد (=) كما في المثال التالي:

Ahmad=5 list2=[Ahmad,1990,True,23.5] list2[0]="Omar" list2
['Omar', 1990, True, 23.5]

لذلك يطلق على القوائم في بايثون مصطلح mutable أي قابلة للتغيير.

ولمعرفة مؤشر بيان ما داخل قائمة فإننا نستخدم الدالة ()index بحيث نضع البيان المراد معرفة مؤشره داخل قوسي الدالة كما في المثال التالي:

list2=["Ahmad",1990,True,23.5] list2.index(1990)

ولمعرفة عدد البيانات في قائمة فإننا نستخدم الدالة ()len كما في المثال التالي:

list2=['Ahmad', 1990, 'Hello', True, 23.5] len(list2)
في مثال سابق تعلمنا كيف نضيف بيان الى قائمة باستخدام الامر ()append وعلمنا ان هذا الامر يقوم بإضافة البيان الى اخر القائمة. لكن ماذا لو أردنا ان نضيف بياناً في مكان معين من قائمة. لأداء هذه المهمة نستخدم الامر ()insert وكيفية استخدام هذا الامر يتطلب أولا ادخال مؤشر البيان داخل القائمة التي سوف يحتلها البيان المراد إدخاله ومن ثم قيمة البيان كما هو موضح في المثال التالي:
list2=['Ahmad', 1990, True, 23.5] list2.insert(2,"Hello") list2
ولإزالة بيان من قائمة فان هناك عدة دوال تساعدنا على القيام بذلك بطرق مختلفة. فعندما نريد إزالة اخر بيان في قائمة فإننا نستخدم الدالة ()pop كما في المثال التالي:
list2=['Ahmad', 1990, 'Hello', True, 23.5] item_removed=list2.pop() print(list2) print(item_removed)
['Ahmad', 1990, 'Hello', True] 23.5
هنا الدالة ()pop قامت بحذف اخر بيان من القائمة وارجعت البيان الذي تم حذفه بحيث اصبح بإمكاننا اسناد ما تم حذفه الى متغير كما فعلنا في المثال السابق. فالقيمة التي تم حذفها تم اسنادها الى المتغير item_remove والذي قمنا بطباعة قيمته في اخر سطر من البرنامج السابق.
وكذلك يمكن إزالة عنصر معين من القائمة باستخدام الدالة ()remove وذلك بتحديد البيان المراد حذفه كما في المثال التالي:
list2=['Ahmad', 1990, 'Hello'] item_removed=list2.remove("Ahmad") print(list2) print(item_removed)
[1990, 'Hello'] None
لاحظ ان الدالة ()remove لم تقم بارجاع البيان الذي تم حذفه كما هو الحال مع الدلة ()pop. فالقيمة None تعنى ان الدالة ()remove لم تقم بارجاع اي شيئ وانما اكتفت فقط بحذف العنصر المراد حذفه من القائمة.
كما انه بالإمكان استخدام الامر del لإزالة البيان المراد كما في المثال التالي:
list2=['Ahmad', 1990, 'Hello', True, 23.5] del list2[1] list2
['Ahmad', 'Hello', True, 23.5]
وأخيرا يمكن افراغ القائمة من البيانات بالكامل باستخدام الدالة ()clear بعد اسم القائمة كما في المثال التالي:
list2=['Ahmad', 'Hello', True, 23.5] list2.clear() list2
يجب ملاحظة ان القائمة تسمح بتكرار العناصر بمعنى انه يمكن تخزين نفس البيان في قائمة اكثر من مرة كما في المثال التالي:
greatings=["hello","hello","hello"] greatings
ولمعرفة عدد العناصر المكررة في قائمة نستخدم الدالة ()count بعد تحديد البيان المراد معرفة عدد مرات تكراره كما في المثال التالي:
greatings=['hello', 'hello', 'hello', 'Hi', 'Hi'] greatings.count("hello")
greatings=['hello', 'hello', 'hello', 'Hi', 'Hi'] greatings.count("Hi")
greatings=['hello', 'hello', 'hello', 'Hi', 'Hi'] greatings.count("bye")
في مثال سابق تعلمنا كيف نستخدم الدالة ()append لإضافة بيان واحد الى اخر القائمة. ولان نريد ان نوسع معرفتنا بهذه الدالة ونتعرف على ان هذه الدالة باستطاعتها إضافة قائمة الى اخر القائمة بحيث تظهر القائمة كقائمة جزئية داخل قائمة رئيسية كما في المثال التالي:
numbers=[1,2,3,4] numbers.append(['a','b','c']) numbers
لاحظ ان القائمة الرئيسية هي القائمة التي تسبق ()append والقائمة الفرعية هي التي بداخل قوسي ()append. لكن ماذا لو أردنا ان ندمج عناصر القائمة الفرعية مع عناصر القائمة الرئيسية بحيث تصبح كأنها قائمة رئيسية واحدة. للقيام بذلك يمكننا استخدام علامة الجمع بين القائمتين كما في المثال التالي:
numbers=[1, 2, 3, 4] list3=numbers+['a','b','c'] list3
numbers=[1, 2, 3, 4] list3=['a','b','c']+numbers list3
لاحظ ان ترتيب البيانات يعتمد على الطريقة التي تمت بها عملية الجمع السابقة.
كما يمكننا ان نستخدم الدالة ()extend لأداء نفس المهمة بحيث نضع القائمة الفرعية المراد دمجها داخل قوسي الدالة كما في المثال التالي:
numbers=[1,2,3,4] numbers.extend(['a','b','c']) numbers
يمكن اجراء عملية ضرب على قائمة فتكون النتيجة كالتالي:
[1,2,3]*4
لاحظ ان عملية الضرب هنا هي مجرد تكرار للبيانات داخل القائمة.
ويمكن عكس ترتيب البيانات في قائمة باستخدام الدالة ()reverse كما في المثال التالي:
numbers=[1, 2, 3, 4, 'a', 'b', 'c'] numbers.reverse() numbers
ولإعادة ترتيب البيانات داخل قائمة فإننا نستخدم الدالة ()sort بحيث تقوم هذه الدالة بترتيب البيانات تصاعديا بشكل تلقائي على حسب ترتيب الحروف الابجدية كما في المثال التالي:
cars = ['Ford', 'BMW', 'Volvo'] cars.sort() cars
او ترتيبها تصاعديا بحسب قيم الاعداد التي بداخلها كما في المثال التالي:
num=[1,89,3,8,24] num.sort() num
[1, 3, 8, 24, 89]
لاحظ ان في المثال السابق تم اعادة ترتيب البيانات على نفس القائمة الاصلية cars و num. ولاجراء عملية اعادة الترتيب في قائمة جديدة بحيث تبقى القائمة الاصلية كما هي نستخدم الدالة ()sorted كما في المثال التالي:
cars=["Ford","BMW","Volvo"] print(sorted(cars)) print(cars)
['BMW', 'Ford', 'Volvo'] ['Ford', 'BMW', 'Volvo']
num=[1,89,3,8,24] print(sorted(num)) print(num)
[1, 3, 8, 24, 89] [1, 89, 3, 8, 24]
ولعكس الترتيب بحيث يكون تنازليا نستخدم الخيار reverse=True داخل قوسي الدالتين السابقتين كما في المثالين التاليين:
cars = ['Ford', 'BMW', 'Volvo'] cars.sort(reverse=True) cars
cars = ['Ford', 'BMW', 'Volvo'] cars2=sorted(cars,reverse=True) cars2
ويمكن أيضا تحدد طريقة الترتيب بحسب الكيفية التي نرغب بها ولكن هذه الخاصية متقدمة قليلا ولا نستطيع الحديث عنها هنا الان.
ولمعرفة ما اذا كان بيان معين موجود في قائمة فإننا نستخدم in بين البيان المراد البحث عنه واسم القائمة ليكون معنى التركيب اللغوي "هل البيان x موجود في القائمة y" فيكون ناتج العملية اما بصح True او خطأ False كما في المثال التالي:
colors=['green','red','blue'] 'green' in colors
colors=['green','red','blue'] 'yellow' in colors
ولعمل نسخه من القائمة نستخدم الدالة ()copy كما في المثال التالي:
cars = ['Ford', 'BMW', 'Volvo'] cars2=cars.copy() cars2
قد يتبادر الى الاذهان ان عملية النسخ باستخدام الدالة ()copy غير ضرورية لان اجراء عملية اسناد قائمة لمتغير جديد سوف تفي بالغرض كما في المثال التالي:
cars = ['Ford', 'BMW', 'Volvo'] cars2=cars cars2
لكن في حقيقة الامر هناك اختلاف جوهري بين استخدام الدالة ()copy وعملية الاسناد. فعملية الاسناد لا تعني تكوين قائمة مستقلة عن القائمة الاولى. بل ان اجراء أي تغيير في أي متغير سوف يؤثر على القائمة الاخرى كما في المثال التالي:
cars = ['Ford', 'BMW', 'Volvo'] cars2=cars # عملية الاسناد الى متغير جديد cars.append("GMC") print(cars) print(cars2)
لاحظ انه عند إضافة بيان الى القائمة cars تم احداث نفس التغيير في المتغير cars2 ايضاً. وذلك لأنه في حقيقة الامر لا يوجد قائمتين في ذاكرة الكمبيوتر أصلا. ان ذاكرة الكمبيوتر تحتفظ بقائمة واحدة فقط وعملية الاسناد قامت فقط بتكوين متغير يشير الى نفس القائمة كما في الشكل التالي:

اما عملية النسخ بالدالة ()copy فانها تقوم بإنشاء قائمة مستقلة عن القائمة الاولى في داكرة الكمبيوتر كما في الشكل التالي:

اعادة كتابة المثال السابق باستخدام الدالة ()copy يثبت صحة هذه المعلومة كما يلي:
cars = ['Ford', 'BMW', 'Volvo'] cars2=cars.copy() # عمل نسخة من القائمة cars.append("GMC") print(cars) print(cars2)
لذلك عند اجراء تغيير على القائمة التي نسخت بالدالة ()copy فان هذا التغيير لا يؤثر على القائمة الاصلية والعكس صحيح اي ان التغيير في القائمة الاصلية بعد عملية النسخ لا يؤثر على القائمة المنسوخة كما في المثال التالي:
cars = ['Ford', 'BMW', 'Volvo'] cars2=cars.copy() # عملية النسخ cars.append([1,2,3]) # عملية التغيير على القائمة الاصلية print(cars) print(cars2)
ويمكن الحصول على نفس وظيفة النسخ بالدالة ()copy باستخدام دالة تعريف القائمة ()list التي ذكرناها في بداية الفصل كما في المثال التالي:
numbers=[1,2,3,4] numbers2=list(numbers) numbers2.pop() print(numbers) print(numbers2)

تجزئة القوائم List Slicing

ويمكن تجزئة قائمة (list slicing) الى قوائم أصغر بعدة طرق. فمثلا اذا اردنا اخذ الثلاثة البيانات الاولى من القائمة
[ ‘a’ , ’b’ , ’c’ , ’d’ , ’e’ , ’f’’ , ’g’ ] فإننا نقوم بالتالي:
letters=['a','b','c','d','e','f','g'] letters[0:3]
ما قمنا به في المثال السابق هو اننا استخدمنا مؤشر البيان الذي نريد ان تبتدأ به القائمة الجزئية داخل قوسين مربعين ثم وضعنا نقطتين فوق بعض (:) ثم وضعنا مؤشر آخر بيان لا نريد ان يكون في القائمة الجزئية. ففي المثال السابق اول بيان نريده في القائمة الجزئية هو ‘a’ ومؤشره 0 وآخر بيان لا نريده ان يكون في القائمة الجزئية هو ‘d’ ومؤشره هو 3 . لذلك حصلنا على القائمة الجزئية [ ‘a’ , ’b’ , ’c’ ] . ويكمن الحصول على نفس المهمة بترك مؤشر البيان الذي سوف تبتدأ به القائمة الجزئية فارغ لأن مفسر بايثون سوف يفترض انك تريد ان تبتدأ القائمة الجزئية من بداية القائمة الرئيسية كما في المثال التالي:
letters=['a','b','c','d','e','f','g'] letters[:3]
وللحصول على قائمة جزئية تبتدأ مثلاً من الحرف ‘e’ وتنتهي بآخر بيان في القائمة السابقة نكتفي بتحديد مؤشر العدد الذي نريد ان تبتدأ به القائمة الجزئية ونترك المؤشر الاخر فارغ لأن مفسر بايثون يفترض انك تريد بقية البيانات في القائمة الرئيسية كما في المثال التالي:
letters=['a','b','c','d','e','f','g'] letters[4:]
['e', 'f', 'g']
كما يمكن فك القائمة الى متغيرات اعتيادية باسخدام متغير واحد لكل بيان موجود في القائمة كما في المثال التالي:
numbers=[1,2,3] a,b,c=numbers print(a) print(b) print(c)
في حال استخدامنا لمتغيرات اقل او اكثر من عدد البيانات الموجودة في القائمة فان مفسر بايثون يعطينا رسالة بوجود خطا في الكود البرمجي يفيد بأن عدد القيم في القائمة اكثر او اقل من عدد المتغيرات المعطى كما في المثاليين التاليين:
numbers=[1,2,3] a,b=numbers
numbers=[1,2] a,b,c = numbers
يمكن تلافي اخطاء الفك السابقة باستخدام علامة النجمة قبل المتغير الاخير كما في المثال التالي:
numbers=[1,2,3] a,*b=numbers print(a) print(b)
على الرغم من ان عدد البيانات في القائمة اكثر من عدد المتغيرات المعطاه في المثال السابق الا ان استخدام النجمة قبل المتغير b اعطى تعليمات لمفسر بايثون بان يسند كل ما تبقى من بيانات في القائمة للمتغير b فتكون لدينا قائمة مكونه عنصرين اسندت للتمتغير b بينما تم فك البيان الاول وتم اسناده للمتغير a.
في الحالة التي يكون فيها عدد المتغيرات اكثر من عدد البيانات الموجودة في قائمة فان استخدام النجمة مع المتغير c يعطى تعليمات الى مفسر بايثون بان يضع كل ما تبقى من بيانات في هذا المتغير. وبما ان عمليه الفك لا تبقى شي للمتغير c فان مفسر بايثون سوف يسند للمغير c قائمة فارغة كما في المثال التالي:
numbers=[1,2] a,b,*c=numbers print(a) print(b) print(c)
1 2 []

أنشطة استكشافية

١-استكشف ماذا ينتج عن استخدام [:]letters للقائمة السابقة؟
letters=['a','b','c','d','e','f','g'] ## اكتب الحل هنا
٢- استكشف ماذا ينتج عن استخدام letters[2:-2] للقائمة السابقة؟
letters=['a','b','c','d','e','f','g'] ## اكتب الحل هنا
٣-استكشف ماذا ينتج عن استخدام [::]letters للقائمة السابقة باسناد الناتج الى المتغير letters2 وتعرف على ما اذا كانت عملية التجزئة تقوم بعملية التغيير على نفس القائمة الاصلية ام انها تقوم بعمل نسخة مستقلة عنها؟
letters=['a','b','c','d','e','f','g'] ## اكتب الحل هنا
٤-استكشف ماذا ينتج عن استخدام letters[::-1] للقائمة السابقة؟ حاول تتذكر أي دالة من الدوال التي تعلمناها سابقا تقوم بنفس المهمة؟
letters=['a','b','c','d','e','f','g'] ## اكتب الحل هنا
٥-استكشف ماذا ينتج عن استخدام letters[::1] للقائمة السابقة؟
letters=['a','b','c','d','e','f','g'] ## اكتب الحل هنا
٦-استكشف ماذا ينتج عن استخدام letters[::2] للقائمة السابقة؟
letters=['a','b','c','d','e','f','g'] ## اكتب الحل هنا
7-استكشف كيف يتم فك القائمة letters السابقة الى ثلاث متغيرات المتغير الاول يشير القيمة الاولى من القائمة والمتغير الثاني يشير الى كل عناصر القائمة ماعد القيمة الاخيرة والمتغير الثالث يشير الى آخر قيمة في القائمة ؟
letters=['a','b','c','d','e','f','g'] ## اكتب الحل هنا
8-جرب استخدام الامر ()dir واضعا بين قوسيه اسما لقائمة و تعرف على الدوال التي يمكن استخدامها مع هذه القائمة؟
## اكتب الحل هنا

الصفوف (tuples)

الصفوف في لغة بايثون هي عبارة عن مجموعة من البيانات غير قابلة للتغيير توضع بين قوسين منحنيين يفصل بين كل بيان وآخر بفاصلة ويشار اليها بمتغير واحد كما في المثال التالي:
fruits=("banana","orange","apple") numbers=(1,2,3,4) values=(True,False,False,True)
حتى لو لم نكتب القوسين المنحنيين عند كتابتنا للبيانات التي تم فصلها عن بعض بفاصله فان مفسر بايثون سوف يفترض انك تريد كتابة صف من البيانات ويظهر لك النتيجة بقوسين منحنيين كما في المثال التالي:
colors='blue','red','orange' colors
ويمكن انشاء صف من قائمة باستخدام الدالة ()tuple و قائمة من صف باستخدام الدالة ()list كما في المثالين التاليين:
colors=["red","yellow","blue"] mytuple=tuple(colors) type(mytuple)
numbers=(1,2,3,4) mylist=list(numbers) type(mylist)
كما يجب ملاحظة ان كتابة صف من بيان واحد لا يمكن القيام به الا بعد ان نضيف فاصلة بعد البيان سواء استخدمنا القوسين او لم نستخدمها وذلك لان مفسر بايثون سوف يعتقد ان المبرمج يريد تكوين متغير اعتيادي وليس صف كما في المثال التالي:
colors="blue" numbers=(1) print(type(colors)) print(type(numbers))
colors="blue", numbers=(1,) print(type(colors)) print(type(numbers))
وللحصول على صف فارغ يمكننا ان نستخدم الطريقة التالية:
houses=()
وكما هو الحال في القوائم فان البيانات في الصفوف يتم الحصول عليها بتحديد مؤشر البيان داخل قوسين مربعين بعد اسم متغير الصف كما في المثال التالي:
fruits=("banana","orange","apple") fruits[0]
fruits[2]
وكذلك عملية تجزئة الصفوف تتم بنفس الطريقة التي تعلمناها في تجزئة القوائم كما في المثال التالي:
colors=('red','green','blue','yellow','orange') colors[2:4]
colors[:4]
colors[:]
وكذلك عملية الجمع والضرب بين صفين تتم بنفس الطريقة التي تعلمناها مع القوائم كما في المثال التالي:
colors=('red','green','blue','yellow','orange') colors+(1,2,3)
letters=('a','b','c') letters*3
بشكل مشابه للقوائم يمكن معرفة عدد البيانات في صف باستخدام الدالة len() كما في المثال التالي:
colors=('red','green','blue','yellow','orange') len(colors)
وللسؤال عما إذا كان بيان ما موجود في صف فإننا نتبع نفس الطريقة المستخدمة مع القوائم باستخدام in كما في المثال التالي:
colors=('red','green','blue','yellow','orange') 'blue' in colors
'pink' in colors
من خلال ماسبق لاحظت ان الصفوف تشبه القوائم بشكل كبير ولكن هناك فرق جوهري بين الاثنين وهو ان البيانات في الصفوف لا يمكن تغييرها ولو حاولنا ذلك نجد ان مفسر بايثون يعطينا رسالة بوجود خطأ مفاده ان الصفوف غير قابلة للتغيير immutable كما في المثال التالي:
fruits=("banana","orange","apple") fruits[0]="grapes"
يتم التعامل مع فك الصفوف الى متغيرات بنفس الطريقة التى تعلمناها فيما يخص القوائم كما في الامثلة التالية:
numbers=(1,2,3,4) a,*b=numbers print(a) print(b)
numbers=(1,2) a,b,*c=numbers print(a) print(b) print(c)
numbers=(1,2,3,4,5,6) a,*b,c=numbers print(a) print(b) print(c)

أنشطة استكشافية

١-حاول ان تستخدم احد الدوال التي استخدمناها مع القوائم لاحداث تغيير على صف كاستخدام الدالة ()remove او ()append مثلا ماذا تلاحظ ولماذا؟
٢-حاول ان تستخدم الدوال التي لا تحدث تعديلا على بيانات الصف كالدالة ()count و الدالة ()index ماذا تلاحظ؟
٣-جرب استخدام الامر del على صف ماذا تلاحظ؟
٤-جرب استخدام الامر ()dir واضعا بين قوسيه اسما لصف و تعرف على الدوال التي يمكن استخدامها مع الصف؟

القواميس(dictionaries)

القواميس عبارة عن مجموعة من البيانات توضع بين قوسين متعرجين ويفصل بين كل بيان واخر بفاصلة بحيث يتكون كل بيان من جزأين. الجزء الاول يسمى المفتاح (key) والجزء الاخر يسمى القيمة (value) ويفصل بين المفتاح والقيمة بنقطتين فوق بعض كما في المثال التالي:
info={'name':'Hassan','Age':22,'Job':'student'}
المفتاح في القاموس يجب ان يكون مميزا عن غيره من المفاتيح وإذا حاولنا كتابة قاموس يحتوي على مفتاحين متشابهين فان القيمة الاولى سوف يتم حذفها وتبقى القيمة الأخيرة داخل القاموس كما في المثال التالي:
info={'name':'Ali','Age':22,'Job':'student','name':'Waleed'} info
اما قيم القاموس فيمكن ان تتشابه ولا يعترض مفسر بايثون على تشابه القيم طالما المفاتيح مختلفة كما في المثال التالي:
example={1:'odd',2:'even',3:'odd'} example
مفاتيح القاموس يجب ان تكون بيانات غير قابلة للتغير فيمكن ان تكون نصا او رقما او صفا ولكن لا يمكن ان تكون قائمة كما في المثال التالي:
keys_types={23:'number','Hello':'string',(1,2,3):'tuples'} keys_types
list_dict={[1,2]:'list'}
لاحظ انه عندما استخدمنا القائمة كمفتاح في القاموس اظهر لنا مفسر بايثون رسالة بوجود خطأ من النوع TypeError والذي يفيد بوجود خطأ في نوعية البيانات المستخدمة. ويمكن كتابة قاموس فارغ بإحدى الطريقتين التاليتين:
info={}
info2=dict()
ويمكن الحصول على قيمة لمفتاح ما في قاموس باستخدام قوسين مربعين توضع بعد اسم القاموس ويكتب داخلها اسم المفتاح كما في المثال التالي:
info={'name':'Ahmad','Age':22,'Job':'student'} info['Age']
info["name"]
وعند استخدام التركيب اللغوي السابق للحصول على قيمة مفتاح غير موجود في القاموس فان محرر بايثون يعطينا رسالة بوجود خطأ من النوع KeyError كما في المثال التالي:
info={'name':'Ahmad','Age':22,'Job':'student'} info['birth_date']
ويمكن استخدام الدالة ()get للحصول على قيمة مفتاح في قاموس كما في المثال التالي:
info={'name':'Ahmad','Age':22,'Job':'student'} info.get('name')
الفرق بين استخدام القوسين المربعين واستخدام الدالة ()get في الحصول على قيمة مفتاح في قاموس هو ان الدالة ()get لا تعطينا رسالة بوجود خطأ عندما يكون المفتاح غير موجود في القاموس كما في المثال التالي:
info={'name':'Ahmad','Age':22,'Job':'student'} info.get('birth_date')
القواميس مثل القوائم يمكن تعديل البيانات الموجودة بداخلها فمثلا إذا أردنا تعديل قيمة المفتاح “Age” في القاموس السابق فإننا نقوم بالآتي:
info={'name':'Ahmad','Age':22,'Job':'student'} info['Age']=40 info
كما يمكن إضافة بيانات جديدة الى قاموس بالطريقة التالية:
info={'name':'Ahmad','Age':22,'Job':'student'} info['car']='Ford' info
لمعرفة عدد البيانات في قاموس فاننا نستخدم الدالة ()len كما فعلنا في القوائم والصفوف:
info={'name':'Ahmad','Age':22,'Job':'student'} len(info)
ولمعرفة ما اذا كان هناك بيان ما موجود في قاموس فاننا نستخدم in كما تعلمنا سابقا في القوائم والصفوف:
info={'name':'Ahmad','Age':22,'Job':'student'} 'Age' in info
'car' in info
لحذف بيان من قاموس فإننا نستخدم الامر del كما فعلنا في القوائم:
info={'name':'Ahmad','Age':22,'Job':'student'} del info['Job']
كما يمكن استخدام الدالة ()pop لاداء نفس المهمة مع امكانية ارجاع قيمة المفتاح المحذوف واضافته لمتغير لاستخدامه في عمليات اخرى كما في المثال التالي:
info={'name':'Ahmad','Age':22,'Job':'student'} removed_item=info.pop("name") print(info)
removed_item
كما يمكن استخدام الدالة ()popitem لحذف اخر بيان تم اضافته للقاموس مع امكانية ارجاع المفتاح المحذوف وقيمته لاستخدامهما في عمليات اخرى كما في المثال التالي:
info={'name':'Ahmad','Age':22,'Job':'student'} removed_item=info.popitem() print(info) print(removed_item)
ولتفريغ القاموس من البيانات بالكامل نستخدم الدالة ()clear كما في المثال التالي:
info={'name':'Ahmad','Age':22} info.clear() info
ولمعرفة كافة المفاتيح في قاموس ما نستخدم الدالة ()keys كما في المثال التالي:
info={'name': 'Ahmad', 'Age': 22, 'Job': 'student'} info.keys()
ولمعرفة كافة القيم في القاموس نستخدم الدالة ()values كما في المثال التالي:
info={'name': 'Ahmad', 'Age': 22, 'Job': 'student'} info.values()
ولدمج بيانات قاموسين نستخدم الدالة ()update كما في المثال التالي:
info={'name': 'Ahmad', 'Age': 22, 'Job': 'student'} info2={'title':'Mr','phone':'00000'} info.update(info2) info
لاحظ ان القاموس الذي يسبق الدالة هو القاموس الأساسي والقاموس الذي بداخل قوسي الدالة هو القاموس الذي تم دمج البيانات منه. يجب ملاحظ ان بالإمكان وضع قاموس فرعي داخل قاموس رئيسي كما يلي:
info={'name': 'Ahmad', 'Age': 22, 'Job': 'student'} info2={'title':'Mr','phone':'00000'} info['more_data']=info2 info
في المثال السابق تم إضافة القاموس الفرعي باستخدام مفتاح جديد اسميناه more_data كما تعلمنا سابقا عن كيفية إضافة بيان جديد الى قاموس.
ويمكن استخدام الدالة ()items لعرض جميع البيانات في قاموس كقائمة كل بيان يظهر كصف مكون من مفتاح وقيمة كما في المثال التالي:
info={'name': 'Ahmad', 'Age': 22, 'Job': 'student'} info.items()
كل ما ينطبق على القوائم من عمليات النسخ يمكن تطبيقة على القواميس كما في المثالين التاليين:
cars={"name":"Ford", "model":2015, "color":"white"} cars2=cars cars2["milage"]=100000 print(cars) print(cars2)
cars={"name":"Ford", "model":2015, "color":"white"} cars2=cars.copy() cars2["milage"]=100000 print(cars) print(cars2)
cars={"name":"Ford", "model":2015, "color":"white"} cars2=dict(cars) cars2["milage"]=100000 print(cars) print(cars2)

تمارين استكشافية

١- استكشف ماذا كان عمليات الضرب والجمع التي قمنا بها مع القوائم يمكن استخدامها مع القواميس؟
٢-جرب استخدام الامر ()dir واضعا بين قوسيه اسما لقاموس و تعرف على الدوال التي يمكن استخدامها مع القاموس؟
٣- استكشف الية عمل الدالة ()popitem على القاموس؟
٤- استخدم الدالة ()help واضعاً بين قوسيها اسما لدالة تعمل عملا ما على القاموس محاولاً معرفة كيفية عمل تلك الدالة؟ تلميح: يجب كتابة اسم قاموس مفصولا بنقطة بينه وبين الدالة المراد معرفة معلومات عنها بدون كتابة قوسيها داخل قوسي الدالة ()help.

المجموعات (sets)

المجموعات في لغة بايثون هي عبارة عن تجمع لبيانات غير قابلة للتكرار توضع بين قوسين متعرجين {} يفصل بين كل بيان واخر بفاصلة ويشار اليها بمتغير واحد كما في المثال التالي:
numbers={1,2,3,4,1,3} print(numbers) {1, 2, 3, 4}
لاحظ في المثال السابق اننا حاولنا تكوين مجموعة بيانات متكررة لكن محرر بايثون حذف البيانات المتكررة من المجموعة لان المجموعات في بايثون لا تسمح بتكرار البيانات المتشابهة. لاحظ أيضا التشابه بين المجموعات والقواميس من حيث الاقواس. الاختلاف بين القواميس والمجموعات يكمن في طريقة كتابة البيانات فالقواميس كل بيان يتكون من مفتاح وقيمة مفصولين بنقطتين فوق بعض اما المجموعات فهي بيانات اعتيادية.
ويمكن انشاء مجموعة اما بالطريقة التي استخدمناها في المثال السابق او باستخدام الدالة set() وإدخال قائمة من البيانات داخل قوسي الدالة كما في المثال التالي:
letters=set(['a','b','c']) letters
واذا اردنا ان ننشئ مجموعة فارغة فإننا لا نستطيع ان نستخدم قوسين فارغين لأن هذا التركيب اللغوي محجوز للقواميس ولكن بوسعنا ان نستخدم الدالة set() بدون ان ندخل أي شيء بين قوسيها كما في المثال التالي:
numbers={} #استخدام القوسين المتعرجين محجوز للقواميس type(numbers)
letters=set() letters
ولإضافة بيان الي مجموعة فارغة او مجموعة محتوية على بيانات سابقة نستخدم الدالة ()add كما في المثال التالي:
letters=set() letters.add('Ahmad') letters.add('Waleed') letters
لاحظ ان ترتيب البيانات في المجموعات ليس بالضرورة ان يكون بنفس الترتيب الذي ادخلنا فيه البيانات وذلك لان المجموعات لا تستخدم مؤشر البيانات للإشارة الى البيانات بداخلها واذا حاولنا القيام بذلك فان مفسر بايثون سوف يظهر لنا رسالة تفيد بان المجموعات لا تستخدم مؤشر البيانات كما في المثال التالي:
letters={'Hassan', 'Ahmad', 'Waleed'} letters[1]
ولاضافة مجموعة الى مجموعة اخرى نستخدم الدالة ()update كما في المثال التالي:
set_A={1,2,3,4} set_B={1,2,5,7} set_A.update(set_B) print(set_A)
لاحظ ان عملية الترتيب في المثال السابق مهمة فالدالة ()update تضيف بيانات المجموعة set_B الى بيانات المجموعة set_A اذا كانت غير موجودة مسبقا فيها.
ولحذف بيان من مجموعة هناك عدة خيارات لاداء هذه المهمة. فيمكن استخدم الدالة ()remove كما في المثال التالي:
letters={'Hassan', 'Ahmad', 'Waleed'} letters.remove('Ahmad') letters
ويمكن ايضا استخدام الدالة ()discard لحذف بيان من مجموعة كما في المثال التالي:
letters={2, (3, 4), 'Hassan', 'Waleed'} letters.discard(2) letters
الفرق بين استخدام الدالة ()remove والدالة ()discard هو ان الدالة ()discard لا تعطينا رسالة بوجود خطأ عندما نطلب حذف بيان ليس موجود داخل مجموعة اما الدالة ()remove فسوف تظهر لنا رسالة خطأ KeyError عند عندم وجود البيان داخل المجموعة كما في المثال التالي:
letters={(3, 4), 'Hassan', 'Waleed'} letters.discard('Ahmad') # لم تظهر لنا أي رسالة رغم ان البيان غير موجود
letters.remove('Ahmad')
كما يمكن أيضا استخدام الدالة ()pop لحذف بيان عشوائي من مجموعة كما في المثال التالي:
letters={(3, 4), 'Hassan', 'Waleed'} letters.pop()
لاحظ ان البيان الذي يتم حذفه ليس بالضرورة ان يكون في اخر المجموعة كما هو الحال في القوائم وانما يتم اختياره بشكل عشوائي كما حصل في المثال السابق حيث تم حذف بيان من وسط المجموعة وليس من اخرها.
كما يمكن استخدام الدالة ()clear كما فعلنا بالقوائم والصفوف لحذف جميع البيانات من مجموعة كما في المثال التالي:
letters={'Hassan', 'Waleed'} letters.clear() letters
ذكرنا سابقا اننا نستطيع إضافة بيان الى مجموعة وكذلك باستطاعتنا حذفه لكن ليس باستطاعتنا إعادة تعيين قيم البيانات داخل المجموعات كما كنا نفعل بالبيانات داخل القوائم. لذلك يجب ان تكون البيانات المدخلة للمجموعة غير قابلة لإعادة التعيين كالبيانات النصية والصفوف والأرقام. وإذا حاولنا إضافة بيان قابل للتغيير كالقوائم مثلا فان بايثون يظهر لنا رسالة بوجود خطأ كما في المثال التالي:
letters={'Hassan', 'Waleed'} letters.add(2) letters.add((3,4)) letters
letters.add([2,4,6])
ويكمن التعرف على ما اذا كان هناك بيان موجود في مجموعة باستخدام الامر in كما فعلنا سابقا في القوائم والصفوف وهذا مثال عليه هنا:
set_1={1,2,'a','b'} 1 in set_1
3 in set_1
ويمكن اجراء عملية التقاطع بين مجموعتين للحصول على جميع البيانات الموجودة في كلا المجموعتين بعد حذف التكرار باستخدام الدالة ()union كما في المثال التالي:
set_1={1,2,'a','b'} set_2={'c','d',1,2} set_1.union(set_2)
اما اذا اردنا ان نحصل على البيانات المتشابهة فقط فاننا نستخدم الدالة ()intersection كما في المثال التالي:
set_1={1,2,'a','b'} set_2={'c','d',1,2} set_1.intersection(set_2)
وللحصول على البيانات الموجود في مجموعة شريطة ان هذا البيانات غير موجودة في مجموعة ثانية نستخدم الدالة ()difference كما في المثال التالي:
set_1={1,2,'a','b'} set_2={'c','d',1,2} set_1.difference(set_2)
وللحصول على جميع البيانات داخل مجموعتين بعد حذف العناصر المتشابهة نستخدم الدالة ()symmetric_difference كما في المثال التالي:
set_1={1,2,'a','b'} set_2={'c','d',1,2} set_1.symmetric_difference(set_2)
لاحظ ان جميع الدوال الاربعة السابقة تقوم بتكون مجموعة جديد لاحداث التغيير لا تغير في المجموعات الاصلية ولتأكد من ذلك يمكن ملاحظة ناتج الامثلة التالية:
set_1={1,2,'a','b'} set_2={'c','d',1,2} result=set_1.union(set_2) print(result) print(set_1) print(set_2)
set_1={1,2,'a','b'} set_2={'c','d',1,2} result=set_1.intersection(set_2) print(result) print(set_1) print(set_2)
set_1={1,2,'a','b'} set_2={'c','d',1,2} result=set_1.difference(set_2) print(result) print(set_1) print(set_2)
set_1={1,2,'a','b'} set_2={'c','d',1,2} result=set_1.symmetric_difference(set_2) print(result) print(set_1) print(set_2)
ولاحداث تغيير مباشر في المجموعة الاصلية نستخدم الدوال التالية:
  • ()intersection_update
  • ()difference_update
  • ()symmetric_difference_update
  • بدلا من الدوال السابقة للقيام بهذه المهمة كما في الامثلة التالية:
set_1={1,2,'a','b'} set_2={'c','d',1,2} set_1.intersection_update(set_2) print(set_1) print(set_2)
set_1={1,2,'a','b'} set_2={'c','d',1,2} result=set_1.difference_update(set_2) print(set_1) print(set_2)
set_1={1,2,'a','b'} set_2={'c','d',1,2} result=set_1.symmetric_difference_update(set_2) print(set_1) print(set_2)
كما يمكن استخدام الدالة ()issubset للسؤال عن ما اذا كانت مجموعة ما هي مجموعة جزئية من مجموعة أخرى كما في المثال التالي:
set_1={1,2,'a','b'} set_2={1, 'd', 2, 'c'} set_3={'a','b'} set_3.issubset(set_1)
set_2.issubset(set_1)
كما يمكن استخدام الدالة ()issuperset للسؤال عن ما اذا كانت مجموعة ما هي مجموعة مشتملة على جميع بيانات مجموعة أخرى كما في المثال التالي:
set_1={1,2,'a','b'} set_2={1, 'd', 2, 'c'} set_3={'a','b'} set_1.issuperset(set_3)
set_2.issuperset(set_1)
كما يمكن استخدام الدالة ()isdisjoint للسؤال عن ما اذا كانت مجموعة ما منفصلة عن مجموعة أخرى كما في المثال التالي:
set_1={1,2,'a','b'} set_2={1, 'd', 2, 'c'} set_3={'c','d'} set_1.isdisjoint(set_3)
set_1.isdisjoint(set_2)
كل ما ينطبق على القوائم من عمليات النسخ يمكن تطبيقه على المجموعات.
cars={"Ford", 2015, "white"} cars2=cars cars2.add(100000) print(cars) print(cars2)
cars={"Ford", 2015, "white"} cars2=cars.copy() cars2.add(100000) print(cars) print(cars2)
cars={"Ford", 2015, "white"} cars2=set(cars) cars2.add(100000) print(cars) print(cars2)
وهناك ما يدعى بالمجموعة المجمدة frozenset والتي لا تسمح بتغيير باجراء اي تغيير عليها. فعند محالة اضافة عنصر لهذه المجموعة المجمدة فان مفسر بايثون يعطي رسالة خطأ تفيد بعدم قابلية المجموعة المجمدة للاضافة كما في المثال التالي:
set_A=frozenset([1,2,4]) type(set_A)
set_A.add(7)
set_A.remove(1)

تمارين استكشافية

١- استخدم الدالة ()pop لحذف بيان عشوائي من مجموعة فارغة؟ ماذا تلاحظ؟
٢- استكشف إمكانية إضافة مجموعة الى مجموعة ؟
٣- استخدم محموعتين للتعرف على الفرق بين استخدم set_1.difference(set_2) واستخدام set_2.difference(set_1) ؟
٤- ١ستخدم مجموعتين للتعرف على الفرق بين استخدام الدالة ()union والدالة ()symmetric_difference؟
٥- جرب استخدام الامر ()dir واضعا بين قوسيه اسما لمجموعة و تعرف على الدوال التي يمكن استخدامها مع المجموعة؟

البيانات النصية (String)

تعرفنا في الفصل الثاني على بعض اساسيات البيانات النصية واجلنا جزء من هذه الأساسيات الى حين التعرف على مفهوم القوائم في بايثون والذي قمنا به في بداية هذا الفصل والان سوف نكمل ما بدأناه من اساسيات البيانات النصية فنتعرف على بعض العمليات التي يمكن اجراؤها عليها وطريقة تجزئتها وتهيئتها للطباعة.
على الرغم من البيانات النصية هي أحد النوع البيانات الرئيسية في بايثون الا انه يمكن اعتبارها بيانات تجميعية بحيث يمكن التعامل معها بنفس الطريقة التي تعاملنا بها مع القوائم. فيمكن انشاء نص فارغ باستخدام أحد أنواع علامات التنصيص التي تعلمناها سابقا كما في المثال التالي:
text=''
text=""
text=''''''
ولمعرفة عدد سلسلة الحروف الموجودة في النص “Hello python” نقوم باستخدام الدالة ()len كما في المثال التالي:
len("Hello python")
كما يمكن تجزئة النص بنفس الطريقة التي تعلمناها عن القوائم كما يلي:
text="Hello python" text[0]
text[-1]
text[6:8]
ويمكن دمج البيانات النصية باستخدام علامة الجمع كما في المثال التالي:
name="Ahmad" txt="Hello" space=" " txt+space+name
وكذلك يمكن استخدام الدالة ()join للقيام بنفس المهمة كما في المثال التالي:
name="Ahmad" txt="Hello" " ".join([txt,name])
لاحظ اننا في المثال السابق استخدمنا الدالة ()join مسبوقة بفراغ موجود بين علامتي التنصيص ليكون رابطاً لعناصر القائمة الموجود داخل قوسي الدالة. كما يجب ملاحظة انه يمكن استخدام أي رابط اخر نرغب فيه فمثلا لو أردنا استخدام الشرطة السفلية فإننا نكتب المثال السابق كالتالي:
"_".join([txt,name])
".".join([txt,name])
ويمكن استخدام الدالة ()count كما فلعنا مع القوائم لمعرفة عدد تكرار حرف او جزء من نص في بيان نصي كما في المثال التالي:
text="Hello python" text.count("l")
text.count("p")
text.count("P")
وكذلك يمكن استخدام الدالة ()index لمعرفة مؤشر أول ظهور لحرف او جزء من نص داخل بيان نصي كما يلي:
text="Hello python" text.index("H")
text.index("n")
text.index("py")

تمارين استكشافية

1- اكتب متغيرا وليكن name واجعل قيمته أي اسم تختاره وليكن “Ali” حاول ان تطبع العبارة “Hello name” باستخدام الدالة ()print؟ ماذا تلاحظ؟ هل قام بايثون باستخدام قيمة name عند اجراء عملية الطباعة؟ اذا كانت الإجابة بلا فما السبب في رأيك؟
ان وجود اسم متغير داخل علامة تنصيص لا يعتبره بايثون على انه متغير وانما يتعامل معه على انه نص كأي نص اخر. ولكي نجعل بايثون يستخدم قيمة متغير دخال علامة تنصيص فان هناك عدة حيل في بايثون تمكنا من القيام بذلك. اول هذه الحيل هي استخدام النسبة المئوية دخال النص متبوعة بنوع البيان المراد إدخاله وهو أسلوب قديم تم استيراده من لغة C كما في المثال التالي:
name="Hassan" greating = "Hello, %s" % name print(greating)
لاحظ ان علامة النسبة المئوية استخدمت لتحديد مكان ادخال قيمة المتغير وحرف s استخدم للدلالة على نوع القيمة التي يحتويها المتغير والذي تم وضعه بعد النص مفصول عنه بعلامة النسبة المئوية. كما يمكن استخدام هذه الطريقة لإدخال قيم متغيرات رقمية كما في المثال التالي:
speed = 120 print("You exceeded the speed limit of %d km/hour" % speed)
print("You exceeded the speed limit of %f km/hour" % speed)
print("You exceeded the speed limit of %5.2f km/hour" % speed)
لاحظ في المثال السابق ان الحرف d يستخدم للدلالة على الاعداد الصحيحة بينما الحرف f يدل على استخدام الاعداد العشرية. كما يجب ملاحظة ان عدد الخانات الرقمية يمكن التحكم فيه بتحديد عدد الخانات الكلي وعدد الأجزاء العشرية كما موضح في المثال الأخير.
ويمكن ادخال قيم أكثر من متغير سواء كانت عدديا أو نصيا كما في المثال التالي:
name="Ahmad" speed=120 fine=300 print("Dear %s, You violated the speed limit of %d. You have to pay %5.2f Riyals" % (name,speed,fine))
لاحظ استخدامنا للصف في المثال السابق بعد علامة النسبة المئوية ولاحظ اهمية الترتيب للبيانات داخل الصف لتوظيفها بشكل مناسب داخل النص.
وهناك طريقة حديثة للقيام بنفس المهام السابقة وذلك باستخدام الدالة ()format كما في المثال التالي:
name="Ahmad" speed=120 fine=300 print("Dear {}, You violated the speed limit of {} km/hr. You have to pay {} Riyals".format(name,speed,fine))
وترتيب المتغيرات بين قوسي الدالة ()format يجب مراعاته أيضا هنا الا اذا كتبنا اسم المتغيرات بين القوسين المتعرجين او استخدمنا مؤشر ترتيب المتغير كما في المثالين التاليين:
print("Dear {2}, You violated the speed limit of {0} km/hr. You have to pay {1} Riyals".format(speed,fine,name))
print("Dear {name}, You violated the speed limit of {speed} km/hr.\ You have to pay {fine} Riyals".format(speed=speed,fine=fine,name=name))
وفي اصدارة بايثون 3.6 وما بعدها تم إضافة طريقة أخرى لتهيئة النصوص تسمى literal formatting وهي تشبه الى حد كبير استخدام الدالة ()format كما هو موضح في المثال التالي:
print(f"Dear {name}, You violated the speed limit of {speed} km/hr. You have to pay {fine} Riyals")
فكل ما تحتاجه عند استخدام هذه الطريقة هو إضافة حرف f قبل النص وكتابة أسماء المتغيرات التي تريد التعويض بقيمها داخل قوسين متعرجين فقظ.
لتجزئة نص الي بيانات نصية صغيرة داخل قائمة يمكن استخدام الدالة ()split كما في المثال التالي:
text="one two three four five six seven" text.split(" ")
colors="yellow,green,blue,red,white,black" colors.split(",")
لاحظ اننا ستخدمنا في المثال السابق الفراغ والفاصلة لتخبر مفسر بايثون بأماكن فصل النص ووضعنا هاتين العلامتين داخل علامة تنصيص بين قوسي الدالة ()split.
ويمكن تحويل النص الى حروف كبير او صغيرة باستخدام الدالتين ()upper و ()lower على التوالي كما في المثال التالي:
colors="yellow,green,blue,red,white,black" colors.upper()
numbers="ONE TWO THREE FOUR" numbers.lower()
كما يمكن إزالة الفراغات الموجود في بداية النص ونهايته باستخدام الدالة ()strip كما في المثال التالي:
text=" Hello python " text.strip()
كما يمكننا أيضا استبدال حرف او جزء من نص باخر باستخدام الدالة ()replace كما في المثال التالي:
text="Hello python" text.replace('l','s')
ونختم هذا الفصل بان نخبرك ان البيانات النصية تختلف عن القوائم في انها غير قابلة للتغيير immutable. بمعنى ان ما قمنا به في الأمثلة السابقة من تعديلات على النص لم يكمن بالفعل على نفس النص وانما قام مفسر بايثون بإنشاء بيان نصي جديد يحتوي على التعديلات التي قمنا بها وقام بطباعتها على الشاشة بينما البيان الأصلي لم يتغير وسف نثبت لك ذلك في المثال التالي:
numbers="one two three four" numbers.upper()
numbers
لاحظ انه عندما قمنا بتحويل النص numbers الى حروف كبيرة قام بايثون بانشاء متغير مؤقت وطبع النص بعد التعديل على الشاشة. ولكن عندما طلبنا من بايثون طباعة النص الأصلي فان النص مازال كما هو بحروفه الصغيرة. هذا الخاصية لا تنطبق على القوائم. فعندما نقوم بالتعديل على القوائم فان بايثون يجري عملية التعديل على القائمة الاصلية كما في المثال التالي:
numbers=["one","two","three","four"] numbers.pop() numbers
لاحظ انه عندما حذفنا البيان الأخير من القائمة numbers باستخدام الدالة ()pop قام بايثون بحذف البيان من القائمة الاصلية.

ملخص الفصل

اكتب الملخص هنا

اسئلة استيعابية

  1. اعكس ترتيب البيانات في القائمة list1؟

## الجواب المتعوقع ## [500, 400, 300, 200, 100] list1 = [100, 200, 300, 400, 500] ## اكتب الكود هنا
  1. أضف عناصر القائمة الثانية list2 إلى عناصر المجموعة الأولى list1؟

## الجواب المتوقع ## ['Hello Dear', 'Hello Sir', 'take Dear', 'take Sir'] list1 = ["Hello ", "take "] list2 = ["Dear", "Sir"] ## اكتب الكود هنا
  1. أضف البيان 7000 بعد البيان 6000 الموجود في القائمة list1؟

## الجواب المتوقع ## [10, 20, [300, 400, [5000, 6000, 7000], 500], 30, 40] list1 = [10, 20, [300, 400, [5000, 6000], 500], 30, 40] ## اكتب الكود هنا
  1. أضف القائمة الفرعية sub_list إلى أعمق قائمة موجودة في القائمة الرئيسية list1 باستخدام الدالة ()extend؟

## الاجابة المتوقعة ## ['a', 'b', ['c', ['d', 'e', ['f', 'g', 'h', 'i', 'j'], 'k'], 'l'], 'm', 'n'] ## القائمة الرئيسية list1 = ["a", "b", ["c", ["d", "e", ["f", "g"], "k"], "l"], "m", "n"] ## القائمة الفرعية المطلوب اضافتها sub_list = ["h", "i", "j"] ## اكتب الكود هنا
  1. استبدل القيمة 15 في القائمة list1 بالقيمة 150؟

## الاجابة المتوقعة ## [5, 10, 150, 20, 25, 50, 20] list1 = [5, 10, 15, 20, 25, 50, 20] ## اكتب الكود هنا
  1. أحذف آخر بيان في القائمة list1؟

## الاجابة المتوقعة ## [2,4,6,8,10] list1=[2,4,6,8,10,20] ## اكتب الكود هنا
  1. احسب مجموع الأعداد الموجودة في القائمة list1؟

## الجواب المتوقع 55 list1=[12,11,4,6,5,10,7] ## اكتب الكود هنا
  1. احسب أعلى قيمة في القائمة list1؟

## الجواب المتوقع123 list1=[12,11,4,6,5,10,7] ## اكتب الكود هنا
  1. احسب أقل قيمة في القائمة list1؟

## الجواب المتوقع 4 list1=[12,11,4,6,5,10,7] ## اكتب الكود هنا
  1. احسب عدد العناصر في القائمة list1؟

## الجواب المتوقع 7 list1=[12,11,4,6,5,10,7] ## اكتب الكود هنا
  1. حول النص name إلى قائمة؟

## الجواب المتوقع ["A","h","m","a","d"] name="Ahmad" ## اكتب الكود هنا
  1. رتب القائمة list1؟ تصاعدياً؟

## الجواب المتوقع ## [4,5,6,7,10,11,12] list1=[12,11,4,6,5,10,7] ## اكتب الكود هنا
  1. رتب القائمة list1 تنازلياً؟

## الجواب المتوقع ## [12,11,10,7,6,5,4] list1=[12,11,4,6,5,10,7] ## اكتب الكود هنا
  1. رتب القائمة list1 ابجدياً؟

## الجواب المتوقع ## ["A","a","d","h","m"] list1=["A","h","m","a","d"] ## اكتب الكود هنا
  1. اضف الرقم 15 قبل البيان الأخير في القائمة list1؟

## الجواب المتوقع ## [12,11,10,7,6,5,15,4] list1=[12,11,4,6,5,10,7] ## اكتب الكود هنا
  1. اكتب كود برمجي يوجد مؤشر القيمة 10 في القائمة list1؟

## الجواب ا لمتوقع 5 list1=[12,11,4,6,5,10,7] ## اكتب الكود هنا
  1. اكتب قائمة بثلاثة فواكه تحبها؟ قم بطباعة آخر عنصر في القائمة التي كتبتها مرتين مره مستخدماً مؤشر القوائم الموجب ومرة مستخدماً مؤشر القوائم السالب؟

  1. استخرج القائمة ["A", "D", "G"] من القائمة الأساسية letters مستخدماً ما تعلمته من طرق تجزئة القوائم؟

letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G'] ## اكتب الكود هنا
  1. جزأ القائمة letters بحيث ينتج عن عملية التجزئة قائمة تحتوي على جميع الحروف من D الى F؟

## الاجابة المتوقعة ## ["D","E","F"] letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G'] ## اكتب الكود هنا
  1. أنشئ قائمة فارغة ثم اضف لها ثلاثة من الاطعمة التي تحبها؟

## اكت الكود هنا