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
scroll top