• Python生成器:


    协程

    创建生成器的第一种方式:生成器的推导式

    迭代器本质:底层拥有__iter__和__next__方法

    迭代器获取可迭代对象的数据 for循环 list强转 tuple强转 next()取下一个数据

    简单来说生成器本质上就是一个迭代器

    列表的推导式 本质 通过for 循环 往列表里增加数据

    1. list1 = [i for i in range(1, 11)]
    2. print(list1)
    3. print(type(list1))
    4. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    5. <class 'list'>
    1. tuple1 = (i for i in range(1,11))
    2. # 就是一个生成器
    3. print(tuple1)
    4. <generator object <genexpr> at 0x0000020BFD031FC0>

    生成器 generator

    生成器 简单来说 就是一个迭代器

    创建生成器的第二种方法 生成器函数

    将函数中return  修改成 yield  就变成一个生成器

    yield 可以将return  后面的表达式返回  并且起到函数的暂停

    写一个函数 函数功能 实现往列表里增加数据 将列表返回

    生成器 generator
    生成器 简单来说  就是一个迭代器
    
    创建生成器的第二种方法  生成器函数
    
    将函数中return  修改成 yield  就变成一个生成器
    yield 可以将return 后面的表达式返回  并且起到函数的暂停
    写一个函数  函数功能 实现往列表里增加数据  将列表返回
    
    1. # 创建生成器:
    2. def func():
    3. list = []
    4. for i in range(1, 11):
    5. list.append(i)
    6. yield list
    7. print(func())
    8. <generator object func at 0x000001AAD0CE1E00>

    生成器 generator

    用函数来实现斐波那契数列 数量传参决定

    yield 起到的是暂停函数重新启动函数

    1. def func(d):
    2. a = 0
    3. b = 1
    4. d = d
    5. for i in range(d):
    6. print("--1--")
    7. a, b = b, a + b
    8. print("--2--")
    9. yield a
    10. print(func(10))
    11. print(list(func(10)))

     用生成器实现多任务 但是是手动调用下一个数据

    1. import time
    2. def func1():
    3. while True:
    4. print("----func1-----")
    5. yield
    6. time.sleep(0.2)
    7. def func2():
    8. while True:
    9. print("----func2----")
    10. yield
    11. time.sleep(0.2)
    12. if __name__ == '__main__':
    13. f1 = func1()
    14. f2 = func2()
    15. while True:
    16. next(f1)
    17. next(f2)

    greenlet 模块
    import greenlet
    greenlet模块  实现多任务  但是是手动调用下一个数据
    1. import time
    2. import greenlet
    3. def func1():
    4. for i in range(20):
    5. print("---func1---")
    6. time.sleep(0.2)
    7. g2.switch()
    8. def func2():
    9. for i in range(20):
    10. print("---func2---")
    11. time.sleep(0.2)
    12. g1.switch()
    13. if __name__ == '__main__':
    14. # 创建协程 用到 greenlet 模块中的greenlet方法
    15. g1 = greenlet.greenlet(func1)
    16. g2 = greenlet.greenlet(func2)
    17. # 启动协程
    18. g1.switch()

    gevent 模块实现多任务
    gevent 模块 不支持其他模块
    在 gevent 模块中实现让时间暂停0.2秒  gevent.slepp(0.2)
    1. import gevent
    2. def func1():
    3. for i in range(10):
    4. print("----func1----")
    5. gevent.sleep(0.2)
    6. def func2():
    7. for i in range(10):
    8. print("---func2----")
    9. gevent.sleep(0.2)
    10. if __name__ == '__main__':
    11. # 创建协程 用gevent 中的spawn方法/
    12. g1 = gevent.spawn(func1)
    13. g2 = gevent.spawn(func2)
    14. # 启动协程
    15. # join() 等待某一个协程执行结束以后再继续往下执行
    16. g1.join()
    17. g2.join()

  • 相关阅读:
    openglES多纹理
    【毕业设计】基于Spark的海量新闻文本聚类(新闻分类)
    电脑基础知识-电脑不认新硬盘时该怎么办?
    Quartz.Net+Microsoft.Extensions.Hosting创建服务
    Prometheus+Grafana 搭建应用监控系统
    react项目实现文件预览,比如PDF、txt、word、Excel、ppt等常见文件(腾讯云cos)
    Perl5和Perl6对比使用Sigils的差别
    BScroll的基本使用
    Android Framework 核心,为何初级开发需要重点学习Framework?
    性能测试分类
  • 原文地址:https://blog.csdn.net/Ben_boba/article/details/128044948