自學Python4.6-迭代器

自學Python之路-Python基礎+模塊+面向對象
自學Python之路-Python網絡編程
自學Python之路-Python併發編程+數據庫+前端
自學Python之路-djangohtml

自學Python4.6 - 迭代器

以前所講的可使用for循環:前端

  • list
  • dic
  • str
  • set
  • tuple
  • f = open()
  • range()
  • enumerate  枚舉
print(dir([]))  告訴咱們列表擁有的全部方法 ,  其中有雙下劃線的爲雙下方法
print(dir(""))  告訴咱們字符串擁有的全部方法 

print([1].__add__([2]))
print([1]+[2])  # 同以上,python內部算法執行就是_add_

  

迭代器是訪問集合元素的一種方式。迭代器對象從集合的第一個元素開始訪問,直到全部的元素被訪問完結束。python

迭代器只能往前不會後退,不過這也沒什麼, 由於人們不多在迭代途中日後退。算法

另外,迭代器的一大優勢是不要求事先準備好整個迭代過程當中全部的元素。數據庫

迭代器僅僅在迭代到某個元素時才計算該元素,而在這以前或以後,元素能夠不存在或者被銷燬。這個特色使得它特別適合用於遍歷一些巨大的或是無限的集合,好比幾個G的文件(cat就是迭代器形式,讀一行顯示一行)django

特色:編程

  • 訪問者不須要關心迭代器內部的結構,僅需經過_nex_t()方法不斷去取下一個內容;
  • 不能隨機訪問集合中的某個值 ,只能從頭至尾依次訪問,且只能取全部數據取一次;
  • 訪問到一半時不能往回退;
  • 便於循環比較大的數據集合,節省內存空間
      (迭代器並不會在內存中佔用一大塊內存,而是隨着循壞每次生成一個,每次_next_()每次提供一個)

1. 生成一個迭代器(在Python3.0中)網絡

others = iter(['carlos','gary','tong','rain']) #iter表明生成的是個迭代器
print(others)  #輸出結果爲<list_iterator object at 0x01E96650>表示爲迭代器
print(others.__next__())
print(others.__next__())
print(others.__next__())
print(others.__next__()) # 迭代器只有4個元素,若是超過迭代器元素的數量繼續迭代的話,它會自動返回「StopIteration」的信息

輸出:併發

carlos
gary
tong
rain函數

2. for在iter迭代器中的實例(利用for 循環取出iter中每一個元素)

obj = iter([11,22,33,44,55,66,77,88,99,90])
for n in obj:  #利用for 循環取出iter中每一個元素。
    print(n)

輸出:

11
22
33
44
55
66
77
88
99
90

3. 迭代器的循環能夠避開索引,但有時候須要索引來進行一些操做。內建函數enumerate,它能在iter函數的結果前加上索引,以元組返回。

obj =iter(['carlos','gary','jack','rain'])
for i in enumerate(obj):
    print(i)

輸出:

(0, 'carlos')
(1, 'gary')
(2, 'jack')
(3, 'rain')

4. while 在iter函數中應用

obj = iter([11,22,33,44,55,66,77,88,99,90])
while True:    #while循環的話判斷爲真,賦一個變量。而後把每次經過obj.__next__()的結果賦值給變量打印出來。當循環超過iter中的值後條件就爲Talse,那麼就會報StopIteration的錯誤
    val = obj.__next__()
    print(val)

輸出:

11
22
33
44
55
66
77
88
99
90
Traceback (most recent call last):
File "D:/PyCharm Community Edition 2016.3.2/aaaa.py", line 20, in <module>
val = obj.__next__()
StopIteration

5. 分析迭代器內存開銷

#把文件一次加載到內存中,而後逐行打印。當文件很大時,這個方法的內存開銷就很大了 * /
for line in open("test.txt").readlines():
    print
    line
#這是最簡單也是運行速度最快的寫法,他並沒顯式的讀取文件,而是利用迭代器每次讀取下一行 * /
for line in open("test.txt"):  # use file iterators
    print
    line

補充:

  • 迭代器雙下方法 : 不多直接調用的方法。通常狀況下,是經過其餘語法觸發的;
  • 可迭代協議:只要含有有__iter__的方法 '__iter__' in dir(數據)都是可迭代的;
  • 迭代器協議: 只要內部含有__iter__和__next__方法就是迭代器協議;
  • 迭代器必定可迭代,可迭代的經過調用._iter_()方法就能獲得一個迭代器;
  • 迭代器中的_next_()方法能夠一個一個的獲取值;
  • 可迭代的必定能夠被for循環(for循環其實就是在使用迭代器)。
相關文章
相關標籤/搜索