ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python——生成器(协程)gevent多任务, 生成器,迭代器

2021-12-19 15:04:44  阅读:189  来源: 互联网

标签:协程 python 生成器 num next gevent sleep print def


#使用生成器完成斐波那锲
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
请按任意键继续. . .

 

标签:协程,python,生成器,num,next,gevent,sleep,print,def
来源: https://www.cnblogs.com/shunguo/p/14534333.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有