الفرق بين المراجعتين لصفحة: «Python/itertools/tee»

من موسوعة حسوب
 
(3 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:الدالة <code>itertools.takewhile()‎</code> في بايثون}}</noinclude>
<noinclude>{{DISPLAYTITLE:الدالة <code>itertools.tee()‎</code> في بايثون}}</noinclude>
تعيد الدّالة <code>itertools.takewhile()‎</code> مُكرّرًا يُعيد العناصرَ من الكائن القابل للتّكرار المعطى ما دامت العبارة المنطقيّة المُعطاة (التي تكون دالّة تستقبل العنصر وتُعيد قيمة منطقيّة) تُساوي القيمة المنطقيّة <code>True</code>.
تعيد الدّالة <code>itertools.tee()‎</code> عددًا مُحدّدًا من المُكرّرات المُستقلّة عن بعضها البعض من كائن واحد قابل للتّكرار.
 
تعمل هذه الدّالة بطريقة مُعاكسة للدّالة <code>[[Python/itertools/dropwhile|itertools.dropwhile()‎]]</code> التّي تبدأ في إعادة القيم عند عدم تحقّق شرط العبارة المنطقيّة.


== البنية العامة ==
== البنية العامة ==
<syntaxhighlight lang="python3">
<syntaxhighlight lang="python3">
itertools.takewhile(predicate, iterable)
itertools.tee(iterable, n=2)
</syntaxhighlight>
</syntaxhighlight>


== المعاملات ==
== المعاملات ==
=== <code>predicate</code> ===
=== <code>iterable</code> ===
العبارة المنطقيّة التي ستُحدّد ما إذا كان المُكرّر سيتوقّف أو لا.
الكائن القابل للتّكرار.


عادة ما تكون دالّة تستقبل العنصر، إن أعادت القيمة <code>True</code> فسيُعاد العنصر، وما إن تُعيد القيمةَ <code>False</code> حتى يتوقّف المُكرّر عن إعادة العناصر.
=== <code>n</code> ===
 
عدد المُكرّرات المُستقلّة المرغوب إنشاؤها من الكائن <code>iterable</code>.
=== <code>iterable</code> ===
الكائن القابل للتّكرار المرغوب إعادة العناصر منه ما دامت قيمة <code>predicate</code> المُعادَة تُساوي <code>True</code>.


== القيمة المعادة ==
== القيمة المعادة ==
مُكرّر يحتوي على جميع العناصر من بداية الكائن القابل للتّكرار إلى العنصر الذي أُعيدت له العبارة المنطقيّة القيمةَ <code>False</code>.  
عددٌ <code>n</code> من المُكرّرات المُستقلّة المُولَّدة من الكائن القابل للتّكرار المُعطى.


== أمثلة ==
== أمثلة ==
المثال التّالي يوضّح كيفيّة عمل هذه الدّالة، هنا يُعيد المُكرّر جميع العناصر إلى العنصر <code>6</code> لأنّه لا يُحقّق شرط [[Python/lambda-expressions|تعبير lambda]] المُعطى:
المثال التّالي يوضّح كيفيّة عمل هذه الدّالة:
<syntaxhighlight lang="python3">
<syntaxhighlight lang="python3">
>>> it = itertools.takewhile(lambda x: x<5, [1,4,6,4,1])
>>> it = itertools.tee('abc', 2)
>>> list(it)
>>> it
[1, 4]
(<itertools._tee object at 0x7f79c6fc9f48>, <itertools._tee object at 0x7f79c4e73588>)
>>> [list(i) for i in it]
[['a', 'b', 'c'], ['a', 'b', 'c']]
</syntaxhighlight>
</syntaxhighlight>
لاحظ أنّ طريقة استعمال الدّالة مُشابهة لطريقة استعمال الدّالة <code>[[Python/filter|filter()]]</code>‎.


== ملاحظات ==
== ملاحظات ==
الدّالة مُكافئة لما يلي:
* الدّالة مُكافئة لما يلي:
<syntaxhighlight lang="python3">
<syntaxhighlight lang="python3">
def takewhile(predicate, iterable):
def tee(iterable, n=2):
     # takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4
     it = iter(iterable)
     for x in iterable:
     deques = [collections.deque() for i in range(n)]
         if predicate(x):
    def gen(mydeque):
            yield x
         while True:
        else:
            if not mydeque:            # when the local deque is empty
             break
                try:
                    newval = next(it)   # fetch a new value and
                except StopIteration:
                    return
                for d in deques:       # load it to all the deques
                    d.append(newval)
             yield mydeque.popleft()
    return tuple(gen(d) for d in deques)
</syntaxhighlight>
</syntaxhighlight>
ستُساعد الشّيفرة أعلاه على توضيح ما تقوم به الدّالة (رغم أنّ التّطبيق الفعليّ أكثر تعقيدًا ويستخدم طابور FIFO واحدًا فقط).
* حالما تقسم الدّالة <code>itertools.tee()‎</code> مُكرّرًا فلا يجب استخدام الكائن القابل للتّكرار الأصليّ في أي مكان آخر، وإلّا قد يتقدّم دون إعلام كائنات  <code>itertools.tee()‎</code>.
* قد تحتاج هذه الدّالة إلى ذاكرة كبيرة حسب حجم البيانات المؤقّتة التي ستحتاج إلى تخزينها. إن كان مُكرّرٌ يستخدم مُعظم أو كلّ البيانات قبل أن يبدأ مُكرّر آخر، فاستخدام الدّالة [[Python/list|<code>list()‎</code>]] أسرع من الدّالة <code>itertools.tee()‎</code>.


== انظر أيضًا ==
== انظر أيضًا ==
* [[Python/iterators|المكرِّرات Iterators في بايثون]].
* [[Python/iterators|المكرِّرات Iterators في بايثون]].
* [[Python/generators|المولدات Generators في بايثون]].
* [[Python/generators|المولدات Generators في بايثون]].
* الدّالة <code>[[Python/itertools/dropwhile|itertools.dropwhile()‎]]</code> التّي تبدأ في إعادة القيم عند عدم تحقّق شرط العبارة المنطقيّة.
* الدالة <code>[[Python/list|list()‎]]</code>: تُحوّل كائنًا قابلًا للتّكرار إلى قائمة.
*الدّالة <code>[[Python/filter|filter()]]</code>‎: لترشيح عناصر كائن قابل للتّكرار حسب تعبير شرطيّ.


== مصادر ==
== مصادر ==
* [https://docs.python.org/3/library/itertools.html#itertools.takewhile قسم الدالة itertools.takewhile في توثيق Python الرسمي].
* [https://docs.python.org/3/library/itertools.html#itertools.tee قسم الدالة itertools.tee في توثيق Python الرسمي].
[[تصنيف:Python]]
[[تصنيف:Python]]
[[تصنيف:Python Function]]
[[تصنيف:Python Function]]
[[تصنيف:Python Modules]]
[[تصنيف:Python itertools]]
[[تصنيف:Python itertools]]

المراجعة الحالية بتاريخ 06:15، 19 يونيو 2018

تعيد الدّالة itertools.tee()‎ عددًا مُحدّدًا من المُكرّرات المُستقلّة عن بعضها البعض من كائن واحد قابل للتّكرار.

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

itertools.tee(iterable, n=2)

المعاملات

iterable

الكائن القابل للتّكرار.

n

عدد المُكرّرات المُستقلّة المرغوب إنشاؤها من الكائن iterable.

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

عددٌ n من المُكرّرات المُستقلّة المُولَّدة من الكائن القابل للتّكرار المُعطى.

أمثلة

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

>>> it = itertools.tee('abc', 2)
>>> it
(<itertools._tee object at 0x7f79c6fc9f48>, <itertools._tee object at 0x7f79c4e73588>)
>>> [list(i) for i in it]
[['a', 'b', 'c'], ['a', 'b', 'c']]

ملاحظات

  • الدّالة مُكافئة لما يلي:
def tee(iterable, n=2):
    it = iter(iterable)
    deques = [collections.deque() for i in range(n)]
    def gen(mydeque):
        while True:
            if not mydeque:             # when the local deque is empty
                try:
                    newval = next(it)   # fetch a new value and
                except StopIteration:
                    return
                for d in deques:        # load it to all the deques
                    d.append(newval)
            yield mydeque.popleft()
    return tuple(gen(d) for d in deques)

ستُساعد الشّيفرة أعلاه على توضيح ما تقوم به الدّالة (رغم أنّ التّطبيق الفعليّ أكثر تعقيدًا ويستخدم طابور FIFO واحدًا فقط).

  • حالما تقسم الدّالة itertools.tee()‎ مُكرّرًا فلا يجب استخدام الكائن القابل للتّكرار الأصليّ في أي مكان آخر، وإلّا قد يتقدّم دون إعلام كائنات itertools.tee()‎.
  • قد تحتاج هذه الدّالة إلى ذاكرة كبيرة حسب حجم البيانات المؤقّتة التي ستحتاج إلى تخزينها. إن كان مُكرّرٌ يستخدم مُعظم أو كلّ البيانات قبل أن يبدأ مُكرّر آخر، فاستخدام الدّالة list()‎ أسرع من الدّالة itertools.tee()‎.

انظر أيضًا

مصادر