生成器

生成器

一、什麼是生成器

生成器是一個自定義的迭代器,本質上是一個迭代器,內置有.__ iter__ () 和. __ next__()python

二、如何實現生成器

  • 在函數內部定義yield
  • 調用函數時,函數體代碼不會執行
  • 會返回一個值,這個返回值就是生成器

三、yield

  • 每次yield都會往生成器對象中添加一個值
  • yield只能在函數內部定義
  • yield讓函數執行暫停,下次調用從上次暫停位置繼續執行,直到從新遇到yield再次被暫停

四、yield與return的區別

相同點:返回值的個數都是無限制的函數

不一樣點:return只能返回一次,函數便終止執行後續代碼,yield能夠屢次使用,讓函數執行暫停,下次調用從上次暫停位置繼續執行,直到從新遇到yield再次被暫停code

def func():
    print("函數體代碼")
    yield
    yield 2
    yield 3, 4, '5', '6'  # yield返回多個值也是默認返回成元組,可修改爲其餘的類型返回出去
    yield ['7', 8, 9]

# 正常執行不會執行函數體代碼
# res是一個迭代器,若是不賦值給res會重複執行第一個yield
res = func()
# 當咱們經過__next__取值時,纔會執行函數體代碼。
# res.__next__()  # 執行函數體代碼,獲得返回值none但沒打印返回值,因此沒有
print(res.__next__())
# yield能夠保存函數的暫停狀態,下次在上次基礎上執行直到遇到下次yield
print(res.__next__())
print(res.__next__())
# print(res.__next__())  # StopIteration報錯
>>>
函數體代碼
None
2
(3, 4, '5', '6')

# next(迭代器對象)至關於迭代器對象.__next__()
next(res)  # 執行函數體代碼,獲得返回值none但沒打印返回值,因此沒有
print(next(res))
print(next(res))
print(next(res))
>>>
函數體代碼
2
(3, 4, '5', '6')
['7', 8, 9]

# 若是不報錯想自動執行
while True:
    try:
        print(next(res))
    except StopIteration:
        break

自定義range,實現range功能對象

def my_range(start,end,move=1):
    while start < end:
        yield start
        start += move
        
for i in my_range(1,5):
    print(i)
>>>
1
2
3
4

for i in my_range(1,6,2):
    print(i)
>>>
1
3
5
相關文章
相關標籤/搜索