2017-05-16 1 views
1

Quelqu'un peut-il expliquer pourquoi:en utilisant « next » avec un résultat variable StopIteration

table ={1249.99: 36.30, 
     1749.99: 54.50, 
     2249.99: 72.70, 
     2749.99: 90.80, 
     3249.99: 109.00, 
     3749.99: 127.20, 
     4249.99: 145.30} 

x = 1000 
y = next(x for x in table if x > 1000) work fines 

en revanche le faire ci-dessous donne un StopIteration

y = next(x for x in table if x > x) 
+1

Impossible de reproduire les deux 'augmenter StopIteration' – AChampion

+0

Si votre' table' avoir quelque chose à démontrer la problème? – mgilson

+0

'x> x' n'est jamais vrai, donc l'itérateur est * toujours * vide –

Répondre

0

Le premier fonctionne parce que x sera toujours être plus grand que 1000, puisque la variable x n'est pas la même x vous avez défini sur la ligne précédente, mais à la place, le x de for x in table. Donc x sont la clé suivante de table. Et que toutes les clés sont supérieures à 1000, donc l'itérateur créé n'est pas vide.

next(x for x in table if x > 1000) 
# similar to: 
# next(iter((1249.99, 1749.99, 249.99, 2749.99, 3249.99, 3749.99, 4249.99))) 

Le deuxième exemple soulevé StopIteration parce x ne sera jamais plus grand que x, ce qui signifie que vous obtenez la prochaine itération d'un itérateur vide.

next(x for x in table if x > x) 
# similar to: 
# next(iter(())) 

Considérez ce qui suit:

Votre code est équivalent à ceci:

def gen_a(table): 
    for x in table: # same as for x in table.keys() 
     if x > 1000: 
      yield x 

def gen_b(table): 
    for x in table: # same as for x in table.keys() 
     if x > x: # will never happen 
      yield x 

table ={1249.99: 36.30, 
     1749.99: 54.50, 
     2249.99: 72.70, 
     2749.99: 90.80, 
     3249.99: 109.00, 
     3749.99: 127.20, 
     4249.99: 145.30} 

x = 1000 # note that x isn't in the same scope as the other x's 

print(next(gen_a(table))) # result varies since dict are unordered, I got 4249.99 

print(next(gen_b(table))) # raises a StopIteration 
+1

merci, c'était une réponse très détaillée et facile à comprendre. très éducatif. – raymund