0

次の関数を検討してください。

def fun(lst):
    for item in lst:
        cmp = 0
        for other in lst:
            if item < other: 
                cmp -= 1
            elif item > other:
                cmp += 1
         if not cmp:
            return item



nums = [1,3,2,2]
print("fun({0}) = {1}".format(nums,fun(nums)))

このコードの出力は次のとおりです。

楽しみ ([1, 3, 2, 2]) = 2

しかし、理由はわかりません。これが出力である理由を誰かが説明できますか?

コードブロックの解釈を簡単にする方法についてのヒントはありますか...

私の試験では明らかにPythonにアクセスできないため、コードのいくつかのブロックが実際に何をするのかを理解するのに苦労しています.

ありがとうございました。

4

3 に答える 3

1

まず、コードに間違った位置合わせがあります (「if not cmp:」は 1 つ左の位置にする必要があり、最後の 2 行は最初の行と同じ列にする必要があります)。

def fun(lst):
    for item in lst:
        cmp = 0
        for other in lst:
            if item < other: 
                cmp -= 1
            elif item > other:
                cmp += 1
        if not cmp:
            return item

nums = [1,3,2,2]
print("fun({0}) = {1}".format(nums,fun(nums)))

fun 関数は、「cmp ではない」、つまり cmp != 0 となる最初の配列の項目を返します。cmp は、指定された項目よりも少ない配列要素の数から、項目よりも多い配列要素の数を引いたものです。

  if item < other:
    cmp -= 1
  elif item > other:
    cmp += 1

では、配列項目 [1, 3, 2, 2] を見てみましょう。

1: 自己よりも 3 つ多く (3, 2, 2)、自己より少なくないため、cmp = 0 - 3 = -3、戻りません

3: 3 つの項目があり、自分より少ない項目はなく、自分より 3 つ (3, 2, 2) 多いので、cmp = 3 - 0 = 3、戻り値なし

2: 自分自身よりも 1 項目多い (3) 1 項目少ない (1)、cmp = 0、関数はそれを返す (2)

于 2013-06-24T05:25:32.270 に答える
1

コードブロックの解釈を簡単にする方法についてのヒントはありますか...

それを書いてください。ページ上でそれぞれの名前に独自のスペースを与え、コードの実行中に値の変更を追跡します。いくつかの練習の後、非スカラー値を書き出すだけで、単純な値を簡単に追跡できるようになります。

于 2013-06-24T05:10:13.683 に答える