الدالة itertools.product()
في بايثون
تعيد الدّالة 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)