如果你想要一百萬個數,而這些數里只有一百個數是你經常要用的,剩下的都幾乎不怎麼會用到,那麼如果直接把這一百萬個數全部放在list中是不明智的因為這會浪費較多儲存空間,生成器就是為了解決這個問題而生的。
如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,從而節省大量的空間。在python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。
生成器表示式: 通列表解析語法,只不過把列表解析的換成()
我們可以直接列印出list的每乙個元素,但我們怎麼列印出generator的每乙個元素呢?
當然這種獲取值的方法很笨,所以我們一般用迴圈來迭代生成器的物件
前面我們已經學過了for迴圈,我們知道for迴圈可以遍歷list、tuple、dict、set、str和生成器。
這些可以直接作用於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
複製**
凡是可作用於for迴圈的物件都是iterable型別;
凡是可作用於next()函式的物件都是iterator型別,它們表示乙個惰性計算的序列;
集合資料型別如list、dict、str等是iterable但不是iterator,不過可以通過iter()函式獲得乙個iterator物件。
python的for迴圈本質上就是通過不斷呼叫next()函式實現的,例如:
人人都能學會的python程式設計教程11 定義函式
在python中,定義乙個函式要使用def語句,依次寫出函式名 括號 括號中的引數和冒號 然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。我們以自定義乙個求絕對值的my abs函式為例 如果你已經把my abs 的函式定義儲存為abstest.py檔案了,那麼,可以在該檔案的當前目錄...
人人都能學會的python程式設計教程10 呼叫函式
python裡的函式和數學意義上的函式並沒有太大差別。python內建了很多有用的函式,我們可以直接呼叫。要呼叫乙個函式,需要知道函式的名稱和引數,比如求絕對值的函式abs,只有乙個引數。呼叫函式的時候,如果傳入的引數數量不對,會報typeerror的錯誤,並且python會明確地告訴你 abs 有...
人人都能學會的python程式設計教程12 函式的引數
python的函式定義非常簡單,也非常靈活。除了正常定義的必選引數外,還可以使用預設引數 可變引數和關鍵字引數,使得函式定義出來的介面,不但能處理複雜的引數,還可以簡化呼叫者的 我們先寫乙個計算x的平方的函式 def power x return x x 這裡的引數x就是乙個位置引數。當我們呼叫po...