1. 程式人生 > >Python中的迭代器與生成器

Python中的迭代器與生成器

Python中的迭代器與生成器介紹

一、迭代器iterator

迭代器是訪問可迭代物件的工具。

迭代器是指用iter(obj)函式返回的物件

迭代器是可以用next(it)函式獲取可迭代物件的資料

1、迭代器函式 iter()與next()

               iter(iterable)從可迭代物件中返回一個迭代器,iterable必須是                   能提供一個迭代器的物件

                next(iterable)  從迭代器iterator中獲取下一個記錄,如果無法獲                    取下一條記錄,則觸發StopIterator異常
 

     說明:

             ①迭代器只能往前取值,不會後退

             ②用iter函式可以返回一個可迭代物件的迭代器

      示例:

               >>> L = [1,3,5,7]
               >>> it = iter(L)    #讓L提供一個能訪問自己的迭代器
               >>> next(it)
               1
               >>> next(it)
               3

  2、迭代器的用途:

       可以依次訪問可迭代物件的資料(可代替迴圈遍歷)

       示例:>>> L = [1,23,45,6]
             >>> it = iter(L)
             >>> while True:
                 try:
                     x = next(it)
                     print(x)
                 except StopIteration:
                     break

二、迭代工具函式:

作用是生成一個個性化的可迭代物件

函式:
      zip(iter1 [,iter2[....]])

   返回一個zip物件,此物件用於生成元組,此元組的每個資料來源於引數中的可迭代       物件,當最小 的可迭代物件不再提供資料時迭代結束

   
   enumerate(iterable [,start])

   生成帶索引的列舉物件,返回的迭代型別為索引-值對(index- value),預設索引       從0 開始,也可用 start指定
   

     zip示例:>>> numbers = [10086,10000,10010,95588]
              >>> names = ['中國移動','中國聯通','中國電信']
              >>> for t in zip(numbers,names):
                  print(t)
                  (10086, '中國移動')
                  (10000, '中國聯通')
                  (10010, '中國電信')

  enumerate示例:

             >>> names = ['中國移動','中國電信','中國聯通']
             >>> for t in enumerate(names):
                      print(t)

             (0, '中國移動')
             (1, '中國電信')
             (2, '中國聯通')
            >>> for t in enumerate(names,101):
                      print(t)

             (101, '中國移動')
             (102, '中國電信')
             (103, '中國聯通')

Python中的迭代器與生成器介紹

一、迭代器iterator

迭代器是訪問可迭代物件的工具。

迭代器是指用iter(obj)函式返回的物件

迭代器是可以用next(it)函式獲取可迭代物件的資料

1、迭代器函式 iter()與next()

               iter(iterable)從可迭代物件中返回一個迭代器,iterable必須是                   能提供一個迭代器的物件

                next(iterable)  從迭代器iterator中獲取下一個記錄,如果無法獲                    取下一條記錄,則觸發StopIterator異常
 

     說明:

             ①迭代器只能往前取值,不會後退

             ②用iter函式可以返回一個可迭代物件的迭代器

      示例:

               >>> L = [1,3,5,7]
               >>> it = iter(L)    #讓L提供一個能訪問自己的迭代器
               >>> next(it)
               1
               >>> next(it)
               3

  2、迭代器的用途:

       可以依次訪問可迭代物件的資料(可代替迴圈遍歷)

       示例:>>> L = [1,23,45,6]
             >>> it = iter(L)
             >>> while True:
                 try:
                     x = next(it)
                     print(x)
                 except StopIteration:
                     break

二、迭代工具函式:

作用是生成一個個性化的可迭代物件

函式:
      zip(iter1 [,iter2[....]])

   返回一個zip物件,此物件用於生成元組,此元組的每個資料來源於引數中的可迭代       物件,當最小 的可迭代物件不再提供資料時迭代結束

   
   enumerate(iterable [,start])

   生成帶索引的列舉物件,返回的迭代型別為索引-值對(index- value),預設索引       從0 開始,也可用 start指定
   

     zip示例:>>> numbers = [10086,10000,10010,95588]
              >>> names = ['中國移動','中國聯通','中國電信']
              >>> for t in zip(numbers,names):
                  print(t)
                  (10086, '中國移動')
                  (10000, '中國聯通')
                  (10010, '中國電信')

  enumerate示例:

             >>> names = ['中國移動','中國電信','中國聯通']
             >>> for t in enumerate(names):
                      print(t)

             (0, '中國移動')
             (1, '中國電信')
             (2, '中國聯通')
            >>> for t in enumerate(names,101):
                      print(t)

             (101, '中國移動')
             (102, '中國電信')
             (103, '中國聯通')

三、生成器Generator

  生成器是指能夠動態提供資料的物件,生成器物件也是可迭代物件

  生成器有兩種:

            生成器函式

            生成器表示式

 生成器函式的定義:

         含有yield語句的函式是生成器函式 ,此函式被呼叫將返回一個生成器物件
          yield翻譯為產生(或生成)

yield 語句:

  語法:
            yield    表示式

  說明:
          yield 用於def函式中,目的是將此函式作用生成器函式使用
          yield用來生成資料,共迭代器和next(it)函式使用

生成器函式的說明:

  生成器函式的呼叫將返回一個生成器物件,生成器物件是一個可迭代物件,通常用來動態生成資料

  生成器函式呼叫return語句會觸發一個StopIteration異常

**推導式建立生成器

  L = [x*x for x in range(10)]  #生成一個列表
  g = (x*x for x in range(10))  #生成一個生成器
 
 可以利用遍歷去除生成器的元素,也可以利用__next__()來逐個取出。