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

الآن بعد أن عرفنا عن المصفوفات (lists)، دعنا نلقي نظرة على شقيقتها: ما يسمى بـ المجموعات.

يمكن أن تحتوي المجموعات (tuples)، تمامًا مثل المصفوفات (lists)، على عدد n من العناصر. المجموعة (Tuple) التي تحتوي على عنصرين هي زوج (pair)؛ مع ثلاثة عناصر يسمى ثلاثي (3-tuple) ومع أربعة عناصر يسمى رباعي (4-tuple)، إلخ.

هناك مجموعات (tuples) بعنصر واحد وبلا عناصر (مجموعة فارغة - empty tuple)، لكننا لن نتعامل معها في البداية.

يتم إنشاء المجموعات (tuples) مثل المصفوفات (lists)، ولكنها لا تحتوي على أقواس مربعة حولها. فقط الفواصل بين العناصر كافية.

تتصرف المجموعات (tuples) تقريبًا مثل المصفوفات (lists)، لكن لا يمكن تغييرها. ليس لديها طرق (methods) مثل append و pop، ولا يمكن تعيين قيم للعناصر. لكن يمكن استخدامها في حلقات for ويمكنها قراءة العناصر الفردية.

people = 'mom', 'aunt', 'grandmother'
for person in people:
    print(person)
print('First is {}'.format(people[0]))

هل يبدو هذا مألوفًا؟ لقد استخدمنا المجموعات (tuples) بالفعل في for greeting in 'Ahoj', 'Hello', 'Hola', 'Hei', 'SYN'

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

list_of_pairs = []
for i in range(10):
    #`append` takes only one argument; we'll give it one pair
    list_of_pairs.append ((i, i ** 2))
print(list_of_pairs)

تكون المجموعات (tuples) مفيدة إذا كنت تريد إرجاع أكثر من قيمة واحدة من الدالة (function). ما عليك سوى الإعلان عن قيم الإرجاع بفصلها بفواصل. يبدو الأمر وكأنك تُرجع عدة قيم، لكن في الواقع، يتم إرجاع مجموعة (tuple) واحدة فقط.

def floor_and_remainder(a, b):
    return a//b, a%b

دالة (function) floor_and_remainder كهذه موجودة بالفعل في بايثون: تسمى divmod وهي دائمًا متاحة (ليس عليك استيرادها).

يمكن لبايثون أن تقوم بحيلة أخرى: إذا كنت تريد تعيين قيم في عدة متغيرات في وقت واحد، يمكنك فقط فصل المتغيرات (الجانب الأيسر) بفاصلة، ويمكن أن يكون الجانب الأيمن بعض قيمة "مركبة" - على سبيل المثال مجموعة (tuple).

floor_number, remainder = floor_and_remainder(12, 5)

المجموعة (tuple) هي الأفضل لهذا الغرض، لكن إنه يعمل مع جميع القيم التي يمكن استخدامها مع حلقة for:

x, o = 'xo'
one, two, three = [1, 2, 3]

الدوال التي تُرجع مجموعات (Functions returning tuples)

zip هي دالة (function) مثيرة للاهتمام. يتم استخدامه في حلقات for، تمامًا مثل الدالة (function) range التي تُرجع أرقامًا.

عندما تحصل zip على مصفوفات (lists) (أو قيم أخرى يمكن استخدامها في حلقة for)، فإنها تُرجع أزواجًا (pairs) - يتم إقران العنصر الأول من المصفوفة الأولى بـ العنصر الأول من المصفوفة الثانية، ثم العنصر الثاني مع الثاني، والعنصر الثالث مع الثالث وهكذا.

يكون مفيدًا عندما يكون لديك مصفوفات (lists) بنفس الهيكل - العناصر ذات الصلة "تنتمي" معًا وتريد معالجتها معًا:

people = 'mom', 'aunt', 'grandmother', 'assassin'
properties = 'good', 'nice', 'kind', 'insidious'
for person, property in zip(people, properties):
    print ('{} is {}'.format(person, property))

عندما تحصل zip على ثلاث مصفوفات (lists)، فإنها ستُرجع ثلاثيات (triplets)، وهكذا.

الدالة (function) الأخرى التي تُرجع أزواجًا (pairs) هي enumerate. كـ قيمة (argument)، تأخذ مصفوفة (list) (أو قيم أخرى يمكن استخدامها في حلقة for) وتقوم بإقران فهرس العنصر (ترتيبه في المصفوفة) مع العنصر المقابل. لذا سيكون العنصر الأول هو (0، العنصر الأول من المصفوفة المعطاة)، ثم (1، العنصر الثاني)، (2، العنصر الثالث) وهكذا.

prime_numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

for i, prime_number in enumerate(prime_numbers):
    print('Prime number on position {} is {}'.format(i, prime_number))

مجموعات صغيرة (Small tuples)

كيفية إنشاء مجموعة (tuple) بدون عنصر أو بعنصر واحد؟ هكذا:

empty_tuple = ()
one_elem_tuple = ('a',)

يعمل المثال الثاني أيضًا بدون أقواس - one_eleem_tuple = 'a' , لكنه يبدو وكأنه فاصلة منسية. عندما تحتاج حقًا إلى مجموعة (tuple) بعنصر واحد، يجب عليك تغليفها بشكل أفضل للتوضيح.

متى نستخدم المصفوفة ومتى نستخدم المجموعة؟ (When to use the list and when the tuple?)

تُستخدم المصفوفات (lists) عندما لا تعرف مسبقًا كم عدد القيم التي ستكون لديك، أو عندما يكون هناك الكثير من القيم. على سبيل المثال، مصفوفة (list) بالكلمات في جملة، مصفوفة (list) بالمشاركين في مسابقة، مصفوفة (list) بالحركات في لعبة، أو مصفوفة (list) بالبطاقات في مجموعة. على النقيض من ذلك، في for greeting in 'Ahoj', 'Hello', 'Hola', 'Hei', 'SYN' نحن نستخدم مجموعة (tuple).

غالبًا ما تُستخدم المجموعات (tuples) للقيم من أنواع مختلفة حيث لكل "موضع" داخل المجموعة معنى مختلف. على سبيل المثال، يمكنك استخدام مصفوفة (list) لأحرف الأبجدية، ولكن لأزواج الفهرس والقيمة من enumerate، ستستخدم مجموعة (tuple).

المجموعة الفارغة (empty tuple) والمجموعة ذات العنصر الواحد (one-element tuple) غريبان بعض الشيء، لكنهما موجودان: على سبيل المثال، مصفوفة (list) أوراق اللعب في يدك، أو مصفوفة (list) الأشخاص المسجلين حاليًا في المسابقة قد تكون فارغة في بعض الأحيان.

للمصفوفات (lists) والمجموعات (tuples) أيضًا حدود فنية: لا يمكن تغيير المجموعات (tuples)، وعندما نتعلم كيفية العمل مع القواميس (dictionaries)، سنجد أنه لا يمكن استخدام المصفوفات (lists) كمفاتيح للقواميس(dictionaries).

في كثير من الأحيان، ليس من الواضح تمامًا أي نوع يجب استخدامه -- في هذه الحالة، ربما لا يهم حقًا. اتبع حدسك. :)