الدالة itertools.zip_longest()‎ في بايثون

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث

تعيد الدّالة itertools.zip_longest()‎ مُكرّرًا يُركّب العناصر من كلّ كائن من الكائنات القابلة للتّكرار المُعطاة.

إن كانت الكائنات القابلة للتّكرار غير مُتساويّة في الطّول، فستُستخدم قيمة لملء الفراغات. يُكمل التّكرار إلى أن تنتهي قيم أطول كائن من الكائنات القابلة للتّكرار.

البنية العامة

itertools.zip_longest(*iterables, fillvalue=None)

المعاملات

iterables

الكائنات القابلة للتّكرار المُراد تركيبها.

fillvalue

القيمة التي ستُملؤ بها الفراغات. إن لم تُعيّن قيمة للمُعامل فالقيمة الافتراضيّة تكون القيمةَ None.

القيمة المعادة

مُكرّر يُعيد صفوفًا تُركّب عناصرها من عناصر الكائنات القابلة للتّكرار المُعطاة، ويملؤ الفراغات بقيمة المُعامل fillvalue.

أمثلة

المثال التّالي يوضّح كيفيّة عمل هذه الدّالة:

>>> list(itertools.zip_longest(range(3), 'abcdef'))
[(0, 'a'), (1, 'b'), (2, 'c'), (None, 'd'), (None, 'e'), (None, 'f')]

>>> list(itertools.zip_longest(range(3), 'abcdef', fillvalue=False))
[(0, 'a'), (1, 'b'), (2, 'c'), (False, 'd'), (False, 'e'), (False, 'f')]

ملاحظات

  • الدّالة مُكافئة لما يلي:
class ZipExhausted(Exception):
    pass

def zip_longest(*args, **kwds):
    # zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
    fillvalue = kwds.get('fillvalue')
    counter = len(args) - 1
    def sentinel():
        nonlocal counter
        if not counter:
            raise ZipExhausted
        counter -= 1
        yield fillvalue
    fillers = repeat(fillvalue)
    iterators = [chain(it, sentinel(), fillers) for it in args]
    try:
        while iterators:
            yield tuple(map(next, iterators))
    except ZipExhausted:
        pass
  • إن كانت هناك إمكانيّة أن يكون أحد الكائنات القابلة للتّكرار لا نهائيًّا، فعندئذٍ يجب استعمال دالّة للحدّ من عدد الاستدعاءات (مثل الدّالة itertools.takewhile()‎ أو الدّالة itertools.islice()‎ مثلًا).

انظر أيضًا

مصادر