1

我正在实施一些基本的数据结构以准备考试,并且遇到了以下问题。我想实现一个未排序的链表,并且已经实现了一个pop()方法,但是我不知道,无论是语法上还是概念上,如何使函数有时带参数,有时不带参数。我希望这是有道理的。

def pop(self):
    current = self.head
    found = False
    endOfList = None

    while current != None and not found:
        if current.getNext() == None:
            found = True
            endOfList = current.getData()
            self.remove(endOfList)
            self.count = self.count - 1
        else:
            current = current.getNext()

    return endOfList

我想知道如何使语句unsortedList.pop(3)有效,3 只是一个示例,而 unsortedList 是该类的一个新实例。

4

4 回答 4

3

使用具有默认值的参数的基本语法(和常见用例)如下所示:

def pop(self, index=None):
    if index is not None:
        #Do whatever your default behaviour should be

然后,您只需要根据论点确定您希望您的行为如何改变。我只是猜测参数应该指定应该从列表中弹出的元素的索引。

如果是这种情况,您可以直接使用有效的默认值,而不是None例如0

def pop(self, index=0):
于 2012-12-07T22:02:30.807 回答
1

首先,在函数中添加一个具有默认值的参数:

def pop(self, item=None):

现在,在代码中if item is None:,你可以做“无参数”的事情;否则,使用item. 无论您是想在逻辑的顶部还是向下切换,都取决于您的逻辑。在这种情况下,item is None可能意味着“匹配第一项”,因此您可能需要一个检查item is None or current.data == item:.

有时你会想要为一个合法的参数做这个None,在这种情况下你需要选择一个不同的哨兵。这里有一些关于不同选择的利弊的问题(以及其他地方的博客文章)。但这是一种方法:

class LinkedList(object):
    _sentinel = object()
    def pop(self, item=_sentinel):

除非有人将_sentinelLinkedList 的私有类成员用作列表项是有效的,否则这是有效的。(如果这有效的——例如,因为你正在用这些东西构建一个调试器——你必须变得更加棘手。)

这方面的术语有点棘手。引用文档:

当一个或多个顶级参数具有 形式parameter = expression时,该函数被称为具有“默认参数值”。</p>

要理解这一点:“参数”(或“形式参数”)是函数定义要采用的东西;“参数”是在调用表达式中传递给函数的东西;“参数值”(或“实际参数”,但这只会让事情变得更加混乱)是函数体接收的值。因此,引用“默认参数”或“带有默认参数的参数”在技术上是不正确的,但两者都很常见,因为即使是专家也觉得这些东西令人困惑。(如果您感到好奇,或者只是还没有感到困惑,请参阅参考文档中的函数定义调用以获取完整的详细信息。)

于 2012-12-07T22:06:26.030 回答
0

您的考试是否专门使用 Python?如果没有,您可能需要研究函数重载。Python 不支持此功能,但许多其他语言支持,并且是解决此类问题的一种非常常用的方法。

在 Python 中,您可以从使用具有默认值的参数中获得很多好处(正如 Michael Mauderer 的示例所指出的)。

于 2012-12-07T22:07:26.013 回答
0
def pop(self, index=None):
    prev = None
    current = self.head
    if current is None:
       raise IndexError("can't pop from empty list")
    if index is None:
       index = 0 # the first item by default (counting from head)

    if index < 0:
       index += self.count
    if not (0 <= index < self.count):
       raise IndexError("index out of range")

    i = 0
    while i != index:
        i += 1
        prev = current
        current = current.getNext()
        assert current is not None # never happens if list is self-consistent

    assert i == index
    value = current.getData()
    self.remove(current, prev)
    ##self.count -= 1 # this should be in self.remove()
    return value
于 2012-12-07T22:50:53.643 回答