generator, iteartor, map 的寫法

木刻思專欄 討論群 PyCrawler 101 generator, iteartor, map 的寫法

標籤: 

該主題包含 1 則回覆,有 2 個參與人,並且由  Adrian Liaw4 年, 1 月 前 最後更新。

正在檢視 2 篇文章 - 1 至 2 (共計 2 篇)
  • 作者
    文章
  • #579

    mars
    參與者

    在7-11 case裡有用到以下map函數, 是否能解釋一下細節, 此外, 是否能提供generator, iteartor的寫法, 謝謝!

    data = map(lambda e:dict([(c.tag,c.text) for c in e.iterchildren()]), doc.xpath(“//GeoPosition”))

    #580

    Adrian Liaw
    參與者

    其實這一串可以改成 data = map(lambda e: {c.tag: c.text for c in e.iterchildren()}, doc.xpath("//GeoPosition")) 較為恰當,也會達到一模一樣的結果。

    map 這個function有兩個參數(原文文件可以參考https://docs.python.org/2/library/functions.html#map 或是在ipython notebook中打 “map?”,在function名後面加上問號會秀出help/documentation) 第一個是function, 第二個是”iterable” (iterable 翻成中文可以說是「可列舉的」,例如list, dict, str, ElementTree 凡是可以用for loop列舉的皆是)。在這個表達式裡,lambda e: {c.tag: c.text for c in iterchildren()} 是function,doc.xpath("//GeoPosition") 是iterable,相信大家對後者不陌生,就只是把xml dom中所有GeoPosition的tag取出來變成list。

    至於前面這串 lambda e: {c.tag: c.text for c in e.iterchildren()} 是什麼東西,我們一一剖析。

    lambda 是python裡的一種表達式,他的用處是產生匿名function,我們在python定義function時,必須給予一個名字,例如 def foo(): 接著下一行才是函數內容。lambda就不一樣了,我們不需要給他一個名字,而他的組成是像這樣 “lambda 參數: 回傳值”。一個最簡單的例子是平方函數 lambda x: x * x 這一段不難,x是參數,x * x是回傳值,所以

    <span style=”font-family: monospace;”><span style=”background-color: #eeeeee;”>In [1]: square = lambda x: x * x
    In [2]: square(3)
    Out[2]: 9
    In [3]: square(5)
    Out[3]: 25</span></span>

    如果我們用原本的寫法,會寫成這樣,一樣的效果

    套用到我們的例子,e是參數,{c.tag: c.text for c in e.iterchildren()}  是回傳值。

    再回到map,map會把第二個參數的內容一個接著一個傳給第一個參數function,然後把function產出的值組成一個新的list,例如

    那 {c.tag: c.text for c in e.iterchildren()} 又是什麼東西?

    這種東西叫”dictionary comprehension” 他和 “list comprehension” “set comprehension” “generator expression” 是同一家人,只是資料結構(格式)不同。

    為了方便講解,我先用list comprehension做例子。

    [i*i for i in range(5)] 是一個簡單的例子,可以試試在ipython notebook中打這一串,你會得到

    [0, 1, 4, 9, 16]

    前面那個<span style=”font-family: monospace;”><span style=”background-color: #eeeeee;”>i*i</span></span> 是最後應該出現的結果,這個i 就是從後面的 for i in range(5) 來的。這就是list comprehension,更詳細的文件可以參考 https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

    dictionary comprehension和list comprehension很像,只是list是用中括弧,dictionary是用大括弧。還有dictionary需要 key: value

正在檢視 2 篇文章 - 1 至 2 (共計 2 篇)

抱歉,回覆主題必需先登入。