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

من موسوعة حسوب
مراجعة 06:14، 19 يونيو 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (←‏مصادر)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

تعيد الدّالة itertools.product()‎ حاصل الضرب الديكارتي (أو الضرب المباشر) للكائنات القابلة للتّكرار المُعطاة.

طريقة العمل مُكافئة لحلقات for المُتداخلة في تعبير مُولّد. مثلًا، الاستدعاء product(A, B)‎ يُعيد ما يُعيده التّعبير ‎((x,y)‎ for‎ x‎ in A‎ for y in B‎)‎.

تدور الحلقات المُتداخلة مثل عدّاد مسافة (odometer) من العنصر على أقصى اليمين مُتقدّمةً عند كلّ تكرار. يُنشئ هذا النّسق ترتيبًا مُعجميًّا (lexicographic)، لذا فإن كانت الكائنات القابلة للتّكرار المُعطاة مُرتّبةً، فستُنتج صفوف الضّرب المُباشر مُرتّبةً.

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

itertools.product(*iterables, repeat=1)

المعاملات

iterables

الكائنات القابلة للتّكرار المرغوب الحصول على حاصل ضرب مُباشر لها.

repeat

لحساب حاصل الضّرب المُباشر لكائن قابل للتّكرار مع نفسه، حدّد عدد مرّات التّكرار المرغوبة بتمرير العدد كقيمة للمُعامل repeat الاختياريّ. فمثلًا، الاستدعاء product(A, repeat=4)‎ هو نفسه الاستدعاء product(A, A, A, A)‎.

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

حاصل ضرب مُباشر بين عناصر الكائنات القابلة للتّكرار المُعطاة.

أمثلة

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

>>> list(itertools.product('ABCD', 'xy'))
[('A', 'x'), ('A', 'y'), ('B', 'x'), ('B', 'y'),
 ('C', 'x'), ('C', 'y'), ('D', 'x'), ('D', 'y')]
>>> list(itertools.product(range(2), repeat=3))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1),
 (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

ملاحظات

الدّالة مُكافئة لما يلي، إلّا أنّ التّطبيق الفعلي لا يبني نتائج وسيطةً في الذّاكرة:

def product(*args, repeat=1):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = [tuple(pool) for pool in args] * repeat
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

انظر أيضًا

مصادر