python基礎之生成器迭代器

1 生成器:python

爲何要有生成器?算法

  就拿列表來講吧,假如咱們要建立一個list,這個list要求格式爲:[1,4,9,16,25,36……]這麼一直持續下去,直到有了一萬個元素的時候爲止。若是咱們要建立這個list,那麼應該是這樣的:app

[i*i for i in range(1,10001)]     #列表生成式,不要忘了
#結果就不列出來了

  這樣的話,這個list會佔用極多的內存,若是咱們能只將算法保存在list中,那麼這個list所佔的內存會大大減少,等咱們須要用到list的值的時候,這個list會自動運行其中的算法,將第一個值輸出,再次運行時,就會自動輸出第二個值,以此類推…… 這個特殊的list就被咱們稱之爲生成器(generator)。函數

如何建立生成器?code

  建立生成器有不少方法:對象

 1 第一種方法:教程

複製代碼
#將list生成式中的‘[’換爲‘(’
>>> (i*i for i in range(1,10001))
<generator object <genexpr> at 0x7fb0a69dc6e0>
>>> g=(i*i for i in range(1,10001))
#使用next()函數獲取g的下一個值
>>> g.next()
1
>>> g.next()
4
>>> next(g)
9
#當沒有元素可返回的時候,會報錯
>>> g=(i for i in range(1,3))
>>> g.next()
1
>>> g.next()
2
>>> g.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

#實際上,咱們不推薦用next()函數,較爲經常使用的是用for循環,實際上for循環的本質就是調用了next()函數。即:首先經過iter()將可迭代的數據轉換爲可迭代對象,而後調用next()
g=(i for i in range(1,11))
for i in g:
    print(i)
#結果爲:
1
2
3
4
5
6
7
8
9
10
#這樣當沒有值可供返回的時候就會退出循環並不會報錯。
複製代碼

 2 第二種方法:內存

  這種方法用在函數中,好比說用函數實現楊輝三角:generator

複製代碼
            1
          1   1
        1   2   1
      1   3   3   1
    1   4   6   4   1
  1   5   10  10  5  1
1……………………………………………………………1
複製代碼

  我的實現該函數的代碼:it

複製代碼
def yh():
    l=[1]
    n=[1]
    while True:
        yield n          #這裏有一個yield關鍵字!,yield就是定義generator的關鍵字,yield相似於return,
               #當函數運行到這裏就會結束,但不一樣的是,當下次繼續運行該函數時,就會從yield下方開始,也就是接續上次運行的地方繼續運行。 l.append(0) n=copy.copy(l) #注意這裏爲何要用copy功能!!!! for i in range(len(l)): n[i]=l[i]+l[i-1] l=n import copy n=0 for i in yh(): if n==10: break print(i) n=n+1
複製代碼

  這裏有一個yield關鍵字!,yield就是定義generator的關鍵字,yield相似於return,當函數運行到這裏就會結束,但不一樣的是,當下次繼續運行該函數時,就會從yield下方開始,也就是接續上次運行的地方繼續運行。

  另外摘抄了一個比較短小精悍的代碼:

複製代碼
def yh():
    N = [1]
    while True:
        yield N
        N.append(0)
        N = [N[i-1] + N[i] for i in range(len(N))]
…………
…………
複製代碼

 2  迭代器

  迭代器有什麼用途?

  生成器存儲了算法,而迭代器則負責一次輸出一個該算法的結果。迭代器相似於生成器(事實上,並不單單只是生成器)與循環的結合,只不過這個循環「很懶」,一次只輸出一個值。

  迭代和迭代器的區別:

  迭代:

    幾乎全部的python對象都是可迭代的,像str dict list tuple generator set……等都是可迭代的。

  判斷一個對象是否可迭代:

>>> from collections import Iterable
>>> isinstance([], Iterable)
True

  迭代器:

    能夠被next()函數調用並不斷返回下一個值的對象稱爲迭代器:Iterable

  判斷一個對象是否爲迭代器對象:

 

複製代碼
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False
複製代碼

 

 

  生成器就是一個迭代器對象,他能夠被next()函數調用。而像其餘類型的對象,例如list,dict……須要使用iter()函數將其轉換爲迭代器對象。

 

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

 

 

 

本文參考了廖雪峯大神的python教程。詳細請閱讀:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

相關文章
相關標籤/搜索