生成器
如果你想要一百萬個數(shù),而這些數(shù)里只有一百個數(shù)是你經(jīng)常要用的,剩下的都幾乎不怎么會用到,那么如果直接把這一百萬個數(shù)全部放在list中是不明智的因為這會浪費較多存儲空間,生成器就是為了解決這個問題而生的。
如果列表元素可以按照某種算法推算出來,那我們是否可以在循環(huán)的過程中不斷推算出后續(xù)的元素呢?這樣就不必創(chuàng)建完整的list,從而節(jié)省大量的空間。在Python中,這種一邊循環(huán)一邊計算的機制,稱為生成器:generator。
生成器表達式: 通列表解析語法,只不過把列表解析的[]換成()
我們可以直接打印出list的每一個元素,但我們怎么打印出generator的每一個元素呢?
如果要一個一個打印出來,可以通過next()函數(shù)獲得generator的下一個返回值:
當然這種獲取值的方法很笨,所以我們一般用循環(huán)來迭代生成器的對象
迭代器
前面我們已經(jīng)學過了for循環(huán),我們知道for循環(huán)可以遍歷list、tuple、dict、set、str和生成器。
這些可以直接作用于for循環(huán)的對象統(tǒng)稱為可迭代對象: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
凡是可作用于for循環(huán)的對象都是Iterable類型;
凡是可作用于next()函數(shù)的對象都是Iterator類型,它們表示一個惰性計算的序列;
集合數(shù)據(jù)類型如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函數(shù)獲得一個Iterator對象。
Python的for循環(huán)本質(zhì)上就是通過不斷調(diào)用next()函數(shù)實現(xiàn)的,例如: