الفرق بين المراجعتين ل"Python/itertools/tee"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(إضافة الصّفحة)
سطر 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> التّي تبدأ في إعادة القيم عند عدم تحقّق شرط العبارة المنطقيّة.
+
* [[Python/list|الدالة <code>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 Modules]]
 
[[تصنيف:Python itertools]]
 
[[تصنيف:Python itertools]]

مراجعة 11:22، 18 يونيو 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()‎.

انظر أيضًا

مصادر