Python:Tornado 第一章:異步及協程基礎:第二節:Python關鍵字yield

上一篇文章: Python:Tornado 第一章:異步及協程基礎:第一節:同步與異步I/O
下一篇文章: Python:Tornado 第一章:異步及協程基礎:第三節:協程

協程是Tornado中進行異步I/O代碼開發的方法。協程使用了Python關鍵字yield將調用者掛起和恢復執行。因此在學習協程以前,咱們先熟悉一下yield的概念和使用方法,而要想理解yield,須要先理解迭代器的概念。編程

在Python種,使用yield 關鍵字定義的迭代器也被稱爲【生成器】

一、迭代器

迭代器(Iterator)是訪問集合內元素的一種方式。迭代器對象從集合的第1個元素開始訪問,直到全部元素都被訪問一遍後結束。迭代器不能後退,只能前進迭代。

Python種最經常使用迭代器的場景是循環語句for,它用迭代器封裝集合,而且煮個訪問集合元素以執行循環。segmentfault

例如:異步

for number in range(5):#range返回一個列表
    print(number)

其中的range()返回一個包含所指定元素的集合,而for語句將其封裝成一個迭代器後訪問,使用iter()能夠講列表、集合轉換成迭代器,例如:函數

numbers=[1,2,3,4,5]
#t就是迭代器
t=iter(numbers)
#打印t對象,以便查看其類型
print(t)

返回結果:學習

<list_iterator object at 0x10e805748>

迭代器與普通Python對象相比,多了一個__next__()方法,每次調用該方法能夠返回一個元素,調用者(例如for語句)能夠經過不斷調用__next__()方法來煮個訪問集合元素。spa

例如:code

numbers=[1,2,3,4,5]
#t就是迭代器
t=iter(numbers)
#打印t對象,以便查看其類型
print(t.__next__())
print(t.__next__())
print(t.__next__())
print(t.__next__())

返回結果:協程

1
2
3
4

調用者能夠一直調用__next__()方法,直到返回StopIteration異常。對象

二、使用yield

迭代器在Python編程種的使用範圍很廣,那麼開發者如何定製本身的迭代器呢?

答案是使用yield關鍵字。開發

調用任何定義包含yield關鍵字的函數都不會執行該函數,而是會得到一個隊應於該函數的迭代器。

實例:

import time
def demoIternator():
    print("---1---")
    yield 1
    print("---2---")
    yield 2
    print("---3---")
    yield 3
    print("---4---")

for x in demoIternator():
    print(x)
    time.sleep(1)

結果

每次調用迭代器的__next__()方法,將執行迭代器函數,並返回yield的結果做爲迭代返回元素。

相關文章
相關標籤/搜索