الفرق بين المراجعتين ل"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()‎.

انظر أيضًا

مصادر