python_迭代器與生成器

一. 迭代器

什麼是迭代器:python

  1. 提供了一個方法,能夠不斷獲取對象裏的數據。
  2. 用戶不須要關心內部細節,只須要經過這個特定接口獲取數據。
  3. 當沒有數據時,再次調用時,會獲得一箇中止標記。
  4. 不能隨機訪問集合中的某個值 ,只能從頭至尾依次訪問
  5. 訪問到一半時不能往回退
  6. 便於循環比較大的數據集合,節省內存
可迭代對象:
    能夠經過函數 iter(對象) 生成一個迭代器的對象,都是可迭代對象
迭代器:
next(對象)  使用next 可以獲取到對象的下一個值,這個對象就被稱爲迭代器
    next()函數的本質,就是 調用 對象的  __next__() 方法,實現了 __next__() 方法的對象,就是迭代器
生成迭代器的方法:
    iter(可迭代對象)
    經過模塊 itertools

檢測一個對象是不是可迭代對象:   isinstance(對象,類)函數

from  collections import Iterable
isinstance(對象,Iterable)

可迭代對象:spa

        實現了 __iter__()         方法的對象,就是可迭代對象       code

def __iter__(self):
    return self

例 需求:  使用迭代器實現斐波那契數列對象

"""
迭代一個斐波那契數列
"""
class Fibonacci(object):
    def __init__(self):      #  初始化參數
        self.__f1 = 1
        self.__f2 = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.__f1, self.__f2 = self.__f2, self.__f2 +self.__f1         #  實現邏輯的方法
  
        return self.__f1


res = Fibonacci(20)   #  傳入一個實參
i = 0
for v in res:
    if i <= 10:     #  遍歷打印輸出10次
        print(v)
        i += 1
    else:

二 . 生成器

什麼事生成器:blog

利用迭代器,咱們能夠不斷的獲取數據。在實際開發中,咱們有時候但願數據一開始不存放在內存上,並且在遵循某種規律的狀況下,用的時候再給用戶.接口

生成器實際上是一種特殊的迭代器,不過這種迭代器更加優雅。它不須要再像上面的類同樣寫__iter__()和__next__()方法內存

列表生成器:ci

li1 = [v * 5 for v in range(10)]         #  這是列表推導式,  掉不調用都生成一個列表,耗資源資源

print(li)

li2 = (v * 5 for v in range(10))       #  這是列表生成器,調用時再加載,節約資源

print(next(li2))

print(next(li2))

print(next(li2))

函數生成器:   yield

    使用yield,yield至關與return,但不是中止函數執行,而是至關於暫停函數執行

注意: 函數生成器,是經過函數內部使用yield來實現的,一旦函數內部使用yield,函數名()調用時,函數的代碼不會執行,會返回一個生成器,使用next(生成器)時,函數代碼從開始執行,直到遇到yield,代碼暫停執行,當再次使用next是,繼續執行.(意思就是調用一次,加載一次)

例  需求: 使用函數生成器_斐波那契數列

def fib(n):   # 定義一個待傳入的形參
    x, y = 0, 1
    i = 0
    while i <= n:
        x, y = y, x + y             #   斐波那契數列( 普通函數 )
        print(x)
        i += 1

fib(10)     #   傳入實參,範圍顯示

擴展: @property的裝飾器  能夠讓咱們的代碼變得更加的簡介優雅.

相關文章
相關標籤/搜索