تعلم البرمجة مع Python


الدرس: إنشاء قوائم و tuples (1/2)


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

القوائم عبارة عن تسلسلات. في الواقع ، فإن اسمهم واضح إلى حد ما ، لأنهم كائنات قادرة على احتواء كائنات أخرى من أي نوع. يمكن أن يكون لدينا قائمة تحتوي على عدة أعداد صحيحة (1 ، 2 ، 50 ، 2000 أو أكثر ، أيًا كان) ، قائمة تحتوي على عدد عشري ، قائمة تحتوي على سلاسل ... وقائمة تمزج بين هذه الكائنات من أنواع مختلفة.

لنقم بإنشاء وتحرير قوائمنا الأولى


بادئ ذي بدء ، ما هي القائمة؟


في بايثون ، القوائم هي كائنات يمكن أن تحتوي على أشياء أخرى. لذا فهي عبارة عن تسلسلات ، مثل السلاسل ، ولكن بدلاً من احتواء الأحرف ، يمكن أن تحتوي على أي كائن. كالعادة سنتعامل مع مفهوم القوائم قبل أن نرى الهدف منها.

أنشئ قوائم


لدينا طريقتان لإنشاء القوائم. إذا أخبرتك أن فئة القائمة تسمى ، منطقيًا بدرجة كافية list ، يجب أن ترى بالفعل طريقة لإنشاء قائمة.

لا ؟ ...

سوف تعتاد على بناء الجملة هذه:


>>> ma_liste = list() # نقوم بإنشاء قائمة فارغة
>>> type(ma_liste)
<class 'list'>
>>> ma_liste
[]
>>>
 
مرة أخرى، ونحن نستخدم اسم الفئة بوصفها وظيفة إلى مثيل كائن من تلك الفئة.

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


>>> ma_liste = [] # نقوم بإنشاء قائمة فارغة
>>>
 
إنه نفس الشيء ، يمكنك التحقق. ومع ذلك ، يمكنك أيضًا إنشاء قائمة غير فارغة ، من خلال الإشارة إليها مباشرةً عند إنشاء الكائنات التي يجب أن تحتوي عليها.


>>> ma_liste = [1, 2, 3, 4, 5] # قائمة بخمسة عناصر
>>> print(ma_liste)
[1, 2, 3, 4, 5]
>>>
 
تحتوي القائمة التي أنشأناها للتو على خمسة كائنات من النوع int . تم سردها بترتيب تصاعدي. لكن لا شيء من هذا إلزامي.
  • يمكنك عمل قوائم بأي طول.
  • يمكن أن تحتوي القوائم على أي نوع من الكائنات.
  • يمكن وضع الكائنات في القائمة بأي ترتيب. ومع ذلك ، فإن هيكل القائمة يضمن أن لكل كائن مكانه وأن هذا الترتيب مهم.

>>> ma_liste = [1, 3.5, "une chaine", []]
>>>
 
لقد أنشأنا هنا قائمة تحتوي على أربعة كائنات من أنواع مختلفة: عدد صحيح ، عدد عشري ، سلسلة و… قائمة أخرى.

الآن دعنا نرى كيفية الوصول إلى العناصر الموجودة في قائمة:


>>> ma_liste = ['c', 'f', 'm']
>>> ma_liste[0] # On accède au premier élément de la liste
'c'
>>> ma_liste[2] # Troisième élément
'm'
>>> ma_liste[1] = 'Z' # On remplace 'f' par 'Z'
>>> ma_liste
['c', 'Z', 'm']
>>>
 
كما ترى ، نصل إلى عناصر القائمة بنفس الطريقة التي نصل بها إلى أحرف سلسلة الأحرف: نشير بين قوسين مربعين إلى فهرس العنصر الذي يهمنا.

على عكس الفئة str ، list يسمح لك  باستبدال عنصر بآخر. القوائم هي في الواقع أنواع تسمى قابلة للتغيير .

إدراج كائنات في قائمة


هناك عدة طرق ، محددة في الفئة list، لإضافة عناصر إلى القائمة.

أضف عنصرًا إلى نهاية القائمة


نستخدم طريقة append لإضافة عنصر إلى نهاية القائمة.


>>> ma_liste = [1, 2, 3]
>>> ma_liste.append(56) # أضف 56 إلى نهاية القائمة
>>> ma_liste
[1, 2, 3, 56]
>>>
 
انها بسيطة جدا أليس كذلك؟ نقوم بتمرير append الكائن الذي نريد إضافته إلى نهاية القائمة كمعامل للطريقة .

تعمل الطريقة append ، مثل العديد من عمليات القائمة ، مباشرة على الكائن وبالتالي لا تُرجع شيئًا!

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


>>> chaine1 = "une petite phrase"
>>> chaine2 = chaine1.upper() 
>>> chaine1                   
'une petite phrase'
>>> # upper لم يتم تعديلها بالطريقة 
... chaine2                   
'UNE PETITE PHRASE'
>>> # هي التي السلسلة باحرف كبيرة  chaine2 
... # دعونا نرى القوائم الآن
... liste1 = [1, 5.5, 18]
>>> liste2 = liste1.append(-15) #  liste1الى  -15 نضيف  
>>> liste1                      # liste1نطبع 
[1, 5.5, 18, -15]
>>> # (liste1) هذه المرة ، أدى استدعاء الطريقة إلى تغيير الكائن الأصلي 
... # دعونا نرى ما تحتويه list2
... liste2
>>> # لا شيئ ؟ دعونا نتحقق من الطباعة
... print(liste2)
None
>>>
 
سأشرح الأسطر الأخيرة. لكن عليك أولاً معرفة الفرق بين عمليات السلسلة ، حيث لا يتم تعديل الكائن الأصلي مطلقًا والتي تُرجع كائنًا جديدًا ، وطرق القائمة التي لا تُرجع شيئًا سوى التعديل في الكائن الأصلي.

قلت أن أساليب القائمة لا ترجع أي شيء. ومع ذلك ، سنحاول "التقاط" القيمة المُعادة في liste2 . عندما نحاول عرض قيمة liste2 عن طريق الإدخال المباشر ، فإننا لا نحصل على شيء. لا بد لنا من مشاهدته مع print لرؤية ما يحتوي عليه:  None . هذا هو كائن بايثون الفارغ. في الواقع ، عندما ترجع الدالة شيئًا ، فإنها تعيد None . قد تجد هذه القيمة مرة أخرى من وقت لآخر ، لذلك لا تتفاجأ.

أدخل عنصرًا في القائمة


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


>>> ma_liste = ['a', 'b', 'd', 'e']
>>> ma_liste.insert(2, 'c') #  الفهرس 2 "c"  نقوم بإدخال في 
>>> print(ma_liste)
['a', 'b', 'c', 'd', 'e']
 
عندما تطلب ادراج  c في الفهرس 2 ، ستعمل الطريقة على إزاحة الكائنات ذات الفهرس الأكبر من أو يساوي 2 .  c وبالتالي سيتم إدراجها بين b و d .

تسلسل القوائم


يمكنك أيضًا تكبير القوائم عن طريق ربطها بالآخرين.


>>> ma_liste1 = [3, 4, 5]
>>> ma_liste2 = [8, 9, 10]
>>> ma_liste1.extend(ma_liste2) # نقوم بإدخال my_list2 في نهاية my_list1
>>> print(ma_liste1)
[3, 4, 5, 8, 9, 10]
>>> ma_liste1 = [3, 4, 5]
>>> ma_liste1 + ma_liste2
[3, 4, 5, 8, 9, 10]
>>> ma_liste1 += ma_liste2 # extend  متطابقة مع 
>>> print(ma_liste1)
[3, 4, 5, 8, 9, 10]
>>>
 
فيما يلي الطرق المختلفة لسلسلة القوائم. قد تلاحظ عامل التشغيل  + الذي يربط قائمتين معًا ويعيد النتيجة. يمكننا استخدامه += منطقيا بما يكفي لتوسيع القائمة. هذه الطريقة في فعل الأشياء هي نفسها استخدام الطريقة extend .

إزالة العناصر من القائمة


سنرى بسرعة كيفية إزالة العناصر من القائمة ، قبل أن نتعلم كيفية تصفحها. سترى بسرعة أن هذا يتم بكل بساطة. سنرى طريقتين لإزالة العناصر من القائمة:

  • الكلمة del .
  • الطريقة remove .

الكلمة del


هذه إحدى الكلمات الرئيسية في Python ، والتي كان بإمكاني عرضها لك سابقًا. لكن التطبيقات التي  بدت لي غير عملية إلى حد ما قبل أن أتطرق إلى القوائم.

Del (اختصار حذف ) يعني "حذف" باللغة الإنجليزية. استخدامه بسيط جدا del variable . دعونا نرى مثالا.


>>> variable = 34
>>> variable
34
>>> del variable
>>> variable
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'variable' is not defined
>>>
 
كما ترى ، بعد استخدام del المتغير لم يعد موجودًا. ببساطة تمحوها بايثون. لكن يمكننا أيضًا استخدام del لإزالة العناصر من تسلسل ، مثل قائمة ، وهذا ما يهمنا هنا.

>>> ma_liste = [-5, -2, 1, 4, 7, 10]
>>> del ma_liste[0] # On supprime le premier élément de la liste
>>> ma_liste
[-2, 1, 4, 7, 10]
>>> del ma_liste[2] # On supprime le troisième élément de la liste
>>> ma_liste
[-2, 1, 7, 10]
>>>
 

الطريقة remove


يمكنك أيضًا إزالة العناصر من القائمة باستخدام الطريقة remove التي تأخذ كمعامل ليس فهرس العنصر المراد إزالته ، ولكن العنصر نفسه.


>>> ma_liste = [31, 32, 33, 34, 35]
>>> ma_liste.remove(32)
>>> ma_liste
[31, 33, 34, 35]
>>>
 
Remove يجتاز الأسلوب القائمة ويزيل العنصر الذي تمرره إليها كمعامل. إنها طريقة مختلفة قليلاً للقيام بالأشياء وسوف تتقدم بطلب del أو remove اعتمادًا على الموقف.

الأسلوب remove يزيل فقط التواجد الأول للقيمة الموجودة في القائمة!

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

سنرى الآن كيفية استعراض القائمة ، على الرغم من أنه يجب أن يكون لديك بالفعل فكرة عن السؤال.

التصفح في قائمة



يجب أن تكون قد اكتشفت بالفعل طرق استعراض القائمة. سأتخطى ذلك لفترة وجيزة ، فلن ترى أي شيء جديد أو نأمل أن يكون مفاجئًا للغاية.


>>> ma_liste = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> i = 0 # while فهرسنا للحلقة 
>>> while i < len(ma_liste):
...     print(ma_liste[i])
...     i += 1 
... 
a
b
c
d
e
f
g
h
>>> # هذه الطريقة مع ذلك هي المفضلة
... for elt in ma_liste: # سوف تأخذ elt القيم المتتالية لعناصر my_list
...     print(elt)
... 
a
b
c
d
e
f
g
h
>>> 
 
هذه هي نفس طرق التصفح التي رأيناها للسلاسل في الفصل السابق. ومع ذلك ، سوف نذهب أبعد من ذلك بقليل.

الوظيفة enumerate


الطريقتان اللتان رأيناهما للتو لهما عيوب:

  • طريقة الاستخدام while أطول في الكتابة ، وأقل حدسية ، ويمكن اختراقها للحلقات اللانهائية ، إذا نسينا زيادة المتغير الذي يعمل كمقياس ؛
  • الطريقة for هي محتوى لتصفح القائمة من خلال التقاط العناصر في متغير ، دون معرفة مكانها في القائمة.
هذا صحيح في الحالة التي رأيناها للتو. سيجمع بعض المبرمجين بين الطريقتين لمزيد من المرونة ، ولكن غالبًا ما يكون الكود الذي تم الحصول عليه أقل قابلية للقراءة. لحسن الحظ ، قام مطورو Python بتغطيتنا.


>>> ma_liste = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> for i, elt in enumerate(ma_liste):
...     print("À l'indice {} se trouve {}.".format(i, elt))
... 
À l'indice 0 se trouve a.
À l'indice 1 se trouve b.
À l'indice 2 se trouve c.
À l'indice 3 se trouve d.
À l'indice 4 se trouve e.
À l'indice 5 se trouve f.
À l'indice 6 se trouve g.
À l'indice 7 se trouve h.
>>>
 
لا تصب بالذعر

!

هنا لدينا حلقة for مفاجئة إلى حد ما.  بين for و in ، لدينا متغيرين ، مفصولة بفاصلة.

في الواقع ، enumerate يأخذ قائمة كمعامل ويعيد كائنًا يمكن ربطه بقائمة تحتوي على قيمتين لكل عنصر: الفهرس وعنصر القائمة الذي تم البحث فيه.

ربما لم يتضح بعد. دعنا نحاول عرض هذا بشكل أفضل قليلاً:


>>> for elt in enumerate(ma_liste):
...     print(elt)
... 
(0, 'a')
(1, 'b')
(2, 'c')
(3, 'd')
(4, 'e')
(5, 'f')
(6, 'g')
(7, 'h')
>>>
 
عندما نذهب من خلال كل عنصر من عناصر الكائن إرجاعها من قبل enumerate، ونحن نرى الصفوف التي تحتوي على عنصرين: أولا المؤشر، ثم الكائن الموجود في هذا المؤشر في القائمة مرت كحجة لوظيفة enumerate .

المجموعات هي تسلسلات ، تشبه القوائم تمامًا ، باستثناء أنه لا يمكنك تعديل المجموعة بعد إنشائها. هذا يعني أنك تحدد محتوى المجموعة (الكائنات التي يجب أن تحتوي عليها) عندما تقوم بإنشائها ، لكن لا يمكنك إضافة أو إزالة أي منها لاحقًا.

إذا كانت الأقواس تربكك كثيرًا ، فيمكنك التفكير في الأقواس المربعة بدلاً من ذلك: في هذا المثال ، هي نفسها.

عند الاستخدام enumerate ، نلتقط الفهرس والعنصر في متغيرين منفصلين. دعونا نرى مثالاً آخر لفهم هذه الآلية:


>>> autre_liste = [
...     [1, 'a'],
...     [4, 'd'],
...     [7, 'g'],
...     [26, 'z'],
... ] # J'ai étalé la liste sur plusieurs lignes
>>> for nb, lettre in autre_liste:
...     print("La lettre {} est la {}e de l'alphabet.".format(lettre, nb))
... 
La lettre a est la 1e de l'alphabet.
La lettre d est la 4e de l'alphabet.
La lettre g est la 7e de l'alphabet.
La lettre z est la 26e de l'alphabet.
>>>  
أتمنى أن يكون هذا واضحا بما فيه الكفاية في عقلك. إذا لم يكن الأمر كذلك ، فقم بتفصيل هذه الأمثلة ، يجب النقر فوقها.

نكتب هنا تعريف القائمة على عدة أسطر لأسباب تتعلق بسهولة القراءة. لا يتعين علينا وضع الشرطة المائلة للخلف "\" في نهاية السطر لأنه طالما لم تجد Python قوسًا يغلق القائمة ، فإنها تستمر في الانتظار دون تفسير السطر. يمكنك أيضًا رؤيته بالنقاط التي تحل محل الشيفرون في بداية السطر ، طالما أن القائمة لم تُغلق.

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

على سبيل المثال ، قد تواجه استثناءات IndexError إذا حاولت إزالة عناصر معينة من القائمة أثناء تصفحها.

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

اذهب! سنلقي نظرة على المجموعات ، لننهي هذا الفصل!

نظرة سريعة على المجموعات (tuples)



لقد رأينا باختصار المجموعات أعلاه قليلاً ، وذلك بفضل الوظيفة enumerate . المجموعات هي قوائم غير قابلة للتغيير ولا يمكن تغييرها. في الواقع ، ستجد أننا استخدمنا المجموعات لمدة طويلة دون أن ندرك ذلك.

يتم تعريف المجموعة على أنها قائمة ، باستثناء استخدام الأقواس كمحددات بدلاً من الأقواس المربعة.


tuple_vide = ()
tuple_non_vide = (1,) # يعادل أدناه
tuple_non_vide = 1,
tuple_avec_plusieurs_valeurs = (1, 2, 5)
 
بخلاف القوائم ، لا يمكن تعديل المجموعات بمجرد إنشائها: لا يمكنك إضافة أو إزالة كائنات منها.

تدقيق صغير هنا: إذا أردنا إنشاء مجموعة تحتوي على عنصر واحد ، فلا يزال يتعين علينا وضع فاصلة بعده. خلافًا لذلك ، ستزيل Python الأقواس تلقائيًا وسننتهي بمتغير lambda وليس متغيرًا يحتوي على tuple .

لكن ما هذا؟

من النادر جدًا أن نعمل مباشرة على tuples . إنه ، بعد كل شيء ، نوع لا يمكن تغييره. لا يمكنك إزالة أو إضافة عناصر من مجموعة. قد يبدو الأمر مجردًا إلى حد ما بالنسبة لك ، ولكن قد يكون من المفيد التعامل مع البيانات دون التمكن من تعديلها.

في غضون ذلك ، دعنا نلقي نظرة على الحالات التي استخدمنا فيها المجموعات دون أن ندرك ذلك.

مهمة متعددة


كل الحالات التي سنراها هي حالات متعددة المهام. هل تتذكرون ؟


>>> a, b = 3, 4
>>> a
3
>>> b
4
>>>
 
استخدمنا أيضًا بناء الجملة هذا لمبادلة متغيرين. حسنًا ، يمر هذا التركيب عبر المجموعات التي لم يتم التصريح عنها صراحةً. يمكنك أن تكتب:

>>> (a, b) = (3, 4)
>>>
 
عندما تعثر Python على عدة متغيرات أو قيم مفصولة بفواصل وبدون محدد ، فإنها ستضعها في مجموعات. في المثال الأول ، تكون الأقواس ضمنية وتفهم Python ما يجب فعله.

دالة تقوم بإرجاع قيم متعددة


لم نر ذلك حتى الآن ، لكن يمكن للدالة أن ترجع قيمتين أو أكثر:


def decomposer(entier, divise_par):
    """ ترجع هذه الدالة الجزء الصحيح والباقي من
    entier / divise_par"""

    p_e = entier // divise_par
    reste = entier % divise_par
    return p_e, reste
 
ويمكننا بعد ذلك التقاط الجزء بالكامل والباقي في متغيرين ، عندما ترجع الدالة:

>>> partie_entiere, reste = decomposer(20, 3)
>>> partie_entiere
6
>>> reste
2
>>>
 
هنا مرة أخرى ، نراجع المجموعات دون الإشارة صراحةً إلى Python . إذا حاولت القيام بذلك retour = decomposer(20, 3)، فستلتقط مجموعة تحتوي على عنصرين: الجزء الصحيح والباقي من 20 مقسومًا على 3. سنرى المزيد من الأمثلة على المجموعات والاستخدامات الأخرى لاحقًا. أعتقد أن هذا كافٍ لهذه المرة.

باختصار


  • القائمة عبارة عن تسلسل قابل للتغيير يمكن أن يحتوي على عدة كائنات أخرى.
  • يتم إنشاء قائمة على النحو التالي :  liste = [element1, element2, elementN] .
  • يمكنك إدراج العناصر في القائمة باستخدام append ، insert و الأساليب extend .
  • يمكنك إزالة العناصر من القائمة باستخدام الكلمة الأساسية del أو الطريقة remove .
  • المجموعة هي سلسلة يمكن أن تحتوي على كائنات. بخلاف القائمة ، لا يمكن تغيير المجموعة بمجرد إنشائها.