軟體測試學習教程—— 簡談list相關的生成器表示式
首先看看一個列表的型別,我們透過 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 軟體測試學習教程—Web測試之正規表示式Web
- 軟體測試學習教程—軟體測試質量
- 軟體測試相關簡要記錄
- 軟體測試學習教程—軟體測試基本知識
- 軟體測試學習教程—迴歸測試
- 軟體測試學習教程——JDBC配置JDBC
- 軟體測試學習教程—軟體測試基礎理論五
- 軟體測試學習教程—軟體測試基礎理論六
- 軟體測試學習教程—軟體測試基礎理論四
- 軟體測試學習教程—軟體測試基礎理論三
- 軟體測試學習教程——JDBC開發JDBC
- 軟體測試學習教程——JDBC介紹JDBC
- 軟體測試學習教程——WEB測試之JS記憶體WebJS記憶體
- 軟體測試學習教程——LoadRunner實現介面測試
- 軟體測試學習教程—JavaScript內建物件JavaScript物件
- 軟體測試學習 ——五種軟體測試模型模型
- 軟體測試學習教程—Jmeter元件介紹(二)JMeter元件
- 學習旅途(軟體測試)
- 軟體測試整理學習
- 軟體測試學習教程——【大蟒蛇】python基礎Python
- 軟體測試學習教程——Java實現氣泡排序Java排序
- 軟體測試培訓分享:學習能力差可以學習軟體測試嗎
- 軟體測試學習路線
- 【分享】—如何學習軟體測試
- 【軟體測試】學習筆記筆記
- 軟體測試的具體學習路線
- 我談軟體測試
- 淺談軟體測試
- 軟體測試相關概念以及原則(一)
- 軟體測試學習網站有哪些?怎麼學軟體測試呢?學習網站
- 軟體測試學習教程——HP Loadrunner12.50安裝教程
- 軟體測試學習教程——CentOS 7 修改網路卡設定CentOS
- 軟體測試學習教程——Python SMTP傳送郵件Python
- 軟體測試學習教程——Python實現反射機制Python反射
- 軟體測試經理談軟體測試人員的自我提升
- 軟體測試教程之手機軟體測試方法
- 學習 java 做自動化測試相關Java
- Oracle SCN相關問題學習與測試Oracle