协程
创建生成器的第一种方式:生成器的推导式
迭代器本质:底层拥有__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()