python核心編程筆記(7)-迭代器,生成器

chap 8 條件、循環


1. 序列相關的內建函數:
    sorted() 返回一個列表
    reversed()  返回反序訪問的迭代器
    enumerate() 返回迭代器
    zip()   返回一個列表
    
2. python可以在 while 和 for 循環中使用 else 語句. 它們是怎麼工作的呢? 在循環中使用時, else子句只在循環完成後執行, 也就是說 break 語句也會跳過 else 塊.eg.
#!/usr/bin/env python
def showMaxFactor(num):
    count = num / 2
    while count > 1:
        if num % count == 0:
            print 'largest factor of %d is %d' %(num, count)
            break
        count -= 1
    else:
        print num, "is prime"
for eachNum in range(10, 21):
    showMaxFactor(eachNum)
   
3. 迭代器:
    提供了可擴展的迭代器接口.
    對列表迭代帶來了性能上的增強.
    在字典迭代中性能提升.
    創建真正的迭代接口, 而不是原來的隨機對象訪問.
    與所有已經存在的用戶定義的類以及擴展的模擬序列和映射的對象向後兼容
    迭代非序列集合(例如映射和文件)時, 可以創建更簡潔可讀的代碼.
    
4. 使用迭代器:
    序列:iter(collection) -> iterator
    字典的迭代器會遍歷它的鍵(keys).語句 for eachKey in myDict.keys() 可以縮寫爲 for eachKey in myDict
    文件對象生成的迭代器會自動調用 readline() 方法. 這樣, 循環就可以訪問文本文件的所有行 . 程 序 員 可 以 使 用 更 簡 單 的 for eachLine in myFile 替 換 for eachLine inmyFile.readlines() 


5. 創建迭代器:
    對一個對象調用 iter() 就可以得到它的迭代器.如果你傳遞一個參數給 iter() , 它會檢查你傳遞的是不是一個序列, 如果是, 那麼很簡單:根據索引從 0 一直迭代到序列結束. 另一個創建迭代器的方法是使用類, 我們將在第 13 章詳細介紹, 一個實現了 __iter__() 和 next() 方法的類可以作爲迭代器使用.如果是傳遞兩個參數給iter(),它會重複地調用func,直到迭代器的下個值等於sentinel
    iter(obj)
    iter(func, sentinel)


6. 列表解析:
    map(lambda x : x**2, range(6))  --->   [x**2 for x in range(6)]
    filter(lambda x : x%2, seq)    --->   [x for x in seq if x%2]   #輸出所有x%2爲真的元素,即x%2=1,輸出所有奇數
    矩陣表示:[(x+1,y+1) for x in range(3) for y in range(5)]
    文件表示:[word for line in f for word in line.split()]


7. 生成器:列表解析的一個不足就是必要生成所有的數據, 用以創建整個列表. 這可能對有大量數據的迭代器有負面效應. 生成器表達式通過結合列表解析和生成器解決了這個問題.生成器表達式在 Python 2.4 被引入, 它與列表解析非常相似,而且它們的基本語法基本相同;不過它並不真正創建數字列表, 而是返回一個生成器,這個生成器在每次計算出一個條目後,把這個條目“產生”(yield)出來. 生成器表達式使用了"延遲計算"(lazy evaluation), 所以它在使用內存上更有效.
eg. return max(len(x.strip()) for x in open('/etc/motd'))    尋找文件最長的行
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章