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

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

تعيد الدّالة itertools.accumulate()‎ مُكرّرًا يُعيد مجموعات مُتراكمة، أو نتائج مُتراكمةً من دالّة أخرى.

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

itertools.accumulate(iterable[, func])

المعاملات

iterable

الكائن القابل للتّكرار الذي ستُجمع عناصره بشكل تراكميّ أو ستُمرَّر عناصره إلى الدّالة الاختياريّة func. يُمكن لعناصر الكائن القابل للتّكرار أن تكون من أيّ نوع من أنواع المُعاملات التي تقبلها الدّالة func (مثلًا، مع عمليّة الجمع الافتراضيّة، يُمكن للعناصر أن تكون أي نوع قابل للجمع، ما يشمل Decimal وFraction.) إن كان الكائن iterable فارغًا، فالكائن النّاتج سيكون فارغًا كذلك.

func

مُعامل اختياريّ.

الدّالة التي ستُنفَّذ على المجموع التّراكمي والعنصر التّالي من الكائن القابل للتّكرار المُعطى.

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

كائن مُكرّر يحتوي على قيم مُتراكمة من نتائج الدّالة.

أمثلة

هناك العديد من الاستعمالات المُمكنة للمُعامل func. يُمكن تمرير الدّالة min‎()‎ لها للحصول على قيمة دنيا مُتتاليّة (running minimum)، أو الدّالة max‎()‎ لها للحصول على قيمة قصوى مُتتاليّة، أو الدّالة operator.mul‎()‎ لها للحصول على حاصل ضرب مُتتالٍ (running product).

ويُمكن بناء جداول استهلاك الدين (Amortization tables) عبر تراكم الفائدة وتطبيق الدّفعات. يُمكن نمذجة علاقات الاستدعاء الذاتي ذات المستوى الأول عبر تمرير القيمة البدئيّة في الكائن القابل للتّكرار واستخدام المجموع المُتراكم فقط في مُعامل الدّالة func:

>>> data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
>>> list(accumulate(data, operator.mul))     # حاصل ضرب مُتتال
[3, 12, 72, 144, 144, 1296, 0, 0, 0, 0]
>>> list(accumulate(data, max))              # قيمة قصوى متتاليّة
[3, 4, 6, 6, 6, 9, 9, 9, 9, 9]

# استهلك دين خمسة في المئة من ألف مع أربعة دفعات من فئة تسعين
# Amortize a 5% loan of 1000 with 4 annual payments of 90
>>> cashflows = [1000, -90, -90, -90, -90]
>>> list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt))
[1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]

# علافة استدعاء ذاتيّة عشوائيّة https://en.wikipedia.org/wiki/Logistic_map
>>> logistic_map = lambda x, _:  r * x * (1 - x)
>>> r = 3.8
>>> x0 = 0.4
>>> inputs = repeat(x0, 36)     # تُستعمل القيمة البدئيّة فقط
>>> [format(x, '.2f') for x in accumulate(inputs, logistic_map)]
['0.40', '0.91', '0.30', '0.81', '0.60', '0.92', '0.29', '0.79', '0.63',
 '0.88', '0.39', '0.90', '0.33', '0.84', '0.52', '0.95', '0.18', '0.57',
 '0.93', '0.25', '0.71', '0.79', '0.63', '0.88', '0.39', '0.91', '0.32',
 '0.83', '0.54', '0.95', '0.20', '0.60', '0.91', '0.30', '0.80', '0.60']

ملاحظات

الدّالة مُكافئة لما يلي:

def accumulate(iterable, func=operator.add):
    'Return running totals'
    # accumulate([1,2,3,4,5]) --> 1 3 6 10 15
    # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
    it = iter(iterable)
    try:
        total = next(it)
    except StopIteration:
        return
    yield total
    for element in it:
        total = func(total, element)
        yield total

انظر أيضًا

مصادر