cari

Rumah  >  Soal Jawab  >  teks badan

python sum 函数中可以使用条件语句吗

我在学习协同过滤,遇到这样一段代码

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]])
高洛峰高洛峰2805 hari yang lalu1145

membalas semua(2)saya akan balas

  • 怪我咯

    怪我咯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]

    balas
    0
  • PHP中文网

    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.


    Mari perkenalkan secara ringkas pemahaman senarai (pengeluaran bersiri).

    Ini ialah sintaks dengan rasa

    pengaturcaraan berfungsi, intuitif dan elegan.

    Seperti namanya, ia digunakan untuk menjana

    siri.

    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


    Mari kita lihat penggunaannya. Untuk menghasilkan senarai, kami benar-benar menggunakan dua pasang kurungan segi empat sama

    (sintaks generasi literal senarai), mengapit lelaran []. elemen yang dilawati menggunakan for...in... akan digunakan untuk mencipta setiap elemen dalam senarai mengikut urutan. for

    Mari kita lihat contoh hari ini kita mempunyai senarai integer

    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

    Tetapi kita dapati bahawa pemahaman senarai adalah lebih intuitif, dan kita boleh mengatakan bahawa pernyataan

    dalam pemahaman senarai adalah pengganti yang baik untuk for. map


    Apabila anda memikirkan

    , anda akan memikirkan map, yang melakukan tindakan penapisan pada objek boleh lelaran. filter

    Sebagai contoh, saya mahu hanya nombor ganjil muncul dalam

    :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

    Dan kini

    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:

    1. for...in... dan if tidak berkaitan langsung dengan sum.

    2. for...in... dan if ialah sintaks utama pemahaman senarai.

    3. Pemahaman senarai boleh membantu kami menjana senarai menggunakan objek boleh lelaran.

    4. pemahaman senarai ialah pengganti yang baik untuk map dan filter.

    balas
    0
  • Batalbalas