类方法没有返回值

3
我正在学习MTIx 6.00.1x计算机科学入门课程,并且在创建类方法方面遇到了问题。具体来说,在我的“队列”类中,“remove”函数没有按照我的预期返回值。
以下是请求的上下文:
对于这个练习,您将编写自己的第一个类——一个队列类。在您的队列类中,您需要三个方法:
init:初始化您的队列(考虑一下:您将如何存储队列的元素?您需要在这个方法中初始化适当的对象属性)
insert:在队列中插入一个元素
remove:从队列中删除(或“弹出”)一个元素并返回它。如果队列为空,则引发ValueError异常。
我已经用一个“remove”方法编写了以下代码,但是尽管该方法的行为能够正确地更改数组,但它不会返回“弹出”的值:
class Queue(object):

    def __init__(self):
        self.vals = []

    def insert(self, value):
        self.vals.append(value)

    def remove(self):
        try:
            self.vals.pop(0)
        except:
            raise ValueError()

任何帮助都将不胜感激!

为避免将来的混淆:在Python中,“类方法”通常意味着不同的东西。你的函数只是普通的函数属性 - 5gon12eder
感谢您的澄清!非常感激。 - joanx737
3个回答

2
好的,Python 中的返回值非常容易实现,只需这样做:
def remove(self):
    try:
        return self.vals.pop(0)
    except:
        raise ValueError()

幸运的是,pop() 方法可以同时删除并返回所选元素。

谢谢您的回复!我的困惑在于:假设'c'是一个'Queue'对象。那么c.remove()不就相当于调用c.vals.pop(0)吗?而这个操作应该会自动返回被移除的值,对吧? - joanx737
不,remove() 方法并不是通过索引来删除元素,而是根据值来删除。 - TidB
抱歉,我特别指的是“队列”类的自定义“remove”方法(它使用pop()),与Python的内置方法相比;如果它调用pop(),为什么值不会自动返回?谢谢! - joanx737

0

你需要使用return来返回值。将你的删除方法更新为:

def remove(self):
     try:
         return self.vals.pop(0)
     except:
         raise ValueError

0

你必须显式地返回该值:

return self.vals.pop()

还要注意:

  • list.pop() 方法的参数是可选的;
  • 它也会引发 IndexError,所以你应该只捕获那个特定的异常,而不是每个异常;
  • 如果可能的话,你应该使用 异常链
  • 你的 vals 成员有点私有,所以 将其重命名为以下划线开头
  • 整个任务有点无意义,因为 Python 列表已经有了完全符合要求的 append()pop() 方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接