1
def topMatches(prefs,person,n=5,similarity=sim_pearson):
  scores=[(similarity(prefs,person,other),other)
                  for other in prefs if other!=person]  
  scores.sort()
  scores.reverse()
  return scores[0:n]

topmatches関数内で別の関数を呼び出しているだけです。他の場所で定義していない他の関数がどのように機能するか疑問です。また、関数topmatchesに渡していないので、 これがどのように機能するか説明できますか?

4

3 に答える 3

4

otherのそれぞれのリスト要素recordですprefs

于 2012-06-11T07:10:15.257 に答える
3

scores=[(similarity(prefs,person,other),other) for other in prefs if other!=person]このようなものに展開して、何が起こっているかを確認できます。

scores = []
for other in prefs:
    if other != person:
        scores.append((similarity(prefs, person, other))

だから何が起こるかこれは:

  1. スコアと呼ばれる空のリストを作成します
  2. prefsを反復処理し、その要素の値を変数に配置して、otherそれをインスタンス化します
  3. otherあなたは等しくないことを確認するためにチェックしますperson
  4. そうでない場合は、類似度関数を呼び出し、結果をに追加しますscores

あなたが投稿した構成はリスト内包表記と呼ばれ、一連の通常のループなどを書くための素晴らしく、きちんとした、速い方法になり得ます。

編集(moooeeeepの礼儀):

リスト内包表記のPEP202、および実際のドキュメント

于 2012-06-11T07:12:07.963 に答える
0

プログラミングの経験がないと仮定すると-

topMatchesはあなたの関数です。

otherは一時変数です。この変数は、topMatches関数内で定義されます。Pythonでは、変数を作成するために変数を明示的に「宣言」する必要はありません。

例えば、

cでは、

void topMatches( . , . , . )
{
  int other;

.
.
.
}

あなたはこのようなものを持っていたでしょう、そこでは他のものが変数であると定義されました。

しかし、Pythonでは、単純にそうすると、

for other in prefs:
<something something>

Pythonコンパイラは、ループを反復処理する「other」という名前の一時変数を作成する必要があることを独自に理解します。(あなたが与えた例では)。

それは言うことと同じです、

for (int i;i<n;i++)
. 
. 

ここで、iはループの可変イテレータです。(Cで)。

同様に、Pythonでは、「other」はこの例のループの変数イテレーターです。お役に立てれば!

于 2012-06-11T07:22:12.823 に答える