协程:多任务
使用:简单
原理: 过程 - 复杂
内容:1、迭代对象 2、迭代器 3、生成器 4、yield 5、greenlet 6、gevent协程
一、迭代对象
(1.1) 迭代: 迭代版本(在原来的版本之上添加功能) for迭代数据(1,2,3)在原来的状态之下,添加新的功能。
#for循环
#(1) 列表
for i in [11,22,33]:
print(i)
# (2) 整型1234
for i in 1234:
print(i)
# 发生异常: TypeError: 'int' object is not iterable
# 因为for循环放的是int整型,不是可迭代对象。
# 必须是可迭代对象,才不发生异常哦!
(2.2) 使用这两种方式检验是否是可迭代对象
1、使用for循环可以检查是否是一个可迭代对象
2、导包 from collections.abc import Iterable
使用 isinstance() 判断一个对象是否是 Iterable 对象
如果导包from collections import Iterable ,运行时发生异常:
解决必须导入from collections.abc import Iterable
from collections.abc import Iterable
#这个方法参数1:校验的数据,参数2:类型判断,返回类型True就是迭代对象,否则返回False
res_0=isinstance([100,200,300],Iterable)
res_0=isinstance(10022,Iterable)
print(res_0)
说明:被for循环迭代取值的类型 range,list, str, dict,tup...
(2.3)自定义可迭代对象
class Model:
def __init__(self):
'''创建对象-初始化对象'''
self.list_0=[]
def add(self,uname):
'''调用方法,添加数据'''
self.list_0.append(uname)
#实例化对象
model=Model()
model.add('mike')
model.add('john')
model.add('stad')
model.add('bbob')
# (1)可以使用for循环检查
for i in model:
print(i)
说明:发生异常TypeError: 'Model' object is not iterable ;对象不是迭代对象
可以使用isinstance检查,参数(具体对象,Iterable类)
# (2)可以isinstance检查
res_1=isinstance(model,Iterable)
print(res_1)
总之,这样实例化一个对象并不能让他称为可迭代对象!
(2.4)如何创建可迭代对象?
python里面,类里面只需要满足一个条件,即可成为可迭代对象. 拥有此方法__iter__即可。
#自定义可迭代对象
class Model:
def __init__(self):
'''创建对象-初始化对象'''
self.list_0=[]
def add(self,uname):
'''调用方法,添加数据'''
self.list_0.append(uname)
def __iter__(self):
'''魔术方法,可迭代对象条件'''
pass
#实例化对象
model=Model()
model.add('mike')
model.add('john')
model.add('stad')
model.add('bbob')
#(1)可以使用for循环检查
for i in model:
print(i)
说明:发生异常:TypeError: iter() returned non-iterator of type 'NoneType' 意味着已经成为了一个可迭代对象
如果想要一个对象变成可迭代对象,那么首先起码拥有__iter__方法;
(2.5) for循环是怎么迭代取值 可迭代对象的.
迭代器对象满足条件?
(1) 可迭代对象: 拥有 __iter__
(2) 迭代器对象: 拥有 __iter__, 拥有一个__next__
class Model:
def __init__(self):
'''创建对象-初始化对象'''
self.list_0=[]
def add(self,uname):
'''调用方法,添加数据'''
self.list_0.append(uname)
def __iter__(self):
'''魔术方法,可迭代对象条件'''
# 得返回一个迭代器对象
# self代表可迭代对象本身, 把可迭代对象当做参数传到了迭代器对象里面
return ModelIter(self)
# 迭代器对象的类模板
class ModelIter(object):
#初始化参数,并计数,把可迭代参数传入哦
def __init__(self,obj):
self.num_=0
#对象列表=>可迭代对象
self.obj=obj
def __iter__(self):
pass
#处理for循环取值
def __next__(self):
#列表长度是多少,那么方法就会调用几次
if self.num_<len(self.obj.list_0):
# 调用次数小于列表长度就返回数据
name=self.obj.list_0[self.num_]
#索引自增
self.num_+=1
#休眠2秒
time.sleep(.2)
#返回数据
return name
else:
raise StopIteration # 一旦超出索引,,让next方法的调用停止
#实例化对象
model=Model()
model.add('mike')
model.add('john')
model.add('stad')
model.add('bbob')
#(1)可以使用for循环检查
for i in model:
print(i)
(2.6)优化于自定义可迭代对象(迭代器对象的类模板,__iter__,__next__)
import time
#自定义可迭代对象(迭代器对象的类模板,__iter__,__next__)
class Model(object):
def __init__(self):
'''创建对象-初始化对象'''
self.list_0=[] #列表
self.num_=0 #索引值
def add(self,uname):
'''调用方法,添加数据'''
self.list_0.append(uname)
def __iter__(self):
'''魔术方法,可迭代对象条件'''
# 得返回一个迭代器对象
return self
def __next__(self):
# 列表长度是多少,那么方法就会调用几次
if self.num_ < len(self.list_0):
# 调用次数小于列表长度就返回数据
name = self.list_0[self.num_]
# 索引自增
self.num_ += 1
# 休眠2秒
time.sleep(.2)
# 返回数据
return name
else:
raise StopIteration # 一旦超出索引,,让next方法的调用停止
#实例化对象
model=Model()
model.add('mike')
model.add('john')
model.add('stad')
model.add('bbob')
#(1)可以使用for循环检查
for i in model:
print(i)