Rumah > Soal Jawab > teks badan
我在学习协同过滤,遇到这样一段代码
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
Parameter pertama yang diterima mengikut jumlah ialah boleh diulang. Jika anda ingin mengetahui maksud for loop ini, anda perlu menyemak generator dan sintaksis gula yang berkaitan dengan generator Berikut adalah contoh mudah untuk poster [i for i in range(5)] # 结果为[0,1,2,3,4]
PHP中文网2017-04-17 17:54:13
for
atau if
di sini tiada kaitan dengan sum
itu sendiri Seperti yang @大puyuh berkata, sum
menerima objek boleh lelar sebagai parameter Bagi objek boleh lelar dalam contoh ini senarai dijana menggunakan pemahaman senarai.
Ini ialah sintaks dengan rasa
pengaturcaraan berfungsi, intuitif dan elegan.
Seperti namanya, ia digunakan untuk menjanasiri.
Oleh itu terdapat prinsip penting:
Apabila tujuan kod hari ini adalah untuk menjana senarai, maka kita harus mempertimbangkan untuk menggunakannya, jika tidak, kita tidak seharusnya menggunakannya sama sekali
(sintaks generasi literal senarai), mengapit lelaran []
. elemen yang dilawati menggunakan for...in...
akan digunakan untuk mencipta setiap elemen dalam senarai mengikut urutan. for
dan kami ingin mencipta senarai lain lst
di mana setiap elemen ialah segi empat sama unsur dalam lst2
: lst
lst = [1, 2, 3, 4]
lst2 = []
for i in lst:
lst2.append(i**2)
Kami menggunakan gelung standard untuk melakukan ini, tetapi perkara yang sama boleh dilakukan dengan lebih ringkas dan elegan menggunakan for...in...
pemahaman senarai:
lst = [1, 2, 3, 4]
lst2 = [i**2 for i in lst]
Dalam contoh ini, akan mengeluarkan elemen dalam for i in lst
secara berurutan dan melakukan operasi segi empat sama untuk menjadi elemen baharu lst
. Ini mengingatkan fungsi lst2
, kita juga boleh menggunakan map
pemetaan untuk mencapai kesan yang sama:
lst = [1, 2, 3, 4]
lst2 = map(lambda x:x**2, lst) # Python2
lst2 = list(map(lambda x:x**2, lst)) # Python3
akan melawati elemen dalam parameter kedua (objek boleh lelar) dalam urutan, dan menggunakan elemen sebagai parameter untuk memanggil parameter pertamanya (fungsi parameter tunggal), iaitu, ia akan keluarkan secara berurutan 1, 2, 3, 4 dan gunakannya sebagai parameter map
untuk memanggil fungsi tanpa nama x
. lambda x:x**2
dalam pemahaman senarai adalah pengganti yang baik untuk for
. map
, anda akan memikirkan map
, yang melakukan tindakan penapisan pada objek boleh lelaran. 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
juga akan melawati parameter kedua (objek boleh lelar), mengeluarkannya sebagai argumen dalam urutan dan memanggil parameter pertamanya (fungsi parameter tunggal jika hasil operasi itu benar ( filter
), nilai pulangan akan dikekalkan sebagai elemen baharu, jika tidak ( True
) akan ditapis keluar. False
juga mempunyai pengganti, iaitu pemahaman senarai Kita boleh menulis seperti ini:filter
lst = [1, 2, 3, 4]
lst2 = [i**2 for i in lst if i%2!=0]
juga lebih mudah! Kita boleh katakan bahawa pernyataan if
dalam pemahaman senarai adalah pengganti yang baik untuk filter
.
Selepas melihat ini, saya percaya anda sudah faham:
sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in prefs[person1] if item in prefs[person2]])
Kod ini mula-mula melaksanakan pemahaman senarai yang mengandungi pernyataan for...in...
dan pernyataan if
untuk menjana senarai, dan kemudian menggunakan senarai sebagai argumen untuk memanggil fungsi sum
.
Kesimpulan:
for...in...
dan if
tidak berkaitan langsung dengan sum
.
for...in...
dan if
ialah sintaks utama pemahaman senarai.
Pemahaman senarai boleh membantu kami menjana senarai menggunakan objek boleh lelaran.
pemahaman senarai ialah pengganti yang baik untuk map
dan filter
.