AFAIK there's no way to have "yield" produce anything other than a generator. You could achieve the syntax you want with a decorator, although under the hood it would still be iterating over a (key,value) tuples so there's not really any point.
class GeneratorTupleWrapper: def __init__(self, g): self.g = g def next(self): key, self._value = g.next() return key def value(self): return self._value def magic_generator (func): def wrapper(*a, **b): return GeneratorTupleWrapper(func(*a, **b)) @magic_generator def kviter(d): for i in d: yield i, d[i] it = kviter(d) for key in it: if <something>: foo(it.value()) Also: dict.iteritems() enumerates (key,value) tuples for dictionaries, so kviter isn't necessary if d is a dictionary. I don't know the internal mechanism used by dict for iteritems, but it's a fair bet that it's more efficient than performing a lookup for every single key. -- http://mail.python.org/mailman/listinfo/python-list