iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

Why it works: python requests and urllib3系列 第 26

Day26-python-yield-1

處理streaming的資料,Requests使用了iter_content這個函式,裡面用到yieldgenerator的觀念

試試看了解yield的概念。

搜尋後發現常常和generatorreturn這兩個概念放在一起說明

generator

官網中出現3個和generator相關的名詞

  • generator
    • A function which returns a generator iterator
    • it contains yield expressions
  • generator iterator
    • An object created by a generator function.
  • generator expression
    • An expression that returns an iterator

使用上的好處是執行當下才會取得該次呼叫所產生出來的值,類似時間換取空間的概念,若遇到大量資料輸入或者當下不知道資料量大小加上不想要一次載入至記憶體內可以利用該特性

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

iterator

想要提供iteration的特性,需定義 container.__iter__()
想要宣告iterator objects,需定義iterator.__iter__(), iterator.__next__()

參考


上一篇
Day25-CaseInsensitiveDict
下一篇
Day27-python-yield-2
系列文
Why it works: python requests and urllib330
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言