gpt4 book ai didi

python - 链表类 __str__ 函数

转载 作者:行者123 更新时间:2023-11-30 22:14:12 25 4
gpt4 key购买 nike

我想创建这个函数

    >>> str(Link('Hello'))
'Hello'

>>> str(Link(1, Link(2)))
'1 -> 2'

>>> print(Link(1 / 2, Link(1 // 2)))
0.5 -> 0

>>> str(Link(Link(1, Link(2, Link(3))), Link(4, Link(5))))
'(1 -> 2 -> 3) -> 4 -> 5'

>>> print(Link(Link(Link(Link('Wow')))))
(((Wow)))

>>> print(Link(Link('a'), Link(Link('b'), Link(Link('c')))))
(a) -> (b) -> (c)

这是我的代码:

def __str__(self):
result = ''
while self.rest is not Link.empty:
result += '{0} -> '.format(self.first)
self = self.rest
return result + '{0}'.format(self.first)

但是,我不知道该怎么做才能完成最后三个文档测试。救命!!!

class Link(object):
empty = ()
def __init__(self, first, rest=empty):
self.first = first
self.rest = rest

最佳答案

看起来规则应该是,如果列表的头部本身就是一个列表,则格式化该列表,并将其放在括号中。像这样的事情:

first = '({0})'.format(self.first) if isinstance(self.first, Link) else first
result += '{0} -> '.format(first)

现在,避免在 rest 上使用递归有点奇怪。 ,但随后间接在 first 上使用递归。 (这就是 '{0}'.format(…) 的作用 - 如果您还没有定义 __format__ 方法,它会调用您的 __str__ 方法。)

因此,假设这是一个赋值,如果该赋值告诉您不要使用递归,您将需要将其转换为循环。另一方面,如果赋值没有说避免递归,那么对两者都进行递归会简单得多:

first = str(self.first)
if isinstance(self.first, Link):
first = '({0})'.format(first)
if self.rest is Link.empty:
return first
return '{0} -> {1}'.format(first, self.rest)
<小时/>

作为旁注:这是一个库存方案练习,移植到 Python 很糟糕(这意味着你的老师要么不了解或不喜欢 Python,这不是一个好兆头……),但它缺少一个一 block 。

通常,您应该处理,例如 Link(1, 2)Link(1, Link(2)) 不同。 (用 Lisp 术语来说,就是 (1 . 2)(1 2) 。)但是您给出的示例都没有对此进行测试,因此不清楚您应该为前者输出什么。 Sp…准备好因为没有读懂老师的想法而被扣分,除非你想做这样的事情:

first = str(self.first)
if isinstance(self.first, Link):
first = '({0})'.format(first)
if self.rest is Link.empty:
return first
rest = str(self.rest)
if isinstance(self.rest, Link):
return '{0} -> {1}'.format(first, self.rest)
else:
# surely (1 2 . 3) is not the same list as (1 2 3) but the spec left it out?
return '{0} .. {1}'.format(first, self.rest)

关于python - 链表类 __str__ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50594501/

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