diff --git a/Lib/weakref.py b/Lib/weakref.py
index cfe9456bcc2949595a74801a337eb9820c220f48..9373f024057b7c7706a29e43dcf16a29f8b03270 100644
--- a/Lib/weakref.py
+++ b/Lib/weakref.py
@@ -277,54 +277,26 @@ class WeakKeyDictionary(UserDict.UserDict):
             self.update(kwargs)
 
 
-class BaseIter:
-    def __iter__(self):
-        return self
-
-
-class WeakKeyedKeyIterator(BaseIter):
-    def __init__(self, weakdict):
-        self._next = weakdict.data.iterkeys().next
-
-    def next(self):
-        while 1:
-            wr = self._next()
-            obj = wr()
-            if obj is not None:
-                return obj
-
-
-class WeakKeyedItemIterator(BaseIter):
-    def __init__(self, weakdict):
-        self._next = weakdict.data.iteritems().next
-
-    def next(self):
-        while 1:
-            wr, value = self._next()
-            key = wr()
-            if key is not None:
-                return key, value
-
-
-class WeakValuedValueIterator(BaseIter):
-    def __init__(self, weakdict):
-        self._next = weakdict.data.itervalues().next
-
-    def next(self):
-        while 1:
-            wr = self._next()
-            obj = wr()
-            if obj is not None:
-                return obj
-
-
-class WeakValuedItemIterator(BaseIter):
-    def __init__(self, weakdict):
-        self._next = weakdict.data.itervalues().next
-
-    def next(self):
-        while 1:
-            wr = self._next()
-            value = wr()
-            if value is not None:
-                return wr.key, value
+def WeakKeyedKeyIterator(weakdict):
+    for wr in weakdict.data.iterkeys():
+        obj = wr()
+        if obj is not None:
+            yield obj
+
+def WeakKeyedItemIterator(weakdict):
+    for wr, value in weakdict.data.iteritems():
+        key = wr()
+        if key is not None:
+            yield key, value
+
+def WeakValuedValueIterator(weakdict):
+    for wr in weakdict.data.itervalues():
+        obj = wr()
+        if obj is not None:
+            yield obj
+
+def WeakValuedItemIterator(weakdict):
+    for wr in weakdict.data.itervalues():
+        value = wr()
+        if value is not None:
+            yield wr.key, value