• 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()

  • 相关阅读:
    SpringBoot自定义参数解析器HandlerMethodArgumentResolver(解析ip)
    双十二选哪个品牌led灯好一点?国产led灯这些品牌护眼好
    计算机网络的常见面试题
    前端基础之《ECMAScript 6(8)—Promise》
    商场购物中心私域运营 百货公司会员小程序积分商城
    多旋翼无人机仿真 rotors_simulator 是如何悬停的(二)
    [ 常用工具篇 ] 安装 kali 并设置 root 密码
    SMILES:化学结构的线性表示方法
    力扣124. 二叉树中的最大路径和
    go语言 | 图解反射(二)
  • 原文地址:https://blog.csdn.net/Ben_boba/article/details/128044948