栈的Python消息传递



通过使用消息传递来完成代码,使

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)
    #...

相关内容

  • 没有找到相关文章

最新更新