Python: fonction next()

j'apprends le Python à partir d'un livre, et je suis tombé sur cet exemple:

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

comme je suis un débutant absolu, et que l'auteur n'a fourni aucune explication de l'exemple ou de la fonction next (), Je ne comprends pas ce que fait le code.

36
demandé sur 3zzy 2009-11-14 05:17:05

2 réponses

(sum(row) for row in M) crée ce qu'on appelle un générateur. Ce générateur va évaluer l'expression (sum(row)) une fois pour chaque ligne M. Cependant, le générateur ne fait encore rien, nous venons de le mettre en place.

la déclaration next(G) en fait,pistes le générateur sur M. Donc, si vous exécutez next(G) une fois, vous obtiendrez la somme de la première ligne. Si vous l'exécutez encore, vous obtiendrez la somme de la deuxième rangée, et ainsi sur.

>>> 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

Voir aussi:

64
répondu jtbandes 2009-11-14 02:36:37

si vous avez fait tout ce chemin, alors vous devriez déjà savoir comment fonctionne une déclaration commune pour-dans.

L'instruction suivante:

for row in M: print row

verrait M comme une séquence de 3 lignes (sous-séquences) composées de 3 éléments chacun, et itérerait par M, sortant chaque ligne sur la matrice:

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

vous le saviez, Eh bien...

vous pouvez voir des générateurs tout comme du sucre syntaxique autour des boucles for-in. Oublier la somme (), et tapez quelque chose comme ça à la VEILLE:

G = (row for row in M)
print G
for a in G: print a

vous voyez, le Générateur ne peut pas être directement représenté sous forme de texte, pas seulement comme une séquence peut l'être. Mais, vous pouvez itérer à travers un générateur comme si c'était une séquence.

vous trouverez alors de grandes différences, mais la base est que vous pouvez utiliser un générateur non pas pour retourner seulement la valeur de chaque élément dans la séquence, mais le résultat de n'importe quelle expression. Dans l'exemple du tutoriel, l'expression est sum(row).

Essayez ce qui suit et voir ce qui se passe:

G = ("("+str(row[2])+";"+str(row[1])+";"+str(row[0])+")" for row in M)
G.next()
G.next()
G.next()
10
répondu Simón 2009-11-14 03:49:51