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

  • 相关阅读:
    每日刷题记录 (四)
    【时间】 时间 加一个月减一个月,加一天减一天,加一年减一年
    Vue | Vue 核心 +
    计算机总线详解(数据总线、地址总线、控制总线)
    如何将dwg文件转成kml文件
    【Nacos】源码之服务端服务注册
    YOLOV5超参数设置与数据增强解析
    MySQL 是什么有什么用处下载和安装教程等值连接数据库基础知识怎么读取增删改短语优化的几种方法
    关系数据库:mysql
    mysql面试题
  • 原文地址:https://blog.csdn.net/Ben_boba/article/details/128044948