2012-06-11 104 views
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, 任何人都可以解釋我是如何工作的?參數傳遞蟒蛇

+0

您正在閱讀? – satoru

+0

'other'是一個臨時索引變量 – avasal

+0

是的,我剛剛開始使用它,發現它比[email protected] – iamsiva11

回答

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. 您可以通過首選項進行迭代,並把該元素的值到一個變量other從而將其實例化
  3. 您檢查以確保other不等於person
  4. 如果不是,則調用您的相似度函數並追加結果到scores

您已發佈被稱爲列表理解的結構,它可以是一個很好的,整齊,快速寫作的方式有什麼可以是一系列的正常循環等moooeeeep的

EDIT(禮貌):

PEP202上List Comprehensions,和實際documentation

+1

+1 - 只需添加兩個鏈接供進一步閱讀:[PEP202](http://www.python.org/dev/peps/pep-0202/),[文檔](http://docs.python。 org/howto/functional.html#generator-expressions-and-list-comprehensions) – moooeeeep

+0

感謝您的鏈接,將它們添加到帖子中。 :) –

+0

是的,謝謝!並感謝您的鏈接! – iamsiva11

4

otherprefs中每個record的列表元素。

+0

但是當我打電話給這個功能時,我只是做 recom.topMatches(recom.critics,'Test',n = 5),所以我通過這裏的人,其他來自哪裏? python中的 – iamsiva11

+0

你不必在使用它們之前聲明變量; 'other'被創建在名爲'scores'的列表理解的本地。 –

+0

是的,謝謝! – iamsiva11

0

假設你有沒有編程經驗 -

topMatches是你的函數。

其他是一個臨時變量。該變量在topMatches函數中定義。在python中,你並不需要「聲明」一個變量來創建它。

例如,

在C

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

. 
. 
. 
} 

你就會有這樣的事情,而其他被定義爲一個變量。

但蟒蛇,如果我簡單地做,

for other in prefs: 
<something something> 

蟒蛇編譯器自身的理解是要創建一個臨時變量與「其他」是遍歷你的循環名稱。 (在你給的例子中)。

這相當於說,

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

在那裏我是你的循環變量迭代器。 (在C中)。

同樣,在Python中,「other」是本例中循環的變量迭代器。 希望這有助於!

+0

這是一個錯誤的假設,我反正它。謝謝你的時間! – iamsiva11