Python中的迭代器和生成器

python中的迭代器和生成器

迭代器

  • 迭代的概念python

    • 給定一個列表或者元組,能夠經過for循環來遍歷這個列表或者元組,咱們把這種遍歷稱爲迭代,迭代讀取一條數據供咱們使用的對象稱爲可迭代對象
  • 在python中函數

    • 在類裏面定義iter方法建立的對象就是可迭代對象post

  class MyIter():
      def __iter__(self):
          pass

在類裏面定義iter和next方法建立的對象就是迭代器對象spa

  class MyIter():
      def __iter__(self):
          pass
      def __next__(self):
          pass

使用迭代器實現code

class FibIterator(object):
    """斐波那契數列迭代器"""
    def __init__(self, n):
        """
        :param n: int, 指明生成數列的前n個數
        """
        self.n = n
        # current用來保存當前生成到數列中的第幾個數了
        self.current = 0
        # num1用來保存前前一個數,初始值爲數列中的第一個數0
        self.num1 = 0
        # num2用來保存前一個數,初始值爲數列中的第二個數1
        self.num2 = 1

    def __next__(self):
        """被next()函數調用來獲取下一個數"""
        if self.current < self.n:
            num = self.num1
            self.num1, self.num2 = self.num2, self.num1+self.num2
            self.current += 1
            return num
        else:
            raise StopIteration

    def __iter__(self):
        """迭代器的__iter__返回自身便可"""
        return self


if __name__ == '__main__':
    fib = FibIterator(10)
    for num in fib:
        print(num, end=" ")

總結對象

可迭代對象不必定是迭代器對象
迭代器對象必定是可迭代對象
for循環獲取數據建立迭代器對象而後調用next方法
使用迭代器能夠大大節省內存空間
生成器
生成器是一類特殊的迭代器,它不須要寫普通迭代器的iter和next方法,使用更加方便,它依然能夠使用next函數和for循環取值
建立生成器的方法一:
只要把一個列表生成式[]改爲(),這樣就建立了一個生成器blog

     (i for i in range(5))

建立生成器的方法二:seo

  • 只要在def函數中有yield關鍵字,就稱爲生成器內存

          def gen():
             i =0
              while i<5:
                 temp =yield i    
                 print(temp)
                 i+=1

     

  • 咱們能夠使用for循環遍歷生成器ci

  • 也能夠用next方法取值

  • 還能夠調用send方法給yield傳值

  • yield生成斐波那契數列

       def fibonacci(num):
       # 初始化第一個值和第二個值
           a =0
           b =1
           # 記錄生成fibonacci數字的下標
           current_index =0
           while current_index < num:
               result = a
               a, b = b, a + b
               current_index +=1
               # 代碼執行到yield會暫停,而後把結果返回出去,下次啓動生成器會在暫停的位置繼續往下執行
               yield result
       
       for i in fibonacci(5):
           print(i)

    yield和return的對比
    使用了yield關鍵字的函數再也不是函數,而是生成器
    代碼執行到yield會暫停,而後把結果返回出去,下次啓動生成器會在暫停的位置繼續往下執行
    每次啓動生成器都會返回一個值,屢次啓動能夠返回多個值。
    return只能返回一次值,代碼執行到return會中止迭代,拋出中止迭代異常
    yield能夠在下次執行的時候接受傳遞的值

http://mseo.chinaz.com/lvyoup1.nx04.com/   http://seo.chinaz.com/lvyoup2.nx04.com/     http://mseo.chinaz.com/lvyoup3.nx04.com/   http://seo.chinaz.com/lvyoup4.nx04.com/ 

http://mseo.chinaz.com/lvyou5.nx04.com/   http://seo.chinaz.com/lvyoup6.nx04.com/     http://mseo.chinaz.com/lvyoup7.nx04.com/   http://seo.chinaz.com/lvyoup8.nx04.com/

相關文章
相關標籤/搜索