1. 程式人生 > >Python中的生成器(generator)和迭代器(Iterator)

Python中的生成器(generator)和迭代器(Iterator)

Python是一種動態的程式語言,那就具有動態程式語言的特性,可以在執行時改變其結構,比如新的函式,物件、程式碼也可以引進,已有的函式可以被刪除。。。目前最常用的可以歸納為以下幾點:1.執行的過程中給物件繫結(新增)屬性,2.執行過程中給類繫結(新增)屬性,3.執行的過程中給類繫結(新增)方法,4.執行的過程中刪除屬性和方法。在安全和限制的條件下,可以使用__slots__變數來達到此目的。需要注意的是,__slots__定義的屬性僅對當前類例項起作用,對繼承的子類是不起作用的。

生成器:

在Python中·,一邊迴圈一邊計算的機制被稱之為生成器(generator),這個機制的優點是在於邊迴圈邊計算,可以省很多記憶體,適合連續性計算很大量的程式。它可以按照某種演算法來推算出列表元素,可以在迴圈的過程中不斷推算出後續的元素,從而不必建立完整的list,適合有規律的list。

生成器的建立方法有兩種,第一種是隻要把一個列表生成式的[ ]改為()即可,把[ ]改為(),那就由列表變成了生成器,一般在建立生成器之後,是通過for迴圈來進行迭代,程式記住的是演算法。過程結束不會丟擲StopIteration異常。第二種是推算的演算法比較複雜,用for迴圈無法實現時,可用函式來實現,函式記下來的是推算規則。把函式的部分轉化為生成器一般需要用到關鍵字yield,它能夠把函式包裝為generator,然後進行迭代。在用for迴圈呼叫generator時,一般拿不到generator的return語句的返回值。如果想要拿到返回值,必須捕獲StopIteration錯誤,返回值包含在StopIteration的value中。

可以說生成器是這樣一個函式,他記住了上一次返回時在函式體中的位置,對生成器函式之後的第n次呼叫跳轉時,對上次呼叫的所用區域性變數都保持不變。對資料狀態和流控制構造中的位置都有所記錄。

迭代器:

迭代是可以用來訪問集合的。迭代器也是一種物件,它是可以記住遍歷位置的物件,迭代器對集合的操作只能往前不能後退。

直接作用於for迴圈的資料型別有以下幾種:

1,集合資料型別,比如list,  tuple,  dict,  set,  str等;

2,generator,包括生成器和帶yield的generator function

這些可以直接作用於for迴圈的物件都是可迭代物件:Iterable。一般可迭代物件的判斷是使用isinstance()函式來進行的。可以被next()函式呼叫並不斷返回下一個值的物件稱之為迭代器:Iterator。對於生成器來說,都是Iterator物件,但list、dict、str不是Iterator,需要使用iter()函式來更改。

In:isinstance(iter([]),Iterator)
Out:True

In:isinstance(iter('abc',Iterator))
Out:True

總結:

1.凡是可作用於for迴圈的物件都是Iterable型別

2.凡是可作用於next()函式的物件都是Iterator型別

3.集合資料型別如list、dict、str等是Iterable但不是Iterator,可以通過iter()函式來獲得Iterator物件