【问题标题】:Problem breaking out of a generator while iterating through a for loop在迭代 for 循环时出现生成器的问题
【发布时间】:2020-02-19 04:56:24
【问题描述】:

分配使用生成器从头开始设计链表类以遍历列表,但我在调试此问题时遇到了问题:

class LinkedList:

    def __init__(self, data = None):
        self.node = Node(data)
        self.first = self.node 
        self.last = self.node
        self.n = 1

    def append(self, data = None):
        new = Node(data)
        self.last.next = new
        self.last = new
        self.n += 1

    def __iter__(self):
        self.index = self.first
        return self.generator()

    def generator(self):
        for i in range(0, self.n):
            yield self.index
            self.index = self.index.next

当前生成器通过的测试之一是:

for n in a:
    print n

# which should and does output

0
1
2

但是,在这种情况下,它无法输出正确的值

for n in a:
    if n == 2:
        break
    else:
        print n

# Outputs 0 1 2, instead of:

0
1

我认为我对生成器的理解不足,希望你们能提供任何帮助!

【问题讨论】:

  • 你应该先print n然后检查if n == 2: break

标签: python iterator generator


【解决方案1】:
  • 您不应该使用n == 2 作为中断条件。

试试这个:

# Assume your defined class `Node.py` like this:
class Node:
    def __init__(self, data=None):
        self.val = data
        self.next = None

# I didn't modify your `LinkedList.py`
class LinkedList:

    def __init__(self, data=None):
        self.node = Node(data)
        self.first = self.node
        self.last = self.node
        self.n = 1

    def append(self, data=None):
        new = Node(data)
        self.last.next = new
        self.last = new
        self.n += 1

    def __iter__(self):
        self.index = self.first
        return self.generator()

    def generator(self):
        for i in range(0, self.n):
            yield self.index
            self.index = self.index.next


if __name__ == '__main__':
    ass = LinkedList(0)
    ass.append(1)
    ass.append(2)
    ass.append(3)

    for n in ass:
        if n.val == 2:  # Notice here
            break
        else:
            print(n.val)  # And here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    相关资源
    最近更新 更多