Python迭代器和生成器


Python迭代器

1、可迭代對象和迭代器

  • 可迭代對象:

  實現了能返回迭代器的 iter 方法或者實現了 getitem 方法而且其參數是從零開始的索引的對象均為可迭代對象

  • 迭代器:

  迭代器是這樣的對象:實現了無參數的 next 方法,返回下一個元素,如果沒有元素了,那么拋出 StopIteration 異常;並且實現iter 方法,返回迭代器本身。

  字符串,列表或元組對象都可用於創建迭代器

  • 兩者的關系:

  1)可迭代對象包含迭代器。
  2)如果一個對象擁有__iter__方法,其是可迭代對象;如果一個對象擁有next方法,其是迭代器。
  3)定義可迭代對象,必須實現__iter__方法;定義迭代器,必須實現__iter__和next方法。  

                           

 

2、代碼示例(使用列表來創建迭代器)

(1)使用for循環遍歷元素

list=[1,2,3,4]
it = iter(list)    # 創建迭代器對象
for x in it:
    print (x, end=" ")

結果:

1 2 3 4 

(2)使用next遍歷元素

>>> list=[1,2,3,4]
>>> IT=iter(list)
>>> next(IT)
1
>>> next(IT)
2
>>> next(IT)
3
>>> next(IT)
4
>>> next(IT)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

3、創建迭代器

1)把一個類作為一個迭代器使用需要在類中實現兩個方法 __iter__() 與 __next__() 

2)迭代器對象支持通過next取值,如果取值結束則自動拋出StopIteration

3)for循環內部在循環時,先執行__iter__方法,獲取一個迭代器對象,然后不斷執行next取值,有異常StopIteration時終止循環

# 創建迭代器類型
class IT(object):
    def __init__(self):
        self.counter = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.counter += 1
        if self.counter == 3:
            raise StopIteration
        return self.counter

# 根據類實例化來創建一個迭代器
obj1 = IT()
v1 = next(obj1)
print(v1)
v2 = next(obj1)
print(v2)
v3 = next(obj1) # 拋出異常
print(v3)

obj2=IT()
for i in obj2: # 首先會執行迭代器對象的__iter__方法回去返回值,一直去返回的執行next對象
    print(i)

 Python生成器

1、生成器是一種使用普通函數語法定義的迭代器
2、包含yield語句的函數都被稱為生成器
3、不使用return返回一個值,而是可以生成多個值,每次一個
4、每次使用yield生成一個值后,函數都將凍結,及再次停止執行
5、被重新喚醒后,函數將從停止的地方開始繼續執行

l3 = [x * x for x in [1,2,3,4,5]] #列表推導式
結果:[1,4,9,16,25]
l4 = (x * x for x in [1,2,3,4,5])
>>> l4
結果:<generator object <genexpr> at 0x0000021CD228C7C8>
#generator就是生成器

使用 yield 實現斐波那契數列:

import sys

def fibonacci(n): # 生成器函數 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一個迭代器,由生成器返回生成

while True:
    try:
        print (next(f), end=" ")
    except :
        sys.exit()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM