1. 程式人生 > >零基礎入門Python3-高級特性詳解(2)

零基礎入門Python3-高級特性詳解(2)

tuple html UNC spa 顯示錯誤 collect rac 實例 零基礎入門

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)