人人都能學會的python編程教程15:高級特性2

生成器

如果你想要一百萬個數(shù),而這些數(shù)里只有一百個數(shù)是你經(jīng)常要用的,剩下的都幾乎不怎么會用到,那么如果直接把這一百萬個數(shù)全部放在list中是不明智的因為這會浪費較多存儲空間,生成器就是為了解決這個問題而生的。

如果列表元素可以按照某種算法推算出來,那我們是否可以在循環(huán)的過程中不斷推算出后續(xù)的元素呢?這樣就不必創(chuàng)建完整的list,從而節(jié)省大量的空間。在Python中,這種一邊循環(huán)一邊計算的機制,稱為生成器:generator。

生成器表達式: 通列表解析語法,只不過把列表解析的[]換成()

寶寶都能學會的python編程教程15:高級特性2

我們可以直接打印出list的每一個元素,但我們怎么打印出generator的每一個元素呢?

如果要一個一個打印出來,可以通過next()函數(shù)獲得generator的下一個返回值:

寶寶都能學會的python編程教程15:高級特性2

當然這種獲取值的方法很笨,所以我們一般用循環(huán)來迭代生成器的對象

寶寶都能學會的python編程教程15:高級特性2

迭代器

前面我們已經(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)的,例如:

寶寶都能學會的python編程教程15:高級特性2
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.1==,is的使用 ·is是比較兩個引用是否指向了同一個對象(引用比較)。 ·==是比較兩個對象是否相等。 1...
    TENG書閱讀 787評論 0 0
  • Python 是一種相當高級的語言,通過 Python 解釋器把符合語法的程序代碼轉(zhuǎn)換成 CPU 能夠執(zhí)行的機器碼...
    Python程序媛閱讀 2,031評論 0 3
  • 在python中,代碼不是越多好,而是越少越好;代碼不是越復雜越好,而是越簡單越好;代碼越少,開發(fā)效率越高! 1 ...
    祐吢房_2c9a閱讀 349評論 1 1
  • 切片 對于取指定索引范圍的操作,用循環(huán)十分繁瑣,因此,Python提供了切片(Slice)操作符,能大大簡化這種操...
    抽象語法樹閱讀 334評論 0 0
  • 葉子寫的文章《22歲賺足20萬,廢材的逆襲之路》,讀來灑脫勁道,利落順暢。觀點聚焦,故事生動,言之有物,畫龍點睛。...
    哈佛媽媽親子園閱讀 560評論 14 7

友情鏈接更多精彩內(nèi)容