协程的引入
要讲协程 先要知道什么是迭代对象 迭代器 以及生成器
迭代对象
迭代: 使用for循环遍历取值的过程就叫做迭代
可迭代对象: 能够使用for循环遍历取值的对象就是可迭代对象
可迭代对象有:元组,列表,字典,字符串,集合,range
判断对象是否是可迭代对象
from collections import Iterable # 导入模块
# 判断对象是否是可迭代对象
result = isinstance((3, 5), Iterable)
print("元组是否是可迭代对象:", result)
result = isinstance([3, 5], Iterable)
print("列表是否是可迭代对象:", result)
result = isinstance({"name": "zs"}, Iterable)
print("字典是否是可迭代对象:", result)
result = isinstance("hello", Iterable)
print("字符串是否是可迭代对象:", result)
result = isinstance({2,45,43}, Iterable)
print("集合是否是可迭代对象:", result)
result = isinstance(range(3), Iterable)
print("range是否是可迭代对象:", result)
result = isinstance(4, Iterable)
print("int对象是否是可迭代对象:", result)
result = isinstance(4, int)
print("int对象是否是int类型:", result)
##结果导出都是True
# 扩展:-以后可以通过isinstance判断函数的参数或者方法的参数是否是指定类型
可迭代对象与迭代器
在类里面提供了__iter__方法创建的对象就是可迭代对象
迭代器对象: 在类里面提供__iter__和__next__的方法创建的对象就是迭代器对象
迭代器的作用: 记录当前数据的位置以后获取下一个位置的值
# iter函数:获取可迭代对象的迭代器, 会调用可迭代对象身上的__iter__方法
# next函数:获取迭代器中下一个值,会调用迭代器对象身上的__next__方法
生成器
生成器: 是一个特殊的迭代器,也就是说生成器依然可以使用next函数和for循环遍历取值
两种生成器的方式:
方式一:
my_generator = (i * 2 for i in range(10))
print(my_generator)
方式二:
使用yield,只要在def里面看到yield表示生成器
应用:
生成器完成斐波那契数列
def fibnacci(num):
# 记录前面两个值
a = 0
b = 1
# 设置下标,记录生成的数据个数
index = 0
# 循环判断条件是否成立
while index < num:
result = a
a, b = b, a + b
# 不要忘记索引每次加上1
index += 1
# 代码执行yield会暂停,把结果返回给外界,再次启动生成器会在暂停的位置继续往下执行
params = yield result
print(params)
fib = fibnacci(5)
# result = next(fib)
# print(result)
#
# # # 调用生成器的send方法
# # 可以根据参数判断是否可以停止迭代,执行return关键字就可以停止
# result = fib.send("ok")
# print(result)
result = fib.send(None)
print(result)
result = fib.send("xxx")
print(result)
# 总结: send可以给生成器传参数,但是第一次启动生成器只能传None,一般第一次启动生成器使用next函数