通过使用消息传递来填充代码
s = make_stack()
print(s("is_empty")) # True
s("push")(1)
s("push")(2)
print(s("peek")) # [2]
print(str(s("pop"))) # [2]
我的代码应该填补
的空白def make_stack():
items = []
def oplookup(msg):
if msg == "is_empty":
# blank #
elif msg == "clear":
# blank #
elif msg == "peek":
# blank #
elif msg == "push":
# blank #
elif msg == "pop":
# blank #
else:
raise Exception("stack doesn't" + msg)
return oplookup
我不了解代码的跟踪。我自己的试用代码是
def make_stack():
items = []
def oplookup(msg):
if msg == "is_empty":=
return True
elif msg == "clear":
return []
elif msg == "peek":
return make_stack.items[-1]
elif msg == "push":
return items.append(msg)
elif msg == "pop":
return items.pop()
else:
raise Exception("stack doesn't" + msg)
return oplookup
另一个问题是s(" push")(1),(1)采用什么参数?它是在msg或项目下吗?
答案 0 :(得分:1)
我认为你遇到的第一个问题是你需要从oplookup
返回一些可调用的东西,可能是一个函数。这些函数都需要操作(或测试)items
列表(他们可以访问它们,因为它们是闭包)。
以下是代码的外观:
def make_stack():
items = []
def oplookup(msg):
if msg == "is_empty":
def empty():
return not items
return empty
elif msg == "clear":
def clear():
items[:] = [] # slice assignment, to clear in-place
return clear
#...
请注意,在clear
中,我避免直接对items
进行分配,因为它位于封闭范围内。在Python 2中,重新分配items
是不可能的,因为它既不是本地变量也不是全局变量。在Python 3中,可以使用nonlocal
关键字进行重新分配。由于我不知道你正在使用什么版本的Python,我使用的切片分配在两个版本中都有效。
这种代码风格不是很恐怖。更自然的方法是使用方法创建一个类(但最终会得到一个稍微不同的API):
class Stack:
def __init__(self):
self.items = []
def is_empty(self):
return not self.items
def clear(self):
self.items = [] # this time we can replace the list
def push(self, item):
self.items.append(item)
#...