Функция Python: next()
Я изучаю Python из книги, и я наткнулся на этот пример:
M = [[1,2,3],
[4,5,6],
[7,8,9]]
G = (sum(row) for row in M) # create a generator of row sums
next(G) # Run the iteration protocol
Поскольку я являюсь абсолютным новичком, и автор не предоставил никакого объяснения примера или функции next(), я не понимаю, что делает этот код.
Ответы
Ответ 1
Выражение (sum(row) for row in M)
создает то, что называется генератором . Этот генератор будет оценивать выражение (sum(row)
) один раз для каждой строки в M
. Однако генератор ничего не делает, мы только что установили его.
Оператор next(G)
фактически запускает генератор на M
. Итак, если вы запустите next(G)
один раз, вы получите сумму первой строки. Если вы запустите его снова, вы получите сумму второй строки и т.д.
>>> M = [[1,2,3],
... [4,5,6],
... [7,8,9]]
>>>
>>> G = (sum(row) for row in M) # create a generator of row sums
>>> next(G) # Run the iteration protocol
6
>>> next(G)
15
>>> next(G)
24
См. также:
Ответ 2
Если вы зашли так далеко, вы уже должны знать, как работает общий оператор for-in.
Следующее утверждение:
for row in M: print row
будет видеть M как последовательность из трех строк (подпоследовательностей), состоящую из 3-х элементов каждый и итерации через M, выводя каждую строку в матрицу:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
Ты знал это, ну...
Вы можете видеть Генераторы так же, как некоторый синтаксический сахар вокруг циклов for-in.
Забудьте о вызове sum() и введите что-то вроде этого в IDLE:
G = (row for row in M)
print G
for a in G: print a
Вы видите, что Генератор не может быть непосредственно представлен как текст, а не только как последовательность.
Но вы можете выполнять итерацию через генератор, как если бы это была последовательность.
Затем вы найдете некоторые большие различия, но основы в том, что вы можете использовать генератор, чтобы не возвращать только значение каждого элемента в последовательности, а результат любого выражения. В примере учебника выражение представляет собой сумму (строку).
Попробуйте следующее и посмотрите, что произойдет:
G = ("("+str(row[2])+";"+str(row[1])+";"+str(row[0])+")" for row in M)
G.next()
G.next()
G.next()