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場合があり、その場合は別のセンチネルを選択する必要があります。さまざまな選択肢の長所と短所について、ここ (および他のブログ投稿) にいくつかの質問があります。しかし、ここに1つの方法があります:

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

_sentinel誰かが LinkedListのプライベート クラス メンバーをリスト アイテムとして使用することが有効でない限り、これは機能します。(たとえば、これらのものからデバッガーを構築しているなどの理由で、それが有効である場合は、さらにトリッキーになる必要があります。)

これに関する用語は少しトリッキーです。ドキュメントの引用:

1 つ以上の最上位パラメーターが の形式を持つparameter = expression場合、関数は「既定のパラメーター値」を持つと言われます。</p>

これを理解するには:「パラメータ」(または「仮パラメータ」)は、関数が取るように定義されているものです。「引数」は呼び出し式で関数に渡されるものです。「パラメータ値」(または「実際のパラメータ」ですが、これは混乱を招くだけです) は、関数本体が受け取る値です。したがって、「デフォルトのパラメータ」または「デフォルトの引数を持つパラメータ」のいずれかを参照することは技術的に正しくありませんが、専門家でさえ混乱を招くため、どちらも非常に一般的です。(興味がある場合、またはまだ混乱していない場合は、詳細についてリファレンス ドキュメントの関数定義呼び出しを参照してください。)

于 2012-12-07T22:06:26.030 に答える
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 に答える
0

あなたの試験は特に Python を使用していますか? そうでない場合は、関数のオーバーロードを調べてください。Python はこの機能をサポートしていませんが、他の多くの言語はサポートしており、この種の問題を解決するための非常に一般的なアプローチです。

Python では、デフォルト値を持つパラメーターを使用することで、多くのマイレージを得ることができます (Michael Mauderer の例が指摘しているように)。

于 2012-12-07T22:07:26.013 に答える