零基礎入門Python3-高級特性詳解(2)
1、生成器
我們知道,列表生成式生成的列表占在內存中。當列表的元素較少時還行,但是達到了一定的數量,就會非常的浪費內存,因為我們用的可能是其中很少的幾個元素,其他的就閑置在那。而生成器就不一樣了,他就像是一個函數一樣,調用的時候,生成器才運行。所以,生成器節省了很大部分空間。每次調用生成器,它都會記住一個值,下次調用的時候,以上次的值為基準,推算出下一個值。生成器我們叫做generator。
(1)生成器的第一種創建方法:
a=( i for i in range(10))
print(a)
>>> <generator object <genexpr> at 0x000000000270A570>
(2)生成器 penerator
生成器的第一種創建方法類似列表生成式,只不過是把 [ ] 換成了 ( ) 。但是我們輸出之後,結果並沒有像列表生成式那樣,返回一個 list 。next()函數是調用的方法。比如:
# generator 的第一種調用方法:
next(g)
# 實例1:
g = (x for x in range(10))
>>> next(g)
0
>>> next(g)
1
>>> next(g)
2
......
>>> next(g)
9
>>> next(g)
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
next(a)
StopIteration
# 我們只創建了 0 - 9 ,所以,超出後,就顯示錯誤
但是這樣的方法沒有實用性,效率很低。我們可以試著用for循環調用一下,看可行不。
# 實例2
g = (x for x in range(10))
for i in g:
print(i,end=" ")
>>> 0 1 2 3 4 5 6 7 8 9
# 事實證明,可行。
(3)生成器 penerator 的第二種創建方法:
yield 返回值
yield 和 return 有相似之處,他們都由返回值的性質。但是yield有個特性,執行到 yield 語句的時候,就會停止並返回。下次接著從yield 語句處開始執行,再次遇到 yield,也會停止並返回。
# 實例3(非 generator)
def func(n):
for a in range(1,n):
b=a*a
print(b)
func(11)
>>>
1
4
9
16
25
36
49
64
81
100
# 實例4
# 我們把 print 更換為 yield ,這個函數就是 generator 了。
def func(n):
for a in range(1,n):
b=a*a
yield b
a=func(11)
# 為了明了,我們使用next函數調用看看。
next(a)
>>> 1
next(a)
>>> 4
next(a)
>>> 9
......
next(a)
>>> 100
# 結果是也一樣的
# 實例5,我們也可以使用for循環來叠代
for i in a:
print(i,end=" ")
>>> 1 4 9 16 25 36 49 64 81 100
# 結果是一樣的,只不過我們把換行符給替換掉了
2、叠代器
我們知道,能用 for 循環的,都是可叠代對象,包括 list、tuple、dict、set、str,還有剛講的生成器(generator)。這些對象稱為Iterable。
而叠代器是能被 next()函數調用的。所以,我們可以這麽定義:所有可以作用於for循環,還能被next()函數調用的對象,就是叠代器,稱為Iterator(廖雪峰老師那抄襲來的)
所有的叠代器(Iterator) 一定是可叠代對象 (Iterable),但是所有的可叠代對象(Iterator)不一定就是叠代器(Iterator)
但是,可叠代對象 list、dict、str可以轉化為叠代器。
iter(list、dict、str)
# 實例
from collections import Iterator
isinstance(iter(‘Python‘),Iteraotr)
>>> True
關註公眾號,了解更多!
零基礎入門Python3-高級特性詳解(2)