1. 程式人生 > 其它 >python——生成器(協程)gevent多工, 生成器,迭代器

python——生成器(協程)gevent多工, 生成器,迭代器

#使用生成器完成斐波那鍥
def create_num(all_num):
    a, b = 0, 1
    current_num = 0
    while current_num < all_num:
        yield a#有yield就是生成器
        a, b = b, a+b
        current_num += 1
obj = create_num(10)
for i in obj:
    print(i)
#使用生成器完成斐波那鍥
def create_num(all_num):
    a, b = 0, 1
    current_num 
= 0 while current_num < all_num: yield a#有yield就是生成器 #遇到yield會暫停,再次呼叫函式的時候回從yield的地方開始執行 a, b = b, a+b current_num += 1 obj = create_num(10) #生成器是一種特殊的迭代器 ret = next(obj) print(ret) ret = next(obj) print(ret) for i in obj: print(i)

使用生成器實現多工

#使用yield完成多工
import
time def task_1(): while True: print("----1----") time.sleep(0.1) yield def task_2(): while True: print("----2----") time.sleep(0.1) yield def main(): #建立生成器物件 t1 = task_1() t2 = task_2() while True: next(t1) next(t2)
#實現了函式的交替執行,交替的實現函式的多工 if __name__=="__main__": main()

用gevent代替next

import gevent
import time
def f1(n):
    for i in range(n):
        print(gevent.getcurrent(),i)
        # time.sleep(0.1)
        gevent.sleep(0.1)#gevent遇到延時就會多工,延時操作不能用上面的那種方式,必須要用這樣的
def f2(n):
    for i in range(n):
        print(gevent.getcurrent(),i)
        # time.sleep(0.2)
        gevent.sleep(0.1)
print("-----1-----")
g1 = gevent.spawn(f1,5)
print("-----2-----")
g2 = gevent.spawn(f2,5)
g1.join()
g2.join()
import gevent
import time
from gevent import monkey monkey.patch_all()
#加上這個語句的話就不需要再使用gevent.sleep(0.1)這樣的延時語句了,time.sleep(0.1)也可以用了 def f1(n): for i in range(n): print(gevent.getcurrent(),i) time.sleep(0.1) def f2(n): for i in range(n): print(gevent.getcurrent(),i) time.sleep(0.1) print("-----1-----") g1 = gevent.spawn(f1,5) print("-----2-----") g2 = gevent.spawn(f2,5) g1.join() g2.join()
import gevent
import time
from gevent import monkey
monkey.patch_all()#加上這個語句的話就不需要再使用gevent.sleep(0.1)這樣的延時語句了,time.sleep(0.1)也可以用了
def f1(n):
    for i in range(n):
        print(gevent.getcurrent(),i)
        time.sleep(0.1)
def f2(n):
    for i in range(n):
        print(gevent.getcurrent(),i)
        time.sleep(0.1)
gevent.joinall([gevent.spawn(f1,5),gevent.spawn(f2,5)])
#建立生成器

#fisrt step : 定義一個包含yield語句的函式
def test(val,step):
    print("----------------")
    cur = 0
    for i in range(val):
        cur += i*step
        yield cur
#函式被呼叫的時候並沒有執行
t = test(10,2)
print("=============")
print(next(t))#當程式第一次呼叫next時,test函式才開始執行
print(next(t))
print(next(t))
print(next(t))

#程式可以使用for迴圈來呼叫next
print("======================")
for ele in t:
    print(ele)
=============
----------------
0
2
6
12
======================
20
30
42
56
72
90
請按任意鍵繼續. . .

實現迭代器

#字典列表元組都是可以迭代的,這些物件都是可迭代的,因此都是屬於迭代器

#如果開發者需要實現迭代器,只要實現__iter__,__next___
class Cal:
    """"
    一個迭代器,返回 2,4,6,8,10
    """
    def __init__(self):
        self.ini = 0
    def __next__(self): #next用於返回迭代器的下一個元素
        if self.ini == 10:
            raise StopIteration
        else:
            self.ini += 2
        return self.ini
    def __iter__(self):#該方法返回一個迭代器(iterator)
        return self

c = Cal()

for cc in c:
    print(cc)
2
4
6
8
10
請按任意鍵繼續. . .