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
Impossible de reproduire les deux 'augmenter StopIteration' – AChampion
Si votre' table' avoir quelque chose à démontrer la problème? – mgilson
'x> x' n'est jamais vrai, donc l'itérateur est * toujours * vide –