Python3中的列表生成式、生成器與迭代器實例詳解
本文實例講述了Python3中的列表生成式、生成器與迭代器。分享給大家供大家參考,具體如下:
列表生成式
Python內(nèi)置的一種極其強大的生成列表 list 的表達(dá)式。返回結(jié)果必須是列表。
基本語法:
[ 變量表達(dá)式 for 變量 in 表達(dá)式 ]
示例
a = [x ** 2 for x in range(1, 10)] b = [x * x for x in range(1, 11) if x % 2 == 0] c = [m + n for m in 'ABC' for n in '123'] d = {'Java': "99", 'C': "99", 'C++': "99"} L = [k + '=' + v for k, v in d.items()] print(a) print(b) print(c) print(L)
通過列表生成式,可以直接創(chuàng)建一個列表,但是,受到內(nèi)存的限制,列表容量是有限的,當(dāng)列表元素很大的時候,會很浪費內(nèi)存空間。所以可以通過生成器 Generator 生成。
生成器 Generator
Generator 是一種一邊循環(huán)一邊計算的機(jī)制。
應(yīng)用場景:只需要獲得 list 中的前幾個元素,節(jié)省存儲空間。
使用 () 創(chuàng)建列表生成器
把列表生成式的中括號 [] 修改為圓括號即可 ()
a = (x ** 2 for x in range(1, 10)) b = (x * x for x in range(1, 11) if x % 2 == 0) c = (m + n for m in 'ABC' for n in '123') d = {'Java': "99", 'C': "99", 'C++': "99"} L = (k + '=' + v for k, v in d.items()) print(a) print(b) print(c) print(L)
打印結(jié)果如下
<generator object <genexpr> at 0x1052ec2b0>
<generator object <genexpr> at 0x1052ec468>
<generator object <genexpr> at 0x1052ec4c0>
<generator object <genexpr> at 0x1052ec518>
使用 next 調(diào)用元素:
print(a.__next__()) print(a.__next__()) print(a.__next__()) print(a.__next__())
next 方法會一個個的返回元素值,調(diào)用一次,返回一次下一個位置的元素。
該方法在沒有元素可以調(diào)用的時候,會返回 StopIteration 的錯誤
使用循環(huán)調(diào)用元素
for i in a: print(i)
該方法的好處,是不會返回 StopIteration 的錯誤
yield 關(guān)鍵字 創(chuàng)建 Generator
如果一個函數(shù)包含了yield 關(guān)鍵字,那么該函數(shù)就不再是普通的函數(shù),而是一個生成器 Generatior。
將 print(sum)
修改為 yield(sum)
,即將原來的函數(shù),修改為了生成器。
def fib(n): sum = 0 i = 0 while (i<n): sum = sum + i i += 1 yield(sum) print(type(fib(10))) for x in fib(10): print(x)
包含 yield 語句的函數(shù)會被特定的編譯成生成器??梢园缮善骼斫鉃榈鳌?/p>
在調(diào)用生成器運行的過程中,每次遇到 yield 時函數(shù)會暫停并保存當(dāng)前所有的運行信息,返回yield的值。并在下一次執(zhí)行 next()方法時從當(dāng)前位置繼續(xù)運行。
Generator 的工作原理,是在for循環(huán)的過程中不斷計算出下一個元素,并在適當(dāng)?shù)臈l件結(jié)束for循環(huán)。
對于函數(shù)改成的generator來說,遇到return語句或者執(zhí)行到函數(shù)體最后一行語句,就是結(jié)束generator的指令,for循環(huán)隨之結(jié)束。
python 生成器可參考 http://www.dbjr.com.cn/article/63929.htm
以下實例使用 yield 實現(xiàn)斐波那契數(shù)列
#!/usr/bin/python3 import sys def fibonacci(n): # 生成器函數(shù) - 斐波那契 a, b, counter = 0, 1, 0 while True: if (counter > n): return yield a a, b = b, a + b counter += 1 f = fibonacci(10) # f 是一個迭代器,由生成器返回生成 while True: try: print (next(f), end=" ") except StopIteration: sys.exit()
迭代器 iterator
- 迭代器是訪問集合元素的一種方式
- 迭代器有兩個方法,生成迭代器 iter(),返回迭代器的下一個項目 next()
- 迭代器對象從集合的第一個元素開始訪問,知道所有元素被訪問結(jié)束。迭代器只能往前,不能回退。
- 字符串、列表、元組 都可以用于創(chuàng)建迭代器
迭代器 iterator 和可迭代對象 iterable 的區(qū)別在于:
可以直接作用于for循環(huán)的對象統(tǒng)稱為可迭代對象:Iterable,list、tuple、dict、set、str、Generator 等等。
可以被next()
函數(shù)調(diào)用并不斷返回下一個值的對象稱為迭代器:Iterator
使用 iter 創(chuàng)建迭代器
list、dict、str等數(shù)據(jù)類型不是Iterator,但是可以通過 iter() 來創(chuàng)建迭代器 list=[1,2,3,4] it = iter(list) # 創(chuàng)建迭代器對象 print (next(it)) # 輸出迭代器的下一個元素 1 print (next(it)) 2
Python迭代器 Iterator 可參考:http://www.dbjr.com.cn/article/128183.htm
附:廖學(xué)峰Python相關(guān)資料下載:
廖雪峰 Python2.7 教程 PDF版:http://www.dbjr.com.cn/books/536707.html
廖雪峰 python3 教程(帶標(biāo)簽完整版):http://www.dbjr.com.cn/books/536708.html
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計有所幫助。
相關(guān)文章
python爬蟲模擬瀏覽器訪問-User-Agent過程解析
這篇文章主要介紹了python爬蟲模擬瀏覽器訪問-User-Agent過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12python中將zip壓縮包轉(zhuǎn)為gz.tar的方法
今天小編就為大家分享一篇python中將zip壓縮包轉(zhuǎn)為gz.tar的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10python實現(xiàn)翻轉(zhuǎn)棋游戲(othello)
這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)翻轉(zhuǎn)棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07Python發(fā)送手機(jī)動態(tài)驗證碼代碼實例
這篇文章主要介紹了Python發(fā)送手機(jī)動態(tài)驗證碼代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02python光學(xué)仿真實現(xiàn)光線追跡折射與反射的實現(xiàn)
這篇文章主要為大家介紹了python光學(xué)仿真實現(xiàn)光線追跡折射與反射的實現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10