gpt4 book ai didi

python - __next__ 和 next 带参数

转载 作者:太空宇宙 更新时间:2023-11-04 10:03:56 25 4
gpt4 key购买 nike

我正在编写双向链表的实现。为了遍历列表,我使用了类似的东西:

class Node:
""" A node in our linked list """
def __init__(self, value: Any, next: Union['Node', None] =None,
previous: Union['Node', None] =None) -> None:
self.value = value
self.next = next
self.previous = previous

...

def __next__(self, direction: int =1) -> Union['Node', None]:
if direction == 1:
return self.get_next()
else:
return self.get_previous()

...

get_nextget_previous 只是 self.nextself.previous 的 getter。

但是,PyCharm 对我大喊大叫,因为我试图将 next 调用为下一个(some_node,direction=-1)。执行此操作的正确方法是什么?

最佳答案

除了__iter__还有__reversed__。两者都需要返回 iterators__next__ 方法应该在 iterators 上实现(而不是在节点类上)。请注意,所有魔术方法(当由 next 之类的函数调用而不是直接调用时)都需要实现预期参数,不多也不少。

例如,双向链表可以只实现 __iter____reversed__ 并依赖于 nextprevious 属性节点的:

class Node(object):
def __init__(self, val, nxt, prv):
self.val = val
self.nxt = nxt
self.prv = prv


class DoublyLinkedList(object):
def __init__(self, base=None, last=None):
self.base = base
self.last = last

def prepend(self, val):
new = Node(val, self.base, None)
if self.base is None:
self.base = new
self.last = new
else:
self.base.prv = new
self.base = new

def append(self, val):
new = Node(val, None, self.last)
if self.last is None:
self.base = new
self.last = new
else:
self.last.nxt = new
self.last = new

def __iter__(self):
current = self.base
while current is not None:
yield current
current = current.nxt

def __reversed__(self):
current = self.last
while current is not None:
yield current
current = current.prv

例如:

dl = DoublyLinkedList()
dl.prepend(10)
dl.prepend(20)
dl.prepend(30)

for i in dl:
print(i.val)

给出:

30
20
10

类似于reversed:

for i in reversed(dl):
print(i.val)

# prints:
10
20
30

关于python - __next__ 和 next 带参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41988691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com