處理streaming的資料,Requests使用了iter_content
這個函式,裡面用到yield
和generator
的觀念
試試看了解yield的概念。
搜尋後發現常常和generator
和return
這兩個概念放在一起說明
官網中出現3個和generator相關的名詞
使用上的好處是執行當下才會取得該次呼叫所產生出來的值,類似時間換取空間的概念,若遇到大量資料輸入或者當下不知道資料量大小加上不想要一次載入至記憶體內可以利用該特性
from collections.abc import Iterable
def show_detail(item):
print(item)
print('Is my_generator iterable: {}'.format(isinstance(item, Iterable)))
def my_gen():
local_var = 0
yield 'first time invocation: {}'.format(local_var)
local_var = local_var + 1
yield 'second time invocation: {}'.format(local_var)
if __name__ == '__main__':
generator_expression = (i*2 for i in range(10))
show_detail(generator_expression)
for g_expr in generator_expression:
print(g_expr)
my_generator = my_gen()
show_detail(my_generator)
for g in my_generator:
print(g)
<generator object <genexpr> at 0x7f0b5d35ddb0>
Is my_generator iterable: True
0
2
4
6
8
10
12
14
16
18
<generator object my_gen at 0x7f0b5d35de08>
Is my_generator iterable: True
first time invocation: 0
second time invocation: 1
想要提供iteration的特性,需定義 container.__iter__()
想要宣告iterator objects,需定義iterator.__iter__()
, iterator.__next__()