Функция 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()