2015-02-04 4 views
2

Мне нужна помощь в написании метода __iter__() для моего класса UnorderedList(). Я попытался это:Python Связанный список с узлами. Iterable

def __iter__(self): 
    current = self 
    while current != None: 
     yield current 

Но петля while не останавливается. Вот остальные мои классы и код:

class Node: 
    def __init__(self,initdata): 
     self.data = initdata 
     self.next = None 

    def getData(self): 
     return self.data 

    def getNext(self): 
     return self.next 

    def setData(self,newdata): 
     self.data = newdata 

    def setNext(self,newnext): 
     self.next = newnext 

class UnorderedList: 

    def __init__(self): 
     self.head = None 
     self.count = 0 
+2

Почему бы * * это остановить? Вы устанавливаете 'current' в экземпляр' self', а затем повторно 'yield'. Ничто * не меняется * внутри цикла, поэтому логически оно никогда не должно начинаться или никогда не заканчиваться. Кроме того, обратите внимание, что вы должны проверить идентификатор для 'None'; 'while current is not None:'. – jonrsharpe

ответ

4

Если вы хотите перебрать все элементы succeedingly, вы должны сделать

def __iter__(self): 
    # Remember, self is our UnorderedList. 
    # In order to get to the first Node, we must do 
    current = self.head 
    # and then, until we have reached the end: 
    while current is not None: 
     yield current 
     # in order to get from one Node to the next one: 
     current = current.next 

так, что на каждом шагу вы идете один шаг дальше.

BTW, сеттеры и геттеры не используются в Python в виде методов. Если они вам нужны, используйте свойства, в противном случае опустите их в целом.

Так вобще

class Node(object): 
    def __init__(self, initdata): 
     self.data = initdata 
     self.next = None 

class UnorderedList(object): 

    def __init__(self): 
     self.head = None 
     self.count = 0 

    def __iter__(self): 
     current = self.head 
     while current is not None: 
      yield current 
      current = current.next 
+0

Я пробовал это, но он дает ошибку атрибута: объект UnorderedList не имеет атрибута 'next'. – Newbie

+0

@Newbie Вы заметили мое редактирование? Кроме того, если кто-то дает вам код с незначительными ошибками, вы можете найти их самостоятельно. Если 'UnorderedList' не имеет' next', а 'head', вы, конечно, можете обратиться к этому. Следующие шаги, от одного узла к следующему, происходят с '.next'. – glglgl

+0

Я сделал еще несколько исследований и понял, что это был немой вопрос. Спасибо за объяснение. – Newbie