我在学习协同过滤,遇到这样一段代码
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]])
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]
for
atauif
di sini tiada kaitan dengansum
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.Mari perkenalkan secara ringkas pemahaman senarai (pengeluaran bersiri).
pengaturcaraan berfungsi, intuitif dan elegan.
Seperti namanya, ia digunakan untuk menjanasiri.
Oleh itu terdapat prinsip penting:Mari kita lihat penggunaannya. Untuk menghasilkan senarai, kami benar-benar menggunakan dua pasang kurungan segi empat sama
(sintaks generasi literal senarai), mengapit lelaran
Mari kita lihat contoh hari ini kita mempunyai senarai integer[]
. elemen yang dilawati menggunakanfor...in...
akan digunakan untuk mencipta setiap elemen dalam senarai mengikut urutan.for
dan kami ingin mencipta senarai lain
Kami menggunakan gelunglst
di mana setiap elemen ialah segi empat sama unsur dalamlst2
:lst
standard untuk melakukan ini, tetapi perkara yang sama boleh dilakukan dengan lebih ringkas dan elegan menggunakan
Dalam contoh ini,for...in...
pemahaman senarai:akan mengeluarkan elemen dalam
for i in lst
secara berurutan dan melakukan operasi segi empat sama untuk menjadi elemen baharulst
. Ini mengingatkan fungsilst2
, kita juga boleh menggunakanmap
pemetaan untuk mencapai kesan yang sama: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
Tetapi kita dapati bahawa pemahaman senarai adalah lebih intuitif, dan kita boleh mengatakan bahawa pernyataanmap
untuk memanggil fungsi tanpa namax
.lambda x:x**2
dalam pemahaman senarai adalah pengganti yang baik untuk
for
.map
Apabila anda memikirkan
, anda akan memikirkan
Sebagai contoh, saya mahu hanya nombor ganjil muncul dalammap
, yang melakukan tindakan penapisan pada objek boleh lelaran.filter
:
lst2
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 (
Dan kinifilter
), 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
juga lebih mudah! Kita boleh katakan bahawa pernyataan
if
dalam pemahaman senarai adalah pengganti yang baik untukfilter
.Selepas melihat ini, saya percaya anda sudah faham:
Kod ini mula-mula melaksanakan pemahaman senarai yang mengandungi pernyataan
for...in...
dan pernyataanif
untuk menjana senarai, dan kemudian menggunakan senarai sebagai argumen untuk memanggil fungsisum
.Kesimpulan:
for...in...
danif
tidak berkaitan langsung dengansum
.for...in...
danif
ialah sintaks utama pemahaman senarai.Pemahaman senarai boleh membantu kami menjana senarai menggunakan objek boleh lelaran.
pemahaman senarai ialah pengganti yang baik untuk
map
danfilter
.