軟體測試學習教程—— 簡談list相關的生成器表示式

千鋒教育官方發表於2019-09-19


  首先看看一個列表的型別,我們透過 isinstance() 函式來判斷一個列表的型別,透過實驗 1 可以看出其只是一個可迭代的物件,而不是一個迭代器。可以透過 iter() 函式返回一個其對應的迭代器。

 

“生成器表示式(簡稱生成式)”實際上可以理解為“迭代”和“列表解析”的組合,它使用小括號來表示。在實驗 2 中,該生成式既是一個迭代器,又是一個可迭代物件。但是這個時候生成式是不能直接以列表形式輸出列印的。

 

 

from typing import Iterable, Iterator

 

if __name__ == "__main__":

    print("====== 案例1 ==========")

    lst = [1, 4, 8]

    print(isinstance(lst, Iterable))   # 是否可迭代 True

    print(isinstance(lst, Iterator))   # 是否迭代器 False

    print(isinstance(iter(lst), Iterator))  # 轉成迭代器 True

 

    print("====== 案例2 ==========")

    lst2 = (x * x for x in range(1, 4))

    print(isinstance(lst2, Iterable))  # 是否可迭代 True

    print(isinstance(lst2, Iterator))  # 是否迭代器 True

     print(lst2)

 

 

輸出:

====== 案例1 ==========

True

False

True

====== 案例2 ==========

True

True

<generator object <genexpr> at 0x00000000029DFB88>

 

 

 

在列表中,我們可以透過 range() 函式自動生成一個整數列表,也可以在生成新列表的同時,對原列表元素再依次進行其它的處理。在沒有for進行迴圈迭代的時候,我們需要透過list() 函式將其轉換為一個可以輸出的列表。

 

if __name__ == "__main__":

    lst = list(range(5))

    print(lst)

 

    lst = [x+1 for x in [5, 5, 5]]

    print(lst)

 

    lst = [x * x for x in list(range(1, 8)) if x % 2 == 0]

    print(lst)

 

    lst = [x * y for x in range(1, 3) for y in range(10, 15)]

    print(lst)

 

    

輸出:    

[0, 1, 2, 3, 4]

[6, 6, 6]

[4, 16, 36]

[10, 11, 12, 13, 14, 20, 22, 24, 26, 28]

 

 

 

生成器是一個“機器”,用來生產零件,每呼叫一次 next() 函式的時候就生產一個零件,所以,呼叫生成器提前不知道有多少個零件,只能透過 next() 方法進行不停呼叫,直至丟擲 StopIteration 異常為止。呼叫生成器的時候,碰到 yield 語句就停止本次生產。

 

from typing import Iterable, Iterator

 

if __name__ == "__main__":

    print("====== 案例1 ==========")

    # 用小括號表示的是生成器

    lst = (x * x for x in range(5))

    # 生成器返回的是一個物件,而不是列表

    print(type(lst))

    # 生成器生成的物件,需要使用迭代(for)的方法檢視

    for x in lst:

        print(x)

 

    print("====== 案例2 ==========")

 

    # 呼叫時執行到 yield 即停止

    def add(x, y, num):

        for v in range(1, num):

            t = (x + y) * v

            # yield 有return 的作用

            yield t

 

    m = add(1, 1, 5)

    # 是否“可迭代物件”

    print(isinstance(m, Iterable))

    # 是否是一個“迭代器”

    print(isinstance(m, Iterator))

    # 執行到第一次 yield 即停止

    print(next(m))

    # 從第二次 yield 開始執行直到結束

    for x in m:

        print(x)

             

輸出:

====== 案例1 ==========

<class 'generator'>

0

1

4

9

16

====== 案例2 ==========

True

True

2

4

6

8

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2657564/,如需轉載,請註明出處,否則將追究法律責任。

相關文章