Como o 'rendimento' funciona neste gerador de permutação?

def perm_generator(lst):
    if len(lst) == 1:
        yield lst
    else:
        for i in range(len(lst)):
            for perm in perm_generator(lst[:i] + lst[i+1:]):
                yield [lst[i]] + perm

Esse código está me incomodando, pois não entendo como oyields se conectam. Meu entendimento era queyield age como umreturn, mas para temporariamente até que seja chamado novamente. Como estesyieldtrabalho?