الدالة 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