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

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

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

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

itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])

المعاملات

iterable

الكائن القابل للتّكرار المرغوب تقطيع عناصره.

start

مُعامل اختياريّ يُمثّل نقطة البداية، إن كانت قيمتها لا تُساوي الصّفر، فستُتجاهل عناصر الكائن iterable إلى حين الوصول إلى العنصر الذي يُوافق فهرسه (index) قيمة start.

stop

مُعامل يُحدّد نقطة التّوقف، إن كانت قيمتُه القيمةَ None فسيستمرّ التّكرار إلى حين انتهاء قيم الكائن iterable (هذا إن انتهت قيمه). أمّا إن كانت قيمته عددًا صحيحًا موجبًا، فسيتوقّف التّكرار عند الوصول إلى العنصر الذي يُوافق فهرسه قيمة stop.

step

مُعامل اختياريّ يُمثّل الخطوة التي سيتقدّم بها التّكرار، قيمته الافتراضيّة هي 1 أي أنّ كلّ عنصر سيتبع العنصر الذي سبقه دون تخطّ أيّ عنصر، ويتخطّى المُكرّرُ النّاتج العناصر بحسب قيمة هذا المُعامل. فإن كانت قيمته مثلا هي القيمة 2 فسيتقدّم المُكرّر بخطوتين في كلّ مرّة، ما سيتخطّى عنصرًا واحدًا في تكرار.

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

مُكرّر يُقطّع عناصر الكائن القابل للتّكرار حسب المُعاملات المُعطاة.

أمثلة

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

>>> list(itertools.islice('ABCDEFG', 2))
['A', 'B']
>>> list(itertools.islice('ABCDEFG', 2, 4))
['C', 'D']
>>> list(itertools.islice('ABCDEFG', 2, None))
['C', 'D', 'E', 'F', 'G']
>>> list(itertools.islice('ABCDEFG', 0, None, 2))
['A', 'C', 'E', 'G']

ملاحظات

  • لا تقبل الدّالة itertools.islice()‎ قيمًا سالبةً للمُعاملات start وstop وstep.
  • يُمكن استخدام الدّالة لاستخراج حقولٍ مُعيّنة من بيانات مُسطّحة، فمثلًا، يُمكن لتقرير مُتعدّد الأسطر أن يحتوي على حقل اسم صاحب التّقرير في كلّ سطرٍ ثالثٍ من البيانات.
  • الدّالة مُكافئة لما يلي:
def islice(iterable, *args):
    # islice('ABCDEFG', 2) --> A B
    # islice('ABCDEFG', 2, 4) --> C D
    # islice('ABCDEFG', 2, None) --> C D E F G
    # islice('ABCDEFG', 0, None, 2) --> A C E G
    s = slice(*args)
    start, stop, step = s.start or 0, s.stop or sys.maxsize, s.step or 1
    it = iter(range(start, stop, step))
    try:
        nexti = next(it)
    except StopIteration:
        # Consume *iterable* up to the *start* position.
        for i, element in zip(range(start), iterable):
            pass
        return
    try:
        for i, element in enumerate(iterable):
            if i == nexti:
                yield element
                nexti = next(it)
    except StopIteration:
        # Consume to *stop*.
        for i, element in zip(range(i + 1, stop), iterable):
            pass

انظر أيضًا

مصادر