通过使用消息传递来完成代码,使
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还是item项下?
我认为你的第一个问题是你需要从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,所以我使用了一个切片赋值,它在两个版本中都有效。
这种风格的代码不是很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)
#...