是否可以在LinkedList __str__方法中使用__iter__而不需要try和else? &



我想在这里扩展karin的回答,她使用for循环for循环来打印链表。

我希望__str__方法是SinglyLinkedList的一部分,但希望重用__iter__方法,因为它没有StopIteration附带的except子句,因为这里的答案说try语句是廉价的,除非捕获异常. 有什么办法吗?这可能吗?如果我理解正确的话,for循环调用__iter__,因此它将运行到相同的StopIteration

我有工作的代码在这里。

from typing import Optional
# Definition for singly-linked list.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def __str__(self):
return f"Node:{self.val} Next:{self.next.val if self.next else 'None'}n"
class SinglyLinkedList():
def __init__(self):
self.head = None
self.tail = None
def __iter__(self):
node = self.head

while node:
yield node 
node = node.next
def add(self, node):
if not self.head:
self.head = node 
else:
self.tail.next = node

self.tail = node
def __str__(self):
iterator = self.__iter__()
values = []
try: 
while True:
values.append( str(next(iterator).val) )
except StopIteration:
pass
return "->".join(values)
one = ListNode(1)
two = ListNode(2)
three = ListNode(3)
four = ListNode(4)
five = ListNode(5)
ll = SinglyLinkedList()
ll.add(one)
ll.add(two)
ll.add(three)
ll.add(four)
ll.add(five)
print(ll)

给出我想要的输出。

1->2->3->4->5

我能想到的另一种方法是在while循环

中重用代码
def __str__(self):
values = []
node = self.head
while node:
values.append( str(node.val) )
node = node.next
return "->".join(values)

您可以在这里使用一个简单的理解:

def __str__(self):
return '->'.join(str(i.val) for i in self)

好消息:

  • 没有逐个元素构建的列表(实际上根本没有列表,只是一个生成器)
  • 没有显式处理StopIteration(由推导式在下处理)

虽然我不期望有很大的性能提升,但至少编写和维护的时间更短了…

相关内容

  • 没有找到相关文章

最新更新