Maison > Questions et réponses > le corps du texte
我在学习协同过滤,遇到这样一段代码
def sim_distance(prefs,person1,person2):
# Get the list of shared_items
si={}
for item in prefs[person1]:
if item in prefs[person2]: si[item]=1
# if they have no ratings in common, return 0
if len(si)==0: return 0
# Add up the squares of all the differences
sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in prefs[person1] if item in prefs[person2]])
return 1/(1+sum_of_squares)
比较困惑的是下面这段代码,为什么sum里面可以写for 循环呢,这个是什么意思,为什么我写了个类似的函数就会报错
sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in prefs[person1] if item in prefs[person2]])
怪我咯2017-04-17 17:54:13
Le premier paramètre accepté par sum est un itérable. Si vous voulez connaître la signification de cette boucle for, vous devez vérifier le générateur et le sucre syntaxique lié au générateur. Voici un exemple simple pour l'affiche [i for i in range(5)] # 结果为[0,1,2,3,4]
PHP中文网2017-04-17 17:54:13
Le for
ou if
ici n'ont rien à voir avec sum
lui-même. Comme @大quail l'a dit, sum
accepte un objet itérable comme paramètre Quant à l'itérable dans cet exemple, l'objet est simplement. une liste générée en utilisant la compréhension de liste.
Il s'agit d'une syntaxe au goût de
programmation fonctionnelle, intuitive et élégante.
Comme son nom l'indique, il sert à générer desséries.
Il y a donc un principe important :
Lorsque le but du code d'aujourd'hui est de générer une liste, alors nous devrions envisager de l'utiliser, sinon nous ne devrions pas l'utiliser du tout
(la syntaxe de génération littérale de liste), prenant en sandwich une itération []
, The. les éléments visités à l'aide de for...in...
seront utilisés pour créer chaque élément de la liste dans l'ordre. for
et que nous voulions créer une autre liste lst
dans laquelle chaque élément est le carré de l'élément dans lst2
: lst
lst = [1, 2, 3, 4]
lst2 = []
for i in lst:
lst2.append(i**2)
Nous avons utilisé une boucle standard pour ce faire, mais la même chose peut être faite de manière plus concise et élégante en utilisant la for...in...
compréhension de liste :
lst = [1, 2, 3, 4]
lst2 = [i**2 for i in lst]
Dans cet exemple, supprimera séquentiellement les éléments de for i in lst
et effectuera une opération carrée pour devenir le nouvel élément de lst
. Cela rappelle la fonction lst2
, on peut aussi utiliser le map
mapping pour obtenir des effets similaires :
lst = [1, 2, 3, 4]
lst2 = map(lambda x:x**2, lst) # Python2
lst2 = list(map(lambda x:x**2, lst)) # Python3
visitera les éléments de son deuxième paramètre (un objet itérable) dans l'ordre et utilisera l'élément comme paramètre pour appeler son premier paramètre (une fonction à paramètre unique), c'est-à-dire qu'il retirera séquentiellement 1, 2, 3, 4 et utilisez-les comme paramètres map
pour appeler la fonction anonyme x
. lambda x:x**2
dans la compréhension de liste est un bon substitut à for
. map
, vous penserez à map
, qui effectue des actions de filtrage sur les objets itérables. filter
:lst2
lst = [1, 2, 3, 4]
lst2 = filter(lambda x:x%2!=0, map(lambda x:x**2, lst)) # Python2
lst2 = list(filter(lambda x:x%2!=0, map(lambda x:x**2, lst))) # Python3
visitera également son deuxième paramètre (un objet itérable), le retirera comme arguments dans l'ordre et appellera son premier paramètre (une fonction à paramètre unique si le résultat de l'opération est vrai ( <🎜). > ), la valeur de retour sera conservée en tant que nouvel élément, sinon ( filter
) sera filtrée. True
False
Et maintenant
lst = [1, 2, 3, 4]
lst2 = [i**2 for i in lst if i%2!=0]
est également beaucoup plus simple ! On peut dire que l'instruction if
en compréhension de liste est un bon substitut à filter
.
Après avoir vu ça, je crois que vous avez déjà compris :
sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in prefs[person1] if item in prefs[person2]])
Ce code exécute d'abord une compréhension de liste contenant l'instruction for...in...
et l'instruction if
pour générer une liste, puis utilise la liste comme argument pour appeler la fonction sum
.
Conclusion :
for...in...
et if
ne sont pas directement liés à sum
.
for...in...
et if
sont la syntaxe clé de la compréhension des listes.
La compréhension de liste peut nous aider à générer des listes à l'aide d'objets itérables.
la compréhension de liste est un bon remplacement pour map
et filter
.