Итог, itertools.product
уже является итератором . Вам не нужно писать свои собственные. (Генератор - это своего рода итератор.) Например:
>>> x = [[1, 2], [3, 4]]
>>> p = itertools.product(*x)
>>> next(p)
(1, 3)
>>> next(p)
(1, 4)
Теперь, чтобы объяснить, кажется, что вы неправильно понимаете что-то фундаментальное. Функция генератора возвращает итератор генератора . Вот что вы видите из print:
>>> iter_tools(*x)
<generator object iter_tools at 0x7f05d9bc3660>
Используйте list()
для приведения итератора к списку.
>>> list(iter_tools(*x))
[[(1, 3), (1, 4), (2, 3), (2, 4)]]
Обратите внимание, что это вложенный список. Это потому, что ваш iter_tools
дает один список, а не больше ничего. В этой заметке эта часть не имеет смысла, потому что приведение itertools.product
к списку сводит на нет всю цель итератора - ленивое вычисление . Если вы действительно хотите получить значения от итератора, вы должны использовать yield from
:
def iter_tools(*array):
yield from itertools.product(*array)
В этом случае iter_tools
бессмысленно, но если ваш фактический iter_tools
более сложный, это может
См. также:
Этот ответ частично основан на juanpa.arrivillaga s комментарий