python迭代器和生成器

迭代器

#可以被netxt()函數調用不斷返回一個值的對象成爲迭代器:Iterator
#迭代器是訪問集合元素的一種方式,從集合第一個元素開始(用next()方法)訪問就不能回退,便於循環遍歷一些較大的數據集合節省內存和時間。

一個簡單的迭代器:
numbers = iter([1,2,3])
print(numbers)
print(numbers.__next__())
print(numbers.__next__())

Result:<list_iterator object at 0x1021777b8>
            1
            2

 生成器

# 通過列表生成式,我們可以直接創建一個列表。但是,受到內存限制,列表容量肯定是有限的。
#如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素佔用的空間都白白浪費了。
#這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱爲生成器:generator。
#一個簡單的生成器:
  >>> g = (x * for in range(10))
  >>> g
<generator object <genexpr> at 0x1022ef630>
 
#一個函數返回的是一個迭代器,這個函數就是一個生成器.
# 主要作用是保持函數的執行狀態,可以中斷函數的執行然後繼續.


def cash_money (number):
    while number > 0:
        number -= 100
        yield 100
        print("取了100元!")

atm= cash_money(500)
print(type(atm))
print(atm.__next__())
print(atm.__next__())
print("去吃飯")#中斷了函數的循環,去執行另外的任務.
print(atm.__next__()) #繼續生成器中的循環 這個很強大.

而在實際操作中,我們並不用不停的__next__(),而是用for循環即可遍歷生成器:

 

>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)
...
0
1
4
9
16
25
36
49
64
81

 總結:

 我們已經知道,可以直接作用於for循環的數據類型有以下幾種
  一類是集合數據類型,如list、tuple、dict、set、str等 
  一類是generator,包括生成器和帶yield的generator function 
  這些可以直接作用於for循環的對象統稱爲可迭代對象:Iterable
  可以使用isinstance()判斷一個對象是否是Iterable對象:
  
  >>> from collections import Iterable
  >>> isinstance([], Iterable) 
      True
  >>> isinstance({}, Iterable)
      True
  >>> isinstance('abc', Iterable)
      True
  >>> isinstance((x for x in range(10)), Iterable)
      True
  >>> isinstance(100, Iterable)
      False
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章