Another generator solution, based on computing a permutation from its rank according to some natural order. Written for strings.
def perms(s) : def nth(n,L,k=1) : if k>len(L) : if n : raise StopIteration return '' return nth(n/k,L,k+1)+L.pop(n%k) for n in xrange(1<<30) : yield nth(n,list(s)) -- http://mail.python.org/mailman/listinfo/python-list