Usando per & # 8230; else nei generatori Python
Altri suggerimenti
Ci sono un paio di modi per farlo. Puoi sempre usare Iterator
direttamente:
def iterate(i):
try:
i_iter = iter(i)
next = i_iter.next()
except StopIteration:
print 'i is empty'
return
while True:
yield next
next = i_iter.next()
Ma se sai di più su cosa aspettarti dall'argomento i
, puoi essere più conciso:
def iterate(i):
if i: # or if len(i) == 0
for next in i:
yield next
else:
print 'i is empty'
raise StopIteration()
Riassumendo alcune delle risposte precedenti, potrebbe essere risolto in questo modo:
def iterate(i):
empty = True
for value in i:
yield value
empty = False
if empty:
print "empty"
quindi non c'è davvero " else " clausola in questione.
Come notate, for..else
rileva solo una break
. Quindi è applicabile solo quando cerchi qualcosa e poi ferma .
Non è applicabile al tuo scopo non perché è un generatore, ma perché vuoi elaborare tutti gli elementi, senza fermarti (perché vuoi cederli tutti, ma non è questo il punto).
Quindi generatore o no, hai davvero bisogno di un booleano, come nella soluzione di Ber.
Se in questo modo è impossibile utilizzare per ... altro in questo modo, qual è l'approccio migliore a questo in modo che l'istruzione print venga eseguita solo quando non viene prodotto nulla?
Massimo che mi viene in mente:
>>> empty = True
>>> for i in [1,2]:
... empty = False
... if empty:
... print 'empty'
...
>>>
>>>
>>> empty = True
>>> for i in []:
... empty = False
... if empty:
... print 'empty'
...
empty
>>>
Che dire di if-else semplice?
def iterate(i):
if len(i) == 0: print 'i is empty'
else:
for value in i:
yield value