Python生成器:

协程

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

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

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

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

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

list1 = [i for i in range(1, 11)]
print(list1)
print(type(list1))

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

<generator object <genexpr> at 0x0000020BFD031FC0>

生成器 generator

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

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

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

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

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

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

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

将函数中return  修改成 yield  就变成一个生成器
yield 可以将return 后面的表达式返回  并且起到函数的暂停
写一个函数  函数功能 实现往列表里增加数据  将列表返回
# 创建生成器:


def func():
    list = []
    for i in range(1, 11):
        list.append(i)
    yield list


print(func())

<generator object func at 0x000001AAD0CE1E00>

生成器 generator

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

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

def func(d):
    a = 0
    b = 1
    d = d
    for i in range(d):
        print("--1--")
        a, b = b, a + b
        print("--2--")
        yield a


print(func(10))
print(list(func(10)))

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

import time


def func1():
    while True:
        print("----func1-----")
        yield
        time.sleep(0.2)


def func2():
    while True:
        print("----func2----")
        yield
        time.sleep(0.2)


if __name__ == '__main__':
    f1 = func1()
    f2 = func2()
    while True:
        next(f1)
        next(f2)

greenlet 模块
import greenlet
greenlet模块  实现多任务  但是是手动调用下一个数据
import time
import greenlet


def func1():
    for i in range(20):
        print("---func1---")
        time.sleep(0.2)
        g2.switch()


def func2():
    for i in range(20):
        print("---func2---")
        time.sleep(0.2)
        g1.switch()


if __name__ == '__main__':
    # 创建协程  用到  greenlet 模块中的greenlet方法
    g1 = greenlet.greenlet(func1)
    g2 = greenlet.greenlet(func2)
    # 启动协程
    g1.switch()

gevent 模块实现多任务
gevent 模块 不支持其他模块
在 gevent 模块中实现让时间暂停0.2秒  gevent.slepp(0.2)
import gevent


def func1():
    for i in range(10):
        print("----func1----")
        gevent.sleep(0.2)


def func2():
    for i in range(10):
        print("---func2----")
        gevent.sleep(0.2)


if __name__ == '__main__':
    # 创建协程  用gevent 中的spawn方法/
    g1 = gevent.spawn(func1)
    g2 = gevent.spawn(func2)
    # 启动协程
    # join() 等待某一个协程执行结束以后再继续往下执行
    g1.join()
    g2.join()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值