知識點:生成器是一種特殊的迭代器,使用關鍵字yield來生成就可以,十分簡單
1、示例**:
"""生成器是一種特殊的迭代器,內部實現了__iter__和__next__方法,所以生成器只要要使用關鍵字yield
"""#
使用生成器做乙個菲波那切數列
deftest1(num):
a, b = 0, 1flag =0
while
true:
if flag yield a #
使用yield關鍵字即可變為生成器,此時整個test1不能看作是乙個函式了,test1會返回乙個生成器物件
#執行到此句**時,會暫停**,當再次執行到此處,會繼續上一次執行
a, b = b, a+b
flag += 1
else
:
raise
stopiteration
obj1 = test1(5) #
生成器物件
for i in
obj1:
print(i)
執行結果:01
123
2、使用yield建立多工:
#建立任務時,在**結尾加個yield即可
deftest1():
while
true:
print('
test1')
yield
deftest2():
while
true:
print('
test2')
yield
defmain():
t1 = test1() #
建立生成器物件
t2 =test2()
while true: #
通過迴圈next方法去獲取任務裡面的值,原理:當next(t1)遇到yield,凍結**,執行next(t2),遇到yield,凍結**,執行next(t1)
#所以使用yield實現多工其實就是倆個任務交替執行,不是真正的同時執行
next(t1)
next(t2)
if__name__ == '
__main__':
main()
3、使用greenlet建立多工,greenlet是對yield的封裝:
from greenlet importgreenlet
import
time
deftest1():
while
true:
print('
test1')
g2.switch()
time.sleep(1)
deftest2():
while
true:
print('
test2')
g1.switch()
time.sleep(1)
g1 =greenlet(test1)
g2 =greenlet(test2)
g2.switch()
4、使用gevent建立多工,gevent是對greenlet的封裝,以後若使用協程建立多工,都是用gevent,前面介紹的是為這個做鋪墊的:
"""協程其實就是利用**中耗時等待的時間去做另外一件事,所以只要在任務中加個耗時間就可以,但是不是使用time裡的時間,
要使用gevent中的耗時時間
"""def
test1():
for i in range(5):
print('
test1')
gevent.sleep(1) #
加乙個耗時等待時間
deftest2():
for i in range(5):
print('
test2')
gevent.sleep(1)
defmain():
g1 = gevent.spawn(test1) #
呼叫spawn方法,將任務傳進去,
g2 =gevent.spawn(test2)
gevent.joinall([g1,g2])
#使用joinall方法,把建立的任務物件放在乙個列表裡傳進去,這也是乙個耗時時間
if__name__ == '
__main__':
main()
執行結果:
test1
test2
test1
test2
test1
test2
Python 生成器,協程
生成器可以簡單有效的建立龐大的可迭代物件,而不需要在直接在記憶體中建立儲存整個序列 可以使用生成器推導式或者生成器函式來建立生成器 生成器函式返回資料時使用yield語句,而不是使用return def countdown n print counting down from d n while n...
生成器進化到協程 Part 2
在 part 1 我們已經介紹了生成器的定義和生成器的操作,現在讓我們開始使用生成器。part 2 主要描述了如何使用yield和contextmanager建立乙個上下文管理器,並解釋了原理。理解上下文可以聯想我們做閱讀理解時要解讀文章某處的意思需要閱讀該處前後段落,正是前後文提供了理解的 背景 ...
Kotlin協程案例 序列生成器
一 使用kotlin協程,寫乙個斐波拉契序列 package cn.kotliner.coroutine.sequence import kotlin.coroutines.experimental.buildsequence author wangdong description fun main...