生成器
如果你想要一百萬個(gè)數(shù),而這些數(shù)里只有一百個(gè)數(shù)是你經(jīng)常要用的惜纸,剩下的都幾乎不怎么會(huì)用到叶撒,那么如果直接把這一百萬個(gè)數(shù)全部放在list中是不明智的因?yàn)檫@會(huì)浪費(fèi)較多存儲(chǔ)空間,生成器就是為了解決這個(gè)問題而生的耐版。
如果列表元素可以按照某種算法推算出來祠够,那我們是否可以在循環(huán)的過程中不斷推算出后續(xù)的元素呢?這樣就不必創(chuàng)建完整的list粪牲,從而節(jié)省大量的空間古瓤。在Python中,這種一邊循環(huán)一邊計(jì)算的機(jī)制腺阳,稱為生成器:generator落君。
生成器表達(dá)式: 通列表解析語法,只不過把列表解析的[]換成()
我們可以直接打印出list的每一個(gè)元素亭引,但我們?cè)趺创蛴〕鰃enerator的每一個(gè)元素呢绎速?
如果要一個(gè)一個(gè)打印出來,可以通過next()函數(shù)獲得generator的下一個(gè)返回值:
當(dāng)然這種獲取值的方法很笨痛侍,所以我們一般用循環(huán)來迭代生成器的對(duì)象
迭代器
前面我們已經(jīng)學(xué)過了for循環(huán)朝氓,我們知道for循環(huán)可以遍歷list魔市、tuple、dict赵哲、set待德、str和生成器。
這些可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象:Iterable枫夺。
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterable對(duì)象:
>>> 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)的對(duì)象都是Iterable類型将宪;
凡是可作用于next()函數(shù)的對(duì)象都是Iterator類型,它們表示一個(gè)惰性計(jì)算的序列橡庞;
集合數(shù)據(jù)類型如list较坛、dict、str等是Iterable但不是Iterator扒最,不過可以通過iter()函數(shù)獲得一個(gè)Iterator對(duì)象丑勤。
Python的for循環(huán)本質(zhì)上就是通過不斷調(diào)用next()函數(shù)實(shí)現(xiàn)的,例如: