2017-05-16 1 views
1

Kann jemand erklären, warum:„next“ Anweisung mit variabler Ergebnis in StopIteration mit

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 

auf der Hand andere es unten zu tun gibt einem StopIteration

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

Kann nicht beide replizieren 'StopIteration' erhöhen – AChampion

+0

Sollte Ihr' table' etwas in ihm das zeigen, Problem? – mgilson

+0

'x> x 'ist nie wahr, daher ist der Iterator * immer * leer –

Antwort

0

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

danke, das war eine sehr detaillierte und leicht verständliche Antwort. sehr lehrreich. – raymund