This may help to see a version that does not use generators:
def perm_generator(lst):
res = []
if len(lst) == 1:
return [lst]
else:
for i in range(len(lst)):
for perm in perm_generator(lst[:i] + lst[i+1:]):
res.append([lst[i]] + perm)
return res
gen = perm_generator([1,2,3])
print gen
As you can see, this is not a "find and replace" "return" with a "yield". In the "return" version, we need to accumulate the result, and in the "yield" version all we need to do is to "issue" the current permutation.