【问题标题】:Class method doesn't return value类方法不返回值
【发布时间】:2015-03-01 20:00:53
【问题描述】:

我正在学习 MTIx 6.00.1x Intro to Computer Science 课程,但在创建课程方法时遇到了问题。具体来说,我的 'Queue' 类中的 'remove' 函数没有像我预期的那样返回值。

这是请求的上下文:

在本练习中,您将编写您的第一个类,即 Queue 类。在您的 Queue 类中,您将需要三个方法:

init:初始化你的队列(想想:你将如何存储队列的元素?你需要在这个方法中初始化一个适当的对象属性)

插入:在队列中插入一个元素

remove:从队列中删除(或“弹出”)一个元素并将其返回。如果队列为空,则引发 ValueError。

我使用“删除”方法编写了以下代码,但尽管该方法的行为正确地改变了数组,但它不会返回“弹出”值:

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 中的“类方法”通常表示something different。你的函数只是普通的函数属性
  • 感谢您的澄清!真的很感激

标签: python methods


【解决方案1】:

嗯,在 Python 中返回是相当容易的,所以只需这样做:

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

幸运的是,pop() 已经同时移除并返回了选中的元素。

【讨论】:

  • 感谢您的回复!我的困惑是:说“c”是一个“队列”对象。 c.remove() 不就等同于调用 c.vals.pop(0),它会自动返回移除的值吗?
  • 不,remove() 不是按索引删除,而是按值删除。
  • 对不起,我特意指的是 'queue' 类的自定义 'remove' 方法(利用 pop() )与 Python 的内置方法;如果调用pop(),为什么没有自动返回值?谢谢!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您必须显式返回该值:

    return self.vals.pop()
    

    还要注意:

    • list.pop() 方法的参数是可选的;
    • 它还会引发IndexError,因此您应该只捕获该特定异常而不是每个异常;
    • 如果可能,您应该使用exception chaining
    • 你的vals 成员有点私密,所以rename it to start with an underscore;
    • 整个任务有点毫无意义,因为 Python 列表已经有 append()pop() 方法具有完全需要的行为。

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多