Die erste funktioniert, weil x
wird immer größer sein als 1000, da die x
Variable ist nicht das gleiche x
Sie in der vorherigen Zeile definiert, sondern stattdessen die x
von for x in table
. So sind x
der nächste Schlüssel von table
. Und da alle Schlüssel größer als 1000 sind, ist der erstellte Iterator nicht leer.
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)))
Das zweite Beispiel angehoben StopIteration
weil x
nie größer sein als x
, was bedeutet, dass Sie die nächste Iteration von einem leeren Iterator fühlen.
next(x for x in table if x > x)
# similar to:
# next(iter(()))
Beachten Sie Folgendes:
Ihr Code ist dies gleichbedeutend mit:
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
Kann nicht beide replizieren 'StopIteration' erhöhen – AChampion
Sollte Ihr' table' etwas in ihm das zeigen, Problem? – mgilson
'x> x 'ist nie wahr, daher ist der Iterator * immer * leer –